CMakeLists.txt 12.2 KB
Newer Older
A
Andrey Kamaev 已提交
1 2 3
# ----------------------------------------------------------------------------
#  CMake file for java support
# ----------------------------------------------------------------------------
4
if(NOT ANDROID OR NOT PYTHON_EXECUTABLE OR ANDROID_NATIVE_API_LEVEL LESS 8)
A
Andrey Kamaev 已提交
5 6
  ocv_module_disable(java)
endif()
7

A
Andrey Kamaev 已提交
8
set(the_description "The java bindings")
9 10
ocv_add_module(java BINDINGS opencv_core opencv_imgproc OPTIONAL opencv_objdetect opencv_features2d opencv_video opencv_highgui opencv_ml opencv_calib3d opencv_photo)
ocv_module_include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/cpp")
A
Andrey Kamaev 已提交
11

12
# get list of modules to wrap
13 14 15 16 17 18
string(REPLACE "opencv_" "" OPENCV_JAVA_MODULES "${OPENCV_MODULE_${the_module}_REQ_DEPS};${OPENCV_MODULE_${the_module}_OPT_DEPS}")
foreach(module ${OPENCV_JAVA_MODULES})
  if(NOT HAVE_opencv_${module})
    list(REMOVE_ITEM OPENCV_JAVA_MODULES ${module})
  endif()
endforeach()
A
Andrey Kamaev 已提交
19

20 21 22 23 24
set(GEN_JAVA "${CMAKE_CURRENT_SOURCE_DIR}/gen_java.py")
set(HDR_PARSER "${CMAKE_CURRENT_SOURCE_DIR}/../python/src2/hdr_parser.py")
set(GEN_JAVADOC "${CMAKE_CURRENT_SOURCE_DIR}/gen_javadoc.py")
set(RST_PARSER "${CMAKE_CURRENT_SOURCE_DIR}/rst_parser.py")
set(CHECK_TEST_COVERAGE "${CMAKE_CURRENT_SOURCE_DIR}/check-tests.py")
A
Andrey Kamaev 已提交
25

26 27 28 29 30 31 32 33
# add dependencies to cmake (we should rerun cmake if any of these scripts is modified)
configure_file("${GEN_JAVA}" "${CMAKE_BINARY_DIR}/junk/gen_java.junk" COPYONLY)
configure_file("${HDR_PARSER}" "${CMAKE_BINARY_DIR}/junk/hdr_parser.junk" COPYONLY)

set(java_hdr_deps "")
set(generated_cpp_sources "")
set(generated_java_sources "")

34
# setup raw java and cpp files generation (without javadoc and at temporary location)
A
Andrey Kamaev 已提交
35
foreach(module ${OPENCV_JAVA_MODULES})
36 37
  # get list of module headers
  if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/config/${module}.filelist")
38 39
    file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/config/${module}.filelist" module_headers)
    ocv_list_add_prefix(module_headers "${OPENCV_MODULE_opencv_${module}_LOCATION}/")
40
  else()
41
    set(module_headers "${OPENCV_MODULE_opencv_${module}_HEADERS}")
42 43
  endif()

44 45 46 47 48 49 50 51 52
  # C headers must go first
  set(module_headers_cpp ${module_headers})
  ocv_list_filterout(module_headers_cpp "\\\\.h$")
  if(module_headers_cpp)
    list(REMOVE_ITEM module_headers ${module_headers_cpp})
    list(APPEND module_headers ${module_headers_cpp})
  endif()
  unset(module_headers_cpp)

53
  # add dependencies to cmake (we should rerun cmake if any of these headers is modified)
54
  foreach(header ${module_headers})
55 56 57 58 59
    get_filename_component(header_name "${header}" NAME_WE)
    configure_file("${header}" "${CMAKE_BINARY_DIR}/junk/${header_name}.junk" COPYONLY)
  endforeach()

  # first run (to get list of generated files)
60
  file(REMOVE_RECURSE "${CMAKE_CURRENT_BINARY_DIR}/gen_java_out/")
61
  file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/gen_java_out")
62
  execute_process(COMMAND ${PYTHON_EXECUTABLE} "${GEN_JAVA}" "${HDR_PARSER}" ${module} ${module_headers}
63 64
                  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/gen_java_out"
                  OUTPUT_QUIET ERROR_QUIET)
65 66
  file(GLOB_RECURSE ${module}_generated_java_sources RELATIVE "${CMAKE_CURRENT_BINARY_DIR}/gen_java_out/" "${CMAKE_CURRENT_BINARY_DIR}/gen_java_out/*.java")
  ocv_list_add_prefix(${module}_generated_java_sources "${CMAKE_CURRENT_BINARY_DIR}/")
67

68 69 70 71 72
  # second run (at build time)
  add_custom_command(OUTPUT ${${module}_generated_java_sources} "${CMAKE_CURRENT_BINARY_DIR}/${module}.cpp"
                     COMMAND ${PYTHON_EXECUTABLE} "${GEN_JAVA}" "${HDR_PARSER}" ${module} ${module_headers}
                     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
                     DEPENDS "${GEN_JAVA}" "${HDR_PARSER}" ${module_headers})
73

74 75 76
  list(APPEND java_hdr_deps ${module_headers})
  list(APPEND generated_cpp_sources "${CMAKE_CURRENT_BINARY_DIR}/${module}.cpp")
  list(APPEND generated_java_sources ${${module}_generated_java_sources})
A
Andrey Kamaev 已提交
77 78
endforeach()

79
# get handwritten files used for wrappers generation
80
file(GLOB handwrittren_h_sources "${CMAKE_CURRENT_SOURCE_DIR}/src/cpp/*.h" "${CMAKE_CURRENT_SOURCE_DIR}/src/cpp/*.hpp")
81
file(GLOB handwrittren_cpp_sources "${CMAKE_CURRENT_SOURCE_DIR}/src/cpp/*.cpp")
82 83
file(GLOB handwrittren_java_sources "${CMAKE_CURRENT_SOURCE_DIR}/src/java/*.java")

84
# remove handwritten java files for disabled modules
85 86 87 88 89 90
foreach(jfile ${handwrittren_java_sources})
  string(REGEX REPLACE "^.*/([^+]+)\\+.*\\.java$" "\\1" jmodname "${jfile}")
  if(DEFINED HAVE_opencv_${jmodname} AND NOT HAVE_opencv_${jmodname})
    list(REMOVE_ITEM handwrittren_java_sources "${jfile}")
  endif()
endforeach()
A
Andrey Kamaev 已提交
91

92 93 94 95
# remove VideoCapture wrapper if highgui is disabled
if(NOT HAVE_opencv_highgui)
  list(REMOVE_ITEM handwrittren_cpp_sources "${CMAKE_CURRENT_SOURCE_DIR}/src/cpp/VideoCapture.cpp")
endif()
A
Andrey Kamaev 已提交
96

97 98
# create list of javadoc documented files
unset(documented_java_files)
99
foreach(java_file ${handwrittren_java_sources} ${generated_java_sources})
100
  get_filename_component(java_file_name "${java_file}" NAME_WE)
101
  list(APPEND documented_java_files "${CMAKE_CURRENT_BINARY_DIR}/${java_file_name}-jdoc.java")
102 103 104
endforeach()

# generate javadoc files
105
file(GLOB_RECURSE refman_rst_headers "${CMAKE_CURRENT_SOURCE_DIR}/../*.rst")
106 107 108 109
set(java_documented_headers_deps ${handwrittren_java_sources} ${generated_java_sources} ${java_hdr_deps} ${refman_rst_headers}
  "${GEN_JAVADOC}" "${RST_PARSER}" "${GEN_JAVA}" "${HDR_PARSER}")

#TODO: pass list of modules
110 111 112 113
add_custom_command(
    OUTPUT ${documented_java_files}
    COMMAND ${PYTHON_EXECUTABLE} "${GEN_JAVADOC}" "${CMAKE_CURRENT_SOURCE_DIR}/src/java" "${CMAKE_CURRENT_BINARY_DIR}" 2>"${CMAKE_CURRENT_BINARY_DIR}/get_javadoc_errors.log"
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
114
    DEPENDS ${java_documented_headers_deps}
115 116 117
)

# copy generated java files to the final location
118
set(JAVA_OUTPUT_DIR "src/org/opencv")
119

120 121
# copy each documented header to the final destination
set(java_files "")
122
foreach(java_file ${documented_java_files})
123 124 125
  get_filename_component(java_file_name "${java_file}" NAME)
  string(REPLACE "-jdoc.java" ".java" java_file_name "${java_file_name}")
  string(REPLACE "+" "/" java_file_name "${java_file_name}")
A
Andrey Kamaev 已提交
126

127
  add_custom_command(
128 129
        OUTPUT "${CMAKE_BINARY_DIR}/${JAVA_OUTPUT_DIR}/${java_file_name}"
        COMMAND ${CMAKE_COMMAND} -E copy "${java_file}" "${CMAKE_BINARY_DIR}/${JAVA_OUTPUT_DIR}/${java_file_name}"
130 131
        MAIN_DEPENDENCY "${java_file}"
        DEPENDS ${java_documented_headers_deps}
132
        COMMENT "Generating ${JAVA_OUTPUT_DIR}/${java_file_name}"
133
        )
134
  list(APPEND java_files "${CMAKE_BINARY_DIR}/${JAVA_OUTPUT_DIR}/${java_file_name}")
135

136 137 138 139
  if(ANDROID)
    get_filename_component(install_subdir "${java_file_name}" PATH)
    install(FILES "${CMAKE_BINARY_DIR}/${JAVA_OUTPUT_DIR}/${java_file_name}" DESTINATION ${JAVA_OUTPUT_DIR}/${install_subdir} COMPONENT main)
  endif()
140 141
endforeach()

142
# custom target for java API
143 144
set(api_target ${the_module}_api)
add_custom_target(${api_target} DEPENDS ${java_files} ${documented_java_files} ${java_documented_headers_deps})
145

146
# add opencv_java library
147
add_library(${the_module} SHARED ${handwrittren_h_sources} ${handwrittren_cpp_sources} ${generated_cpp_sources})
148 149 150 151 152 153 154 155 156 157
if(BUILD_FAT_JAVA_LIB)
  set(__deps ${OPENCV_MODULE_${the_module}_DEPS} ${OPENCV_MODULES_BUILD})
  list(REMOVE_ITEM __deps ${the_module})
  ocv_list_unique(__deps)
  set(__extradeps ${__deps})
  ocv_list_filterout(__extradeps "^opencv_")
  if(__extradeps)
    list(REMOVE_ITEM __deps ${__extradeps})
  endif()

158
  target_link_libraries(${the_module} -Wl,-whole-archive ${__deps} -Wl,-no-whole-archive ${__extradeps} ${OPENCV_LINKER_LIBS})
159
else()
160
  target_link_libraries(${the_module} ${OPENCV_MODULE_${the_module}_DEPS} ${OPENCV_LINKER_LIBS})
161
endif()
162
add_dependencies(${the_module} ${api_target})
163

164
# Additional target properties
165 166
set_target_properties(${the_module} PROPERTIES
    OUTPUT_NAME "${the_module}"
167 168 169
    ARCHIVE_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}
    RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}
    INSTALL_NAME_DIR ${OPENCV_LIB_INSTALL_PATH}
170
    LINK_INTERFACE_LIBRARIES ""
171 172
    )

173
install(TARGETS ${the_module} LIBRARY DESTINATION ${OPENCV_LIB_INSTALL_PATH} COMPONENT main)
174

A
Andrey Kamaev 已提交
175
if(ANDROID)
176
  target_link_libraries(${the_module} jnigraphics) # for Mat <=> Bitmap converters
177

178 179 180
  # force strip library after the build command
  # because samples and tests will make a copy of the library before install
  get_target_property(__opencv_java_location ${the_module} LOCATION)
181
  add_custom_command(
182 183
        TARGET ${the_module} POST_BUILD
        COMMAND ${CMAKE_STRIP} --strip-unneeded "${__opencv_java_location}"
184
        )
185

186
  set(lib_proj_files "")
187 188 189 190 191

  # manifest, jni, Eclipse project
  file(GLOB_RECURSE android_lib_project_files RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/android/" "${CMAKE_CURRENT_SOURCE_DIR}/android/*")
  foreach(f ${android_lib_project_files})
    if(NOT f MATCHES "\\.svn")
192
      add_custom_command(
193 194 195 196
                OUTPUT "${CMAKE_BINARY_DIR}/${f}"
                COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/android/${f}" "${CMAKE_BINARY_DIR}/${f}"
                DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/android/${f}"
                COMMENT "Generating ${f}"
197
                )
A
Andrey Kamaev 已提交
198

199 200 201 202
      list(APPEND lib_proj_files "${CMAKE_BINARY_DIR}/${f}")

      if(NOT f MATCHES "jni/.+")
        install(FILES "${CMAKE_BINARY_DIR}/${f}" DESTINATION . COMPONENT main)
203 204 205
      endif()
    endif()
  endforeach()
206

207 208 209 210
  # library project jni sources
  foreach(jni_file ${handwrittren_cpp_sources} ${handwrittren_h_sources} ${generated_cpp_sources})
    get_filename_component(jni_file_name "${jni_file}" NAME)
    add_custom_command(
211 212
            OUTPUT "${CMAKE_BINARY_DIR}/jni/${jni_file_name}"
            COMMAND ${CMAKE_COMMAND} -E copy "${jni_file}" "${CMAKE_BINARY_DIR}/jni/${jni_file_name}"
213
            COMMAND ${CMAKE_COMMAND} -E touch "${CMAKE_BINARY_DIR}/jni/${jni_file_name}"
214
            DEPENDS "${jni_file}" ${java_hdr_deps}
215
            COMMENT "Generating jni/${jni_file_name}"
216 217
            )
    list(APPEND lib_proj_files "${CMAKE_BINARY_DIR}/jni/${jni_file_name}")
218 219
  endforeach()

220
  # create Android library project in build folder
221 222 223 224 225 226 227 228 229 230 231 232 233
  if(ANDROID_EXECUTABLE)
    set(lib_target ${the_module}_android_library)

    set(lib_target_files ${ANDROID_LIB_PROJECT_FILES})
    ocv_list_add_prefix(lib_target_files "${CMAKE_BINARY_DIR}/")

    android_get_compatible_target(lib_target_sdk_target 8)

    add_custom_command(
        OUTPUT ${lib_target_files}
        COMMAND ${CMAKE_COMMAND} -E remove ${lib_target_files}
        COMMAND ${ANDROID_EXECUTABLE} --silent create lib-project --path \"${CMAKE_BINARY_DIR}\" --target \"${lib_target_sdk_target}\" --name OpenCV --package org.opencv 2>\"${CMAKE_CURRENT_BINARY_DIR}/create_lib_project.log\"
        MAIN_DEPENDENCY "${CMAKE_BINARY_DIR}/${ANDROID_MANIFEST_FILE}"
234
        DEPENDS ${lib_proj_files}
235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
        COMMENT "Generating OpenCV Android library project. SDK target: ${lib_target_sdk_target}"
        )
    install(FILES "${CMAKE_BINARY_DIR}/${ANDROID_PROJECT_PROPERTIES_FILE}" DESTINATION . COMPONENT main)

    if(ANT_EXECUTABLE AND ANDROID_TOOLS_Pkg_Revision GREATER 13)
      # build the library project
      # normally we should do this after a native part, but for a library project we can build the java part first
      add_custom_command(
        OUTPUT "${CMAKE_BINARY_DIR}/bin/classes.jar"
        COMMAND ${ANT_EXECUTABLE} -q -noinput -k debug
        WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
        DEPENDS ${lib_proj_files} ${lib_target_files} ${java_files}
        COMMENT "Building OpenCV Android library project"
        )
      install(FILES "${CMAKE_BINARY_DIR}/bin/classes.jar" DESTINATION bin COMPONENT main)
      list(APPEND lib_target_files "${CMAKE_BINARY_DIR}/bin/classes.jar")
    endif()

    add_custom_target(${lib_target}
        SOURCES ${lib_proj_files} ${lib_target_files}
255
        )
256

257 258 259
    add_dependencies(${lib_target} ${api_target})
    add_dependencies(${the_module} ${lib_target})
  endif()
260
endif(ANDROID)
261

262
#android test project
263 264 265
ocv_check_dependencies(${OPENCV_MODULE_${the_module}_OPT_DEPS})
if(BUILD_TESTS AND OCV_DEPENDENCIES_FOUND)
  add_android_project(opencv_test_java "${CMAKE_CURRENT_SOURCE_DIR}/android_test")
266

267 268
  if(PYTHON_EXECUTABLE)
    add_custom_command(
269 270 271
        TARGET opencv_test_java_android_project POST_BUILD
        COMMAND ${PYTHON_EXECUTABLE} ${CHECK_TEST_COVERAGE} "${CMAKE_CURRENT_SOURCE_DIR}/android_test/src" "${CMAKE_BINARY_DIR}/src" > "${CMAKE_CURRENT_BINARY_DIR}/tests_coverage.log"
        )
272
  endif()
273
endif()