CMakeLists.txt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. project(${the_module}_android)
  2. if(ANDROID_EXECUTABLE)
  3. set(OPENCV_JAVA_DIR "${OpenCV_BINARY_DIR}/android_sdk" CACHE INTERNAL "")
  4. else() # gradle
  5. set(OPENCV_JAVA_DIR "${ANDROID_BUILD_BASE_DIR}/opencv" CACHE INTERNAL "")
  6. endif()
  7. set(OPENCV_ANDROID_LIB_DIR "${OPENCV_JAVA_DIR}" CACHE INTERNAL "") # for OpenCV samples
  8. file(REMOVE_RECURSE "${OPENCV_JAVA_DIR}")
  9. file(MAKE_DIRECTORY "${OPENCV_JAVA_DIR}/bin")
  10. set(java_src_dir "${OPENCV_JAVA_DIR}/src")
  11. file(MAKE_DIRECTORY "${java_src_dir}")
  12. ocv_copyfiles_append_dir(JAVA_SRC_COPY "${OPENCV_JAVA_BINDINGS_DIR}/gen/java" "${java_src_dir}")
  13. set(SOURSE_SETS_JNI_LIBS_SRC_DIRS "'native/libs'")
  14. set(SOURSE_SETS_JAVA_SRC_DIRS "'java/src'")
  15. set(SOURSE_SETS_RES_SRC_DIRS "'java/res'")
  16. set(SOURSE_SETS_MANIFEST_SRC_FILE "'java/AndroidManifest.xml'")
  17. set(BUILD_GRADLE_COMPILE_OPTIONS "
  18. android {
  19. buildFeatures {
  20. buildConfig true
  21. }
  22. }
  23. compileOptions {
  24. sourceCompatibility JavaVersion.VERSION_${ANDROID_GRADLE_JAVA_VERSION_INIT}
  25. targetCompatibility JavaVersion.VERSION_${ANDROID_GRADLE_JAVA_VERSION_INIT}
  26. }
  27. ")
  28. set(MAVEN_PUBLISH_PLUGIN_DECLARATION "apply plugin: 'maven-publish'")
  29. set(BUILD_GRADLE_ANDROID_PUBLISHING_CONFIG "
  30. buildFeatures {
  31. prefabPublishing true
  32. buildConfig true
  33. }
  34. prefab {
  35. opencv_jni_shared {
  36. headers 'native/jni/include'
  37. }
  38. }
  39. publishing {
  40. singleVariant('release') {
  41. withSourcesJar()
  42. withJavadocJar()
  43. }
  44. }
  45. ")
  46. set(BUILD_GRADLE_PUBLISHING_CONFIG "
  47. publishing {
  48. publications {
  49. release(MavenPublication) {
  50. groupId = 'org.opencv'
  51. artifactId = 'opencv'
  52. version = '${OPENCV_VERSION_PLAIN}'
  53. afterEvaluate {
  54. from components.release
  55. }
  56. }
  57. }
  58. repositories {
  59. maven {
  60. name = 'myrepo'
  61. url = \"\${project.buildDir}/repo\"
  62. }
  63. }
  64. }
  65. ")
  66. if(ANDROID_EXECUTABLE)
  67. ocv_assert(ANDROID_TOOLS_Pkg_Revision GREATER 13)
  68. ocv_copyfiles_append_dir(JAVA_SRC_COPY "${OPENCV_JAVA_BINDINGS_DIR}/gen/android/java" "${java_src_dir}")
  69. # calc default SDK Target
  70. android_get_compatible_target(ANDROID_SDK_COMPATIBLE_TARGET ${ANDROID_NATIVE_API_LEVEL} ${ANDROID_SDK_TARGET} 14)
  71. if(ANDROID_SDK_COMPATIBLE_TARGET)
  72. set(ANDROID_SDK_COMPATIBLE_TARGET "${ANDROID_SDK_COMPATIBLE_TARGET}" CACHE INTERNAL "")
  73. endif()
  74. string(REGEX REPLACE "android-" "" android_sdk_target_num ${ANDROID_SDK_COMPATIBLE_TARGET})
  75. if( (ANDROID_SDK_TARGET AND ANDROID_SDK_TARGET LESS 21) OR (android_sdk_target_num LESS 21) )
  76. message(STATUS "[OpenCV for Android SDK]: A new OpenGL Camera Bridge (CameraGLSurfaceView, CameraGLRendererBase, CameraRenderer, Camera2Renderer) is disabled, because ANDROID_SDK_TARGET (${android_sdk_target_num}) < 21")
  77. else()
  78. ocv_copyfiles_append_dir(JAVA_SRC_COPY "${OPENCV_JAVA_BINDINGS_DIR}/gen/android-21/java" "${java_src_dir}")
  79. endif()
  80. if( (ANDROID_SDK_TARGET AND ANDROID_SDK_TARGET LESS 24) OR (android_sdk_target_num LESS 24) )
  81. message(STATUS "[OpenCV for Android SDK]: An experiemntal Native Camera is disabled, because ANDROID_SDK_TARGET (${android_sdk_target_num}) < 24")
  82. else()
  83. ocv_copyfiles_append_dir(JAVA_SRC_COPY "${OPENCV_JAVA_BINDINGS_DIR}/gen/android-24/java" "${java_src_dir}")
  84. endif()
  85. # copy boilerplate
  86. file(GLOB_RECURSE seed_project_files_rel RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/android_lib/" "${CMAKE_CURRENT_SOURCE_DIR}/android_lib/*")
  87. list(REMOVE_ITEM seed_project_files_rel "${ANDROID_MANIFEST_FILE}")
  88. foreach(file ${seed_project_files_rel})
  89. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/android_lib/${file}" "${OPENCV_JAVA_DIR}/${file}" @ONLY)
  90. list(APPEND depends "${CMAKE_CURRENT_SOURCE_DIR}/android_lib/${file}")
  91. get_filename_component(install_subdir "${file}" PATH)
  92. install(FILES "${OPENCV_JAVA_DIR}/${file}" DESTINATION "${JAVA_INSTALL_ROOT}/${install_subdir}" COMPONENT java)
  93. endforeach()
  94. list(APPEND depends gen_opencv_java_source "${OPENCV_DEPHELPER}/gen_opencv_java_source")
  95. ocv_copyfiles_add_target(${the_module}_android_source_copy JAVA_SRC_COPY "Copy Java(Android SDK) source files" ${depends})
  96. file(REMOVE "${OPENCV_DEPHELPER}/${the_module}_android_source_copy") # force rebuild after CMake run
  97. set(depends ${the_module}_android_source_copy "${OPENCV_DEPHELPER}/${the_module}_android_source_copy")
  98. # generate Android library project
  99. set(android_sdk_project_files ${ANDROID_LIB_PROJECT_FILES}) # build.xml;local.properties;proguard-project.txt;project.properties
  100. ocv_list_add_prefix(android_sdk_project_files "${OPENCV_JAVA_DIR}/")
  101. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/android_lib/${ANDROID_MANIFEST_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${ANDROID_MANIFEST_FILE}" @ONLY)
  102. add_custom_command(
  103. OUTPUT ${android_sdk_project_files} "${OPENCV_JAVA_DIR}/${ANDROID_MANIFEST_FILE}"
  104. COMMAND ${CMAKE_COMMAND} -E remove ${android_sdk_project_files}
  105. COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_BINARY_DIR}/${ANDROID_MANIFEST_FILE}" "${OPENCV_JAVA_DIR}/${ANDROID_MANIFEST_FILE}"
  106. COMMAND ${ANDROID_EXECUTABLE} --silent create lib-project --path \"${OPENCV_JAVA_DIR}\" --target \"${ANDROID_SDK_COMPATIBLE_TARGET}\" --name OpenCV --package org.opencv 2>\"${CMAKE_CURRENT_BINARY_DIR}/create_lib_project.log\"
  107. COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_BINARY_DIR}/${ANDROID_MANIFEST_FILE}" "${OPENCV_JAVA_DIR}/${ANDROID_MANIFEST_FILE}"
  108. WORKING_DIRECTORY "${OPENCV_JAVA_DIR}"
  109. MAIN_DEPENDENCY "${CMAKE_CURRENT_BINARY_DIR}/${ANDROID_MANIFEST_FILE}"
  110. DEPENDS ${depends}
  111. COMMENT "Generating OpenCV Android library project. SDK target: ${lib_target_sdk_target}"
  112. )
  113. list(APPEND depends ${android_sdk_project_files} "${OPENCV_JAVA_DIR}/${ANDROID_MANIFEST_FILE}")
  114. install(DIRECTORY "${OPENCV_JAVA_DIR}/src" DESTINATION "${JAVA_INSTALL_ROOT}" COMPONENT java)
  115. install(FILES "${OPENCV_JAVA_DIR}/${ANDROID_PROJECT_PROPERTIES_FILE}" DESTINATION ${JAVA_INSTALL_ROOT} COMPONENT java)
  116. install(FILES "${OPENCV_JAVA_DIR}/${ANDROID_MANIFEST_FILE}" DESTINATION ${JAVA_INSTALL_ROOT} COMPONENT java)
  117. # build jar
  118. set(JAR_FILE "${OpenCV_BINARY_DIR}/bin/classes.jar")
  119. # build the library project
  120. # normally we should do this after a native part, but for a library project we can build the java part first
  121. add_custom_command(
  122. OUTPUT "${JAR_FILE}" "${OPENCV_DEPHELPER}/${the_module}_android"
  123. COMMAND ${ANT_EXECUTABLE} -q -noinput -k debug -Djava.target=1.6 -Djava.source=1.6
  124. COMMAND ${CMAKE_COMMAND} -E touch "${OPENCV_DEPHELPER}/${the_module}_android"
  125. WORKING_DIRECTORY "${OPENCV_JAVA_DIR}"
  126. DEPENDS ${depends}
  127. COMMENT "Building OpenCV Android library project"
  128. )
  129. add_custom_target(${the_module}_android DEPENDS "${OPENCV_DEPHELPER}/${the_module}_android" SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/android_lib/${ANDROID_MANIFEST_FILE}")
  130. add_dependencies(${the_module} ${the_module}_android)
  131. # empty 'gen' and 'res' folders
  132. install(CODE "
  133. FILE(MAKE_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${JAVA_INSTALL_ROOT}/gen\")
  134. FILE(MAKE_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${JAVA_INSTALL_ROOT}/res\")
  135. " COMPONENT java)
  136. ocv_update(ANDROID_COMPILE_SDK_VERSION "27")
  137. ocv_update(ANDROID_MIN_SDK_VERSION "14")
  138. if(ANDROID_NATIVE_API_LEVEL GREATER 21)
  139. ocv_update(ANDROID_TARGET_SDK_VERSION "${ANDROID_NATIVE_API_LEVEL}")
  140. else()
  141. ocv_update(ANDROID_TARGET_SDK_VERSION "21")
  142. endif()
  143. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/build.gradle.in" "${CMAKE_CURRENT_BINARY_DIR}/build.gradle" @ONLY)
  144. install(FILES "${CMAKE_CURRENT_BINARY_DIR}/build.gradle" DESTINATION ${JAVA_INSTALL_ROOT}/.. COMPONENT java)
  145. else() # gradle build
  146. #
  147. # Android Gradle-based project
  148. #
  149. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/build.gradle.in" "${ANDROID_TMP_INSTALL_BASE_DIR}/opencv/build.gradle" @ONLY)
  150. #TODO: INSTALL ONLY
  151. ocv_copyfiles_append_dir(JAVA_SRC_COPY "${OPENCV_JAVA_BINDINGS_DIR}/gen/android/java" "${java_src_dir}")
  152. ocv_copyfiles_append_dir(JAVA_SRC_COPY "${OPENCV_JAVA_BINDINGS_DIR}/gen/android-21/java" "${java_src_dir}")
  153. ocv_copyfiles_append_dir(JAVA_SRC_COPY "${OPENCV_JAVA_BINDINGS_DIR}/gen/android-24/java" "${java_src_dir}")
  154. # copy boilerplate
  155. set(SOURSE_SETS_JNI_LIBS_SRC_DIRS "'../../jni'")
  156. set(SOURSE_SETS_JAVA_SRC_DIRS "'src'")
  157. set(SOURSE_SETS_RES_SRC_DIRS "'${OpenCV_SOURCE_DIR}/modules/java/android_sdk/android_gradle_lib/res'")
  158. set(SOURSE_SETS_MANIFEST_SRC_FILE "'AndroidManifest.xml'")
  159. set(MAVEN_PUBLISH_PLUGIN_DECLARATION "")
  160. set(BUILD_GRADLE_ANDROID_PUBLISHING_CONFIG "")
  161. set(BUILD_GRADLE_PUBLISHING_CONFIG "")
  162. set(__base_dir "${CMAKE_CURRENT_SOURCE_DIR}/android_gradle_lib/")
  163. file(GLOB_RECURSE seed_project_files_rel RELATIVE "${__base_dir}/" "${__base_dir}/*")
  164. list(REMOVE_ITEM seed_project_files_rel "${ANDROID_MANIFEST_FILE}")
  165. foreach(file ${seed_project_files_rel})
  166. configure_file("${__base_dir}/${file}" "${OPENCV_JAVA_DIR}/${file}" @ONLY)
  167. list(APPEND depends "${__base_dir}/${file}")
  168. get_filename_component(install_subdir "${file}" PATH)
  169. if(NOT file STREQUAL "build.gradle")
  170. install(FILES "${OPENCV_JAVA_DIR}/${file}" DESTINATION "${JAVA_INSTALL_ROOT}/${install_subdir}" COMPONENT java)
  171. endif()
  172. endforeach()
  173. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/build.gradle.in" "${OPENCV_JAVA_DIR}/build.gradle" @ONLY)
  174. # copy libcxx_helper
  175. set(__base_dir "${CMAKE_CURRENT_SOURCE_DIR}/")
  176. file(GLOB_RECURSE __files_rel RELATIVE "${__base_dir}/" "${__base_dir}/libcxx_helper/*")
  177. foreach(file ${__files_rel})
  178. configure_file("${__base_dir}/${file}" "${OPENCV_JAVA_DIR}/${file}" @ONLY)
  179. list(APPEND depends "${__base_dir}/${file}")
  180. get_filename_component(install_subdir "${file}" PATH)
  181. install(FILES "${OPENCV_JAVA_DIR}/${file}" DESTINATION "${JAVA_INSTALL_ROOT}/../${install_subdir}" COMPONENT java)
  182. endforeach()
  183. list(APPEND depends gen_opencv_java_source "${OPENCV_DEPHELPER}/gen_opencv_java_source")
  184. ocv_copyfiles_add_target(${the_module}_android_source_copy JAVA_SRC_COPY "Copy Java(Android SDK) source files" ${depends})
  185. file(REMOVE "${OPENCV_DEPHELPER}/${the_module}_android_source_copy") # force rebuild after CMake run
  186. set(depends ${the_module}_android_source_copy "${OPENCV_DEPHELPER}/${the_module}_android_source_copy")
  187. # build jar
  188. set(AAR_FILE "${OPENCV_JAVA_DIR}/build/outputs/aar/opencv-release.aar")
  189. add_custom_command(
  190. OUTPUT "${AAR_FILE}" "${OPENCV_DEPHELPER}/${the_module}_android"
  191. COMMAND ./gradlew ${OPENCV_GRADLE_VERBOSE_OPTIONS} "opencv:assemble"
  192. COMMAND ${CMAKE_COMMAND} -E touch "${OPENCV_DEPHELPER}/${the_module}_android"
  193. WORKING_DIRECTORY "${ANDROID_BUILD_BASE_DIR}"
  194. DEPENDS ${depends} ${the_module}
  195. COMMENT "Building OpenCV Android library project"
  196. )
  197. file(REMOVE "${OPENCV_DEPHELPER}/${the_module}_android") # force rebuild after CMake run
  198. add_custom_target(${the_module}_android ALL DEPENDS "${OPENCV_DEPHELPER}/${the_module}_android" SOURCES "${__base_dir}/${ANDROID_MANIFEST_FILE}")
  199. install(FILES "${ANDROID_TMP_INSTALL_BASE_DIR}/opencv/build.gradle" DESTINATION ${JAVA_INSTALL_ROOT}/.. COMPONENT java)
  200. install(DIRECTORY "${java_src_dir}" DESTINATION "${JAVA_INSTALL_ROOT}" COMPONENT java)
  201. endif() # gradle build