CMakeLists.txt 10.9 KB
Newer Older
A
Andrey Kamaev 已提交
1 2 3 4 5
# ----------------------------------------------------------------------------
#  CMake file for java support
# ----------------------------------------------------------------------------
project(opencv_java)

A
Andrey Pavlenko 已提交
6 7
SET(OPENCV_JAVA_MODULES objdetect features2d imgproc video highgui ml core calib3d)
SET(OPENCV_EXTRA_JAVA_MODULES contrib legacy flann)
8
IF(WITH_ANDROID_CAMERA AND NOT BUILD_SHARED_LIBS)
A
Andrey Kamaev 已提交
9 10 11 12 13
    LIST(APPEND OPENCV_EXTRA_JAVA_MODULES androidcamera)
ENDIF()

SET(GEN_JAVA "${CMAKE_CURRENT_SOURCE_DIR}/gen_java.py")
SET(HDR_PARSER "${CMAKE_CURRENT_SOURCE_DIR}/../python/src2/hdr_parser.py")
14 15
SET(GEN_JAVADOC "${CMAKE_CURRENT_SOURCE_DIR}/gen_javadoc.py")
SET(RST_PARSER "${CMAKE_CURRENT_SOURCE_DIR}/rst_parser.py")
A
Andrey Kamaev 已提交
16

17 18
SET(additional_clean_files "")

19 20 21 22 23 24 25
macro(cleanup)
    file(GLOB files_to_clean "${CMAKE_CURRENT_BINARY_DIR}/*.java" "${CMAKE_CURRENT_BINARY_DIR}/*.cpp" "${CMAKE_CURRENT_BINARY_DIR}/*.h" "${CMAKE_CURRENT_BINARY_DIR}/*.txt" "${CMAKE_CURRENT_BINARY_DIR}/*.log")
    if(files_to_clean)
        file(REMOVE ${files_to_clean})
    endif()
endmacro()

26 27 28 29 30 31 32
macro(capitalize name outputvar)
    string(SUBSTRING "${name}" 0 1 first_letter)
    string(SUBSTRING "${name}" 1 -1 tail_letters)
    string(TOUPPER "${first_letter}" first_letter)
    SET(${outputvar} "${first_letter}${tail_letters}")
endmacro()

33 34
# cleanup required to correct process situations when some class is removed from exports
cleanup()
35

36
# setup raw java and cpp files generation (without javadoc and at temporary location)
A
Andrey Kamaev 已提交
37
foreach(module ${OPENCV_JAVA_MODULES})
38 39
    IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/config/${module}.filelist")
        FILE(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/config/${module}.filelist" headers_to_parse)
A
Andrey Kamaev 已提交
40
        SET (module_cheaders "")
41 42 43 44
        SET (module_cppheaders "")
        foreach(header ${headers_to_parse})
            list(APPEND module_cppheaders "${CMAKE_CURRENT_SOURCE_DIR}/../${module}/${header}")
        endforeach()
A
Andrey Kamaev 已提交
45 46 47
    ELSE()
        FILE(GLOB module_cheaders "${CMAKE_CURRENT_SOURCE_DIR}/../${module}/include/opencv2/${module}/*.h")
        FILE(GLOB module_cppheaders "${CMAKE_CURRENT_SOURCE_DIR}/../${module}/include/opencv2/${module}/*.hpp")
48 49
        list(SORT module_cheaders)
        list(SORT module_cppheaders)
A
Andrey Kamaev 已提交
50 51
    ENDIF()

52
    # first run
53 54 55 56
    execute_process(COMMAND ${PYTHON_EXECUTABLE} "${GEN_JAVA}" "${HDR_PARSER}" ${module} ${module_cheaders} ${module_cppheaders}
                  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
                  OUTPUT_QUIET ERROR_QUIET)

57 58 59 60 61 62
    # add dependencies to cmake
    foreach(header ${module_cheaders} ${module_cppheaders})
        get_filename_component(header_name "${header}" NAME_WE)
        configure_file("${header}" "${CMAKE_BINARY_DIR}/junk/${header_name}.junk" COPYONLY)
    endforeach()

63 64
    FILE(GLOB ${module}_generated_java_sources "${CMAKE_CURRENT_BINARY_DIR}/${module}+*.java")

65
    # second run
A
Andrey Kamaev 已提交
66
    add_custom_command(
67
        OUTPUT ${${module}_generated_java_sources}
68
        OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${module}.cpp"
A
Andrey Kamaev 已提交
69
        COMMAND ${PYTHON_EXECUTABLE} "${GEN_JAVA}" "${HDR_PARSER}" ${module} ${module_cheaders} ${module_cppheaders}
A
Andrey Kamaev 已提交
70
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
71 72
        DEPENDS "${GEN_JAVA}"
        DEPENDS "${HDR_PARSER}"
A
Andrey Kamaev 已提交
73 74 75
        )
endforeach()

76 77
cleanup()

78
set(target opencv_java)
79
include_directories("${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/src/cpp")
A
Andrey Kamaev 已提交
80 81 82 83 84 85

SET (generated_cpp_sources "")
SET (generated_java_sources "")
SET (dependent_libs "")
SET (dependent_extra_libs "")

86
# summarize all sources for Java API
A
Andrey Kamaev 已提交
87 88
foreach(module ${OPENCV_JAVA_MODULES})
    LIST(APPEND generated_cpp_sources "${CMAKE_CURRENT_BINARY_DIR}/${module}.cpp")
89
    LIST(APPEND generated_java_sources ${${module}_generated_java_sources})
A
Andrey Kamaev 已提交
90 91 92 93
    LIST(APPEND dependent_libs opencv_${module})
    include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../${module}/include")
endforeach()

94
# set libopencv_java.so shared library includes and dependencies
A
Andrey Kamaev 已提交
95 96 97 98 99
foreach(module ${OPENCV_EXTRA_JAVA_MODULES})
    LIST(APPEND dependent_extra_libs opencv_${module})
    include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../${module}/include")
endforeach()

100
FILE(GLOB handwrittren_cpp_sources "${CMAKE_CURRENT_SOURCE_DIR}/src/cpp/*.cpp")
101
FILE(GLOB handwrittren_h_sources "${CMAKE_CURRENT_SOURCE_DIR}/src/cpp/*.h*")
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
FILE(GLOB handwrittren_java_sources "${CMAKE_CURRENT_SOURCE_DIR}/src/java/*.java")

# created list of documented files targets
SET(documented_java_files)
SET(undocumented_java_files)
foreach(java_file ${handwrittren_java_sources} ${generated_java_sources})
    get_filename_component(java_file_name "${java_file}" NAME_WE)
    if (NOT java_file_name MATCHES ".*-jdoc$")
        list(APPEND documented_java_files "${CMAKE_CURRENT_BINARY_DIR}/${java_file_name}-jdoc.java")
        list(APPEND undocumented_java_files "${java_file}")
    endif()
endforeach()

# generate javadoc files
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}
    DEPENDS ${handwrittren_java_sources}
    DEPENDS ${undocumented_java_files}
    DEPENDS "${GEN_JAVADOC}"
    DEPENDS "${RST_PARSER}"
)

# copy generated java files to the final location
SET(JAVA_OUTPUT_DIR "${CMAKE_BINARY_DIR}/src/org/opencv")

set(java_files)
foreach(java_file ${documented_java_files})
    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 已提交
134

135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
    add_custom_command(
        OUTPUT "${JAVA_OUTPUT_DIR}/${java_file_name}"
        COMMAND ${CMAKE_COMMAND} -E copy "${java_file}" "${JAVA_OUTPUT_DIR}/${java_file_name}"
        DEPENDS "${java_file}"
        DEPENDS "${JAVA_OUTPUT_DIR}"
        COMMENT "Generating src/org/opencv/${java_file_name}"
        )
    list(APPEND java_files "${JAVA_OUTPUT_DIR}/${java_file_name}")
    if(ANDROID)
        get_filename_component(install_dir "${java_file_name}" PATH)
        install(FILES "${JAVA_OUTPUT_DIR}/${java_file_name}" DESTINATION src/org/opencv/${install_dir} COMPONENT main)
    endif()
endforeach()

# setup dependencies
SET(dependency_file "${CMAKE_CURRENT_BINARY_DIR}/dependencies.cpp")
add_custom_command(
    OUTPUT "${dependency_file}"
    COMMAND ${CMAKE_COMMAND} -E touch "${dependency_file}"
)
SET_SOURCE_FILES_PROPERTIES(${java_files} PROPERTIES HEADER_FILE_ONLY TRUE)
SET(opencv_java_dependency_files "${java_files}")

# add opencv_java project
add_library(${target} SHARED ${handwrittren_h_sources} ${handwrittren_cpp_sources} ${generated_cpp_sources} ${dependency_file})
A
Andrey Kamaev 已提交
160
target_link_libraries(${target} ${dependent_libs} ${dependent_extra_libs} ${OPENCV_LINKER_LIBS})
161 162
add_dependencies(${target} "${GEN_JAVA}" "${HDR_PARSER}")
add_dependencies(${target} ${dependent_extra_libs} ${dependent_libs})
163

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

install(TARGETS ${target} LIBRARY DESTINATION ${OPENCV_LIB_INSTALL_PATH} COMPONENT main)


A
Andrey Kamaev 已提交
175 176
if(ANDROID)
    target_link_libraries(${target} jnigraphics)
177

178
    # force strip library after build command
179 180 181 182 183 184
    # because samples and tests will make a copy of library before install
    ADD_CUSTOM_COMMAND(
        TARGET ${target}
        POST_BUILD
        COMMAND ${CMAKE_STRIP} "${LIBRARY_OUTPUT_PATH}/lib${target}.so"
        )
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214

    # create Android library project in build folder
    add_custom_command(
        TARGET ${target} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/res"
        COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/gen"
        )

    # library project blank
    file(GLOB_RECURSE android_lib_project_files "${CMAKE_CURRENT_SOURCE_DIR}/android/*")
    foreach(file ${android_lib_project_files})
        if(NOT file MATCHES "\\.svn")
            file(RELATIVE_PATH file_rel "${CMAKE_CURRENT_SOURCE_DIR}/android/" "${file}")
            add_custom_command(
                OUTPUT "${CMAKE_BINARY_DIR}/${file_rel}"
                COMMAND ${CMAKE_COMMAND} -E copy "${file}" "${CMAKE_BINARY_DIR}/${file_rel}"
                DEPENDS "${file}"
                COMMENT "Generating ${file_rel}"
                )
            SET_SOURCE_FILES_PROPERTIES("${CMAKE_BINARY_DIR}/${file_rel}" PROPERTIES HEADER_FILE_ONLY TRUE)
            list(APPEND opencv_java_dependency_files "${CMAKE_BINARY_DIR}/${file_rel}")
        endif()
    endforeach()

    # 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(
            OUTPUT "${CMAKE_BINARY_DIR}/jni/${jni_file_name}"
            COMMAND ${CMAKE_COMMAND} -E copy "${jni_file}" "${CMAKE_BINARY_DIR}/jni/${jni_file_name}"
215
            COMMAND ${CMAKE_COMMAND} -E touch "${CMAKE_BINARY_DIR}/jni/${jni_file_name}"
216 217 218 219 220 221
            DEPENDS "${jni_file}"
            COMMENT "Generating jni/${jni_file_name}"
        )
        SET_SOURCE_FILES_PROPERTIES("${CMAKE_BINARY_DIR}/jni/${jni_file_name}" PROPERTIES HEADER_FILE_ONLY TRUE)
        list(APPEND opencv_java_dependency_files "${CMAKE_BINARY_DIR}/jni/${jni_file_name}")
    endforeach()
A
Andrey Kamaev 已提交
222 223
endif()

224 225
# apply dependencies
SET_SOURCE_FILES_PROPERTIES("${dependency_file}" PROPERTIES OBJECT_DEPENDS "${opencv_java_dependency_files}")
A
Andrey Kamaev 已提交
226

227 228
#android test project
if(ANDROID AND BUILD_TESTS AND CAN_BUILD_ANDROID_PROJECTS)
229 230 231 232 233
    file(COPY android_test DESTINATION "${CMAKE_CURRENT_BINARY_DIR}"
        PATTERN ".svn" EXCLUDE
        PATTERN "gen" EXCLUDE
        PATTERN "bin" EXCLUDE
        )
234 235 236 237
    SET(test_dir "${CMAKE_CURRENT_BINARY_DIR}/android_test")
    
    SET(test_name opencv_test_java)
    SET(test_target ${test_name}_android)
238 239

    add_custom_target(${test_target} ALL)
240
    add_dependencies(${test_target} opencv_java)
241 242 243 244 245 246 247 248

    file(RELATIVE_PATH OPENCV_REFERENCE_PATH "${test_dir}" "${CMAKE_BINARY_DIR}")

    add_custom_command(
        TARGET ${test_target}
        WORKING_DIRECTORY ${test_dir}
        COMMAND ${CMAKE_COMMAND} -E remove -f "${test_dir}/default.properties"
        COMMAND ${CMAKE_COMMAND} -E touch "${test_dir}/default.properties"
249
        COMMAND ${ANDROID_EXECUTABLE} update project --name "${test_name}" --target "${ANDROID_SDK_TARGET}" --library "${OPENCV_REFERENCE_PATH}" --path .
250
        COMMAND ${ANT_EXECUTABLE} debug
251
        COMMAND ${CMAKE_COMMAND} -E copy "${test_dir}/bin/${test_name}-debug.apk" "${CMAKE_BINARY_DIR}/bin/${test_name}.apk"
252 253
        )

254
    LIST(APPEND additional_clean_files "${CMAKE_BINARY_DIR}/bin/${test_name}.apk" "${test_dir}/build.xml" "${test_dir}/local.properties" "${test_dir}/proguard.cfg")
255 256
endif()

257
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${additional_clean_files}")