Skip to content

Commit 87a98e4

Browse files
committed
cmake: CMP0026 NEW
1 parent e63d3dd commit 87a98e4

File tree

9 files changed

+158
-66
lines changed

9 files changed

+158
-66
lines changed

CMakeLists.txt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,7 @@ if(WINRT)
7878
endif()
7979

8080
if(POLICY CMP0026)
81-
# silence cmake 3.0+ warnings about reading LOCATION attribute
82-
cmake_policy(SET CMP0026 OLD)
81+
cmake_policy(SET CMP0026 NEW)
8382
endif()
8483

8584
if(POLICY CMP0042)
@@ -1368,7 +1367,7 @@ if(HAVE_OPENCL)
13681367
set(__libs "")
13691368
foreach(l ${OPENCL_LIBRARIES})
13701369
if(TARGET ${l})
1371-
get_target_property(p ${l} LOCATION)
1370+
get_target_property(p ${l} IMPORTED_LOCATION)
13721371
if(p MATCHES NOTFOUND)
13731372
list(APPEND __libs "${l}")
13741373
else()

cmake/OpenCVDetectAndroidSDK.cmake

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,9 +297,8 @@ macro(add_android_project target path)
297297
LIBRARY_OUTPUT_DIRECTORY "${android_proj_bin_dir}/libs/${ANDROID_NDK_ABI_NAME}"
298298
)
299299

300-
get_target_property(android_proj_jni_location "${JNI_LIB_NAME}" LOCATION)
301300
if (NOT (CMAKE_BUILD_TYPE MATCHES "debug"))
302-
add_custom_command(TARGET ${JNI_LIB_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "${android_proj_jni_location}")
301+
add_custom_command(TARGET ${JNI_LIB_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "$<TARGET_FILE:${JNI_LIB_NAME}>")
303302
endif()
304303
endif()
305304
endif()

cmake/OpenCVGenABI.cmake

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,17 @@ set(OPENCV_ABI_SKIP_HEADERS "")
2626
set(OPENCV_ABI_SKIP_LIBRARIES "")
2727
foreach(mod ${OPENCV_MODULES_BUILD})
2828
string(REGEX REPLACE "^opencv_" "" mod "${mod}")
29-
if(NOT "${OPENCV_MODULE_opencv_${mod}_LOCATION}" STREQUAL "${OpenCV_SOURCE_DIR}/modules/${mod}")
29+
if(NOT OPENCV_MODULE_opencv_${mod}_CLASS STREQUAL "PUBLIC"
30+
OR NOT "${OPENCV_MODULE_opencv_${mod}_LOCATION}" STREQUAL "${OpenCV_SOURCE_DIR}/modules/${mod}" # opencv_contrib
31+
)
3032
# headers
3133
foreach(h ${OPENCV_MODULE_opencv_${mod}_HEADERS})
3234
file(RELATIVE_PATH h "${OPENCV_MODULE_opencv_${mod}_LOCATION}/include" "${h}")
3335
list(APPEND OPENCV_ABI_SKIP_HEADERS "${h}")
3436
endforeach()
3537
# libraries
3638
if(TARGET opencv_${mod}) # opencv_world
37-
set(lib_name "")
38-
get_target_property(lib_name opencv_${mod} LOCATION)
39-
get_filename_component(lib_name "${lib_name}" NAME)
40-
list(APPEND OPENCV_ABI_SKIP_LIBRARIES "${lib_name}")
39+
list(APPEND OPENCV_ABI_SKIP_LIBRARIES "\$<TARGET_FILE_NAME:opencv_${mod}>")
4140
endif()
4241
endif()
4342
endforeach()
@@ -48,4 +47,5 @@ string(REPLACE ";" "\n " OPENCV_ABI_SKIP_LIBRARIES "${OPENCV_ABI_SKIP_LIBRARI
4847
set(OPENCV_ABI_GCC_OPTIONS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} -DOPENCV_ABI_CHECK=1")
4948
string(REGEX REPLACE "([^ ]) +([^ ])" "\\1\\n \\2" OPENCV_ABI_GCC_OPTIONS "${OPENCV_ABI_GCC_OPTIONS}")
5049

51-
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/opencv_abi.xml.in" "${path1}")
50+
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/opencv_abi.xml.in" "${path1}.base")
51+
file(GENERATE OUTPUT "${path1}" INPUT "${path1}.base")

cmake/OpenCVGenAndroidMK.cmake

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,29 @@ if(ANDROID)
2020
endif()
2121

2222
# build the list of opencv libs and dependencies for all modules
23-
ocv_get_all_libs(OPENCV_MODULES_CONFIGMAKE OPENCV_EXTRA_COMPONENTS_CONFIGMAKE OPENCV_3RDPARTY_COMPONENTS_CONFIGMAKE)
23+
ocv_get_all_libs(OPENCV_MODULES OPENCV_EXTRA_COMPONENTS OPENCV_3RDPARTY_COMPONENTS)
2424

2525
# list -> string
26-
string(REPLACE ";" " " OPENCV_MODULES_CONFIGMAKE "${OPENCV_MODULES_CONFIGMAKE}")
27-
string(REPLACE ";" " " OPENCV_EXTRA_COMPONENTS_CONFIGMAKE "${OPENCV_EXTRA_COMPONENTS_CONFIGMAKE}")
28-
string(REPLACE ";" " " OPENCV_3RDPARTY_COMPONENTS_CONFIGMAKE "${OPENCV_3RDPARTY_COMPONENTS_CONFIGMAKE}")
26+
foreach(_var OPENCV_MODULES OPENCV_EXTRA_COMPONENTS OPENCV_3RDPARTY_COMPONENTS)
27+
set(var "${_var}_CONFIGMAKE")
28+
set(${var} "")
29+
foreach(lib ${${_var}})
30+
set(lib_name "${lib}")
31+
if(TARGET ${lib})
32+
get_target_property(_output ${lib} IMPORTED_LOCATION)
33+
if(NOT _output)
34+
get_target_property(output_name ${lib} OUTPUT_NAME)
35+
if(output_name)
36+
set(lib_name "${output_name}")
37+
endif()
38+
else()
39+
ocv_get_libname(lib_name "${_output}")
40+
endif()
41+
endif()
42+
set(${var} "${${var}} ${lib_name}")
43+
endforeach()
44+
string(STRIP "${${var}}" ${var})
45+
endforeach()
2946

3047
# replace 'opencv_<module>' -> '<module>''
3148
string(REPLACE "opencv_" "" OPENCV_MODULES_CONFIGMAKE "${OPENCV_MODULES_CONFIGMAKE}")

cmake/OpenCVGenPkgconfig.cmake

Lines changed: 76 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
if(MSVC OR IOS)
2+
return()
3+
endif()
4+
15
# --------------------------------------------------------------------------------------------
26
# according to man pkg-config
37
# The package name specified on the pkg-config command line is defined to
@@ -12,11 +16,11 @@
1216
macro(fix_prefix lst isown)
1317
set(_lst)
1418
foreach(item ${${lst}})
15-
if(TARGET ${item})
16-
get_target_property(item "${item}" LOCATION_${CMAKE_BUILD_TYPE})
17-
if("${isown}")
18-
get_filename_component(item "${item}" NAME_WE)
19-
string(REGEX REPLACE "^lib(.*)" "\\1" item "${item}")
19+
if(DEFINED TARGET_LOCATION_${item})
20+
set(item "${TARGET_LOCATION_${item}}")
21+
if(${isown})
22+
get_filename_component(item "${item}" NAME)
23+
ocv_get_libname(item "${item}")
2024
endif()
2125
endif()
2226
if(item MATCHES "^-l")
@@ -25,8 +29,8 @@ macro(fix_prefix lst isown)
2529
list(APPEND _lst "${item}")
2630
elseif(item MATCHES "[\\/]")
2731
get_filename_component(libdir "${item}" PATH)
28-
get_filename_component(libname "${item}" NAME_WE)
29-
string(REGEX REPLACE "^lib(.*)" "\\1" libname "${libname}")
32+
get_filename_component(_libname "${item}" NAME)
33+
ocv_get_libname(libname "${_libname}")
3034
list(APPEND _lst "-L${libdir}" "-l${libname}")
3135
else()
3236
list(APPEND _lst "-l${item}")
@@ -36,6 +40,14 @@ macro(fix_prefix lst isown)
3640
unset(_lst)
3741
endmacro()
3842

43+
if(NOT DEFINED CMAKE_HELPER_SCRIPT)
44+
45+
if(INSTALL_TO_MANGLED_PATHS)
46+
set(OPENCV_PC_FILE_NAME "opencv-${OPENCV_VERSION}.pc")
47+
else()
48+
set(OPENCV_PC_FILE_NAME opencv.pc)
49+
endif()
50+
3951
# build the list of opencv libs and dependencies for all modules
4052
ocv_get_all_libs(_modules _extra _3rdparty)
4153

@@ -56,9 +68,61 @@ if(_modules MATCHES "opencv_contrib_world")
5668
list(INSERT _modules 0 "opencv_contrib_world")
5769
endif()
5870

59-
fix_prefix(_modules TRUE)
60-
fix_prefix(_extra FALSE)
61-
fix_prefix(_3rdparty TRUE)
71+
set(HELPER_SCRIPT "")
72+
ocv_cmake_script_append_var(HELPER_SCRIPT
73+
BUILD_SHARED_LIBS
74+
CMAKE_BINARY_DIR
75+
CMAKE_INSTALL_PREFIX
76+
OpenCV_SOURCE_DIR
77+
OPENCV_PC_FILE_NAME
78+
OPENCV_VERSION_PLAIN
79+
OPENCV_LIB_INSTALL_PATH
80+
OPENCV_INCLUDE_INSTALL_PATH
81+
OPENCV_3P_LIB_INSTALL_PATH
82+
83+
_modules
84+
_extra
85+
_3rdparty
86+
)
87+
88+
foreach(item ${_modules} ${_extra} ${_3rdparty})
89+
if(TARGET ${item})
90+
set(HELPER_SCRIPT "${HELPER_SCRIPT}
91+
set(TARGET_LOCATION_${item} \"$<TARGET_FILE:${item}>\")
92+
")
93+
endif()
94+
endforeach()
95+
96+
set(CMAKE_HELPER_SCRIPT "${CMAKE_BINARY_DIR}/OpenCVGenPkgConfig.info.cmake")
97+
file(GENERATE OUTPUT "${CMAKE_HELPER_SCRIPT}" CONTENT "${HELPER_SCRIPT}")
98+
99+
add_custom_target(developer_scripts)
100+
add_custom_command(
101+
OUTPUT "${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME}"
102+
COMMAND ${CMAKE_COMMAND} "-DCMAKE_HELPER_SCRIPT=${CMAKE_HELPER_SCRIPT}" -P "${OpenCV_SOURCE_DIR}/cmake/OpenCVGenPkgconfig.cmake"
103+
DEPENDS "${CMAKE_BINARY_DIR}/OpenCVGenPkgConfig.info.cmake"
104+
"${OpenCV_SOURCE_DIR}/cmake/OpenCVGenPkgconfig.cmake"
105+
COMMENT "Generate ${OPENCV_PC_FILE_NAME}"
106+
)
107+
add_custom_target(gen-pkgconfig ALL SOURCES "${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME}")
108+
add_dependencies(developer_scripts gen-pkgconfig)
109+
110+
111+
if(UNIX AND NOT ANDROID)
112+
install(FILES ${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME} DESTINATION ${OPENCV_LIB_INSTALL_PATH}/pkgconfig COMPONENT dev)
113+
endif()
114+
115+
# =============================================================================
116+
else() # DEFINED CMAKE_HELPER_SCRIPT
117+
118+
cmake_minimum_required(VERSION 2.8.12.2)
119+
cmake_policy(SET CMP0012 NEW)
120+
include("${CMAKE_HELPER_SCRIPT}")
121+
include("${OpenCV_SOURCE_DIR}/cmake/OpenCVUtils.cmake")
122+
123+
fix_prefix(_modules 1)
124+
fix_prefix(_extra 0)
125+
fix_prefix(_3rdparty 1)
62126

63127
ocv_list_unique(_modules)
64128
ocv_list_unique(_extra)
@@ -68,7 +132,7 @@ set(OPENCV_PC_LIBS
68132
"-L\${exec_prefix}/${OPENCV_LIB_INSTALL_PATH}"
69133
"${_modules}"
70134
)
71-
if (BUILD_SHARED_LIBS)
135+
if(BUILD_SHARED_LIBS)
72136
set(OPENCV_PC_LIBS_PRIVATE "${_extra}")
73137
else()
74138
set(OPENCV_PC_LIBS_PRIVATE
@@ -86,15 +150,8 @@ set(exec_prefix "\${prefix}")
86150
set(libdir "\${exec_prefix}/${OPENCV_LIB_INSTALL_PATH}")
87151
set(includedir "\${prefix}/${OPENCV_INCLUDE_INSTALL_PATH}")
88152

89-
if(INSTALL_TO_MANGLED_PATHS)
90-
set(OPENCV_PC_FILE_NAME "opencv-${OPENCV_VERSION}.pc")
91-
else()
92-
set(OPENCV_PC_FILE_NAME opencv.pc)
93-
endif()
94153
configure_file("${OpenCV_SOURCE_DIR}/cmake/templates/opencv-XXX.pc.in"
95154
"${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME}"
96155
@ONLY)
97156

98-
if(UNIX AND NOT ANDROID)
99-
install(FILES ${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME} DESTINATION ${OPENCV_LIB_INSTALL_PATH}/pkgconfig COMPONENT dev)
100-
endif()
157+
endif() # DEFINED CMAKE_HELPER_SCRIPT

cmake/OpenCVUtils.cmake

Lines changed: 50 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@ macro(CHECK_MODULE module_name define cv_module)
517517
endif()
518518
endmacro()
519519

520+
if(NOT DEFINED CMAKE_ARGC) # Guard CMake standalone invocations
520521

521522
set(OPENCV_BUILD_INFO_FILE "${CMAKE_BINARY_DIR}/version_string.tmp")
522523
file(REMOVE "${OPENCV_BUILD_INFO_FILE}")
@@ -597,6 +598,7 @@ function(status text)
597598
endif()
598599
endfunction()
599600

601+
endif() # NOT DEFINED CMAKE_ARGC
600602

601603
# remove all matching elements from the list
602604
macro(ocv_list_filterout lst regex)
@@ -689,8 +691,8 @@ endmacro()
689691
function(ocv_convert_to_lib_name var)
690692
set(tmp "")
691693
foreach(path ${ARGN})
692-
get_filename_component(tmp_name "${path}" NAME_WE)
693-
string(REGEX REPLACE "^lib" "" tmp_name "${tmp_name}")
694+
get_filename_component(tmp_name "${path}" NAME)
695+
ocv_get_libname(tmp_name "${tmp_name}")
694696
list(APPEND tmp "${tmp_name}")
695697
endforeach()
696698
set(${var} ${tmp} PARENT_SCOPE)
@@ -899,32 +901,42 @@ function(ocv_source_group group)
899901
endif()
900902
endfunction()
901903

902-
function(ocv_target_link_libraries target)
903-
_ocv_fix_target(target)
904-
set(LINK_DEPS ${ARGN})
905-
# process world
906-
if(BUILD_opencv_world)
907-
foreach(m ${OPENCV_MODULES_BUILD})
908-
if(OPENCV_MODULE_${m}_IS_PART_OF_WORLD)
909-
if(";${LINK_DEPS};" MATCHES ";${m};")
910-
list(REMOVE_ITEM LINK_DEPS ${m})
911-
if(NOT (";${LINK_DEPS};" MATCHES ";opencv_world;"))
912-
list(APPEND LINK_DEPS opencv_world)
913-
endif()
914-
endif()
915-
endif()
916-
endforeach()
917-
endif()
918-
if(";${LINK_DEPS};" MATCHES ";${target};")
919-
list(REMOVE_ITEM LINK_DEPS "${target}") # prevent "link to itself" warning (world problem)
920-
endif()
904+
macro(__ocv_push_target_link_libraries)
921905
if(NOT TARGET ${target})
922906
if(NOT DEFINED OPENCV_MODULE_${target}_LOCATION)
923907
message(FATAL_ERROR "ocv_target_link_libraries: invalid target: '${target}'")
924908
endif()
925-
set(OPENCV_MODULE_${target}_LINK_DEPS ${OPENCV_MODULE_${target}_LINK_DEPS} ${LINK_DEPS} CACHE INTERNAL "" FORCE)
909+
set(OPENCV_MODULE_${target}_LINK_DEPS ${OPENCV_MODULE_${target}_LINK_DEPS} ${ARGN} CACHE INTERNAL "" FORCE)
926910
else()
927-
target_link_libraries(${target} ${LINK_DEPS})
911+
target_link_libraries(${target} ${ARGN})
912+
endif()
913+
endmacro()
914+
915+
function(ocv_target_link_libraries target)
916+
set(LINK_DEPS ${ARGN})
917+
_ocv_fix_target(target)
918+
set(LINK_MODE "LINK_PRIVATE")
919+
set(LINK_PENDING "")
920+
foreach(dep ${LINK_DEPS})
921+
if(" ${dep}" STREQUAL " ${target}")
922+
# prevent "link to itself" warning (world problem)
923+
elseif(" ${dep}" STREQUAL " LINK_PRIVATE" OR " ${dep}" STREQUAL "LINK_PUBLIC")
924+
if(NOT LINK_PENDING STREQUAL "")
925+
__ocv_push_target_link_libraries(${LINK_MODE} ${LINK_PENDING})
926+
set(LINK_PENDING "")
927+
set(LINK_MODE "${dep}")
928+
endif()
929+
else()
930+
if(BUILD_opencv_world)
931+
if(OPENCV_MODULE_${dep}_IS_PART_OF_WORLD)
932+
set(dep opencv_world)
933+
endif()
934+
endif()
935+
list(APPEND LINK_PENDING "${dep}")
936+
endif()
937+
endforeach()
938+
if(NOT LINK_PENDING STREQUAL "")
939+
__ocv_push_target_link_libraries(${LINK_MODE} ${LINK_PENDING})
928940
endif()
929941
endfunction()
930942

@@ -1037,6 +1049,12 @@ macro(ocv_get_all_libs _modules _extra _3rdparty)
10371049
endforeach()
10381050
foreach (dep ${deps} ${OPENCV_LINKER_LIBS})
10391051
if (NOT DEFINED OPENCV_MODULE_${dep}_LOCATION)
1052+
if(dep MATCHES "^\\$<LINK_ONLY:([^>]+)>$")
1053+
set(dep "${CMAKE_MATCH_1}")
1054+
endif()
1055+
if(dep MATCHES "^\\$<")
1056+
message(WARNING "Unexpected CMake generator expression: ${dep}")
1057+
endif()
10401058
if (TARGET ${dep})
10411059
get_target_property(_type ${dep} TYPE)
10421060
if(_type STREQUAL "STATIC_LIBRARY" AND BUILD_SHARED_LIBS)
@@ -1055,7 +1073,7 @@ macro(ocv_get_all_libs _modules _extra _3rdparty)
10551073
string(FIND "${_output}" "${CMAKE_BINARY_DIR}" _POS)
10561074
if (_POS EQUAL 0)
10571075
ocv_get_libname(_libname "${_output_name}")
1058-
list(INSERT ${_3rdparty} 0 ${_libname})
1076+
list(INSERT ${_3rdparty} 0 ${dep})
10591077
else()
10601078
if(_output)
10611079
list(INSERT ${_extra} 0 ${_output})
@@ -1175,3 +1193,11 @@ macro(ocv_generate_vs_version_file DESTINATION)
11751193

11761194
configure_file("${OpenCV_SOURCE_DIR}/cmake/templates/vs_version.rc.in" "${DESTINATION}" @ONLY)
11771195
endmacro()
1196+
1197+
macro(ocv_cmake_script_append_var content_var)
1198+
foreach(var_name ${ARGN})
1199+
set(${content_var} "${${content_var}}
1200+
set(${var_name} \"${${var_name}}\")
1201+
")
1202+
endforeach()
1203+
endmacro()

cmake/templates/opencv_abi.xml.in

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@
2929
opencv2/flann/hdf5.h
3030
opencv2/imgcodecs/ios.h
3131
opencv2/videoio/cap_ios.h
32-
opencv2/ts.hpp
33-
opencv2/ts/*
3432
opencv2/xobjdetect/private.hpp
3533
@OPENCV_ABI_SKIP_HEADERS@
3634
</skip_headers>

modules/java/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -460,10 +460,9 @@ if(ANDROID)
460460
461461
# force strip library after the build command
462462
# because samples and tests will make a copy of the library before install
463-
get_target_property(__opencv_java_location ${the_module} LOCATION)
464463
# Turn off stripping in debug build
465464
if ( NOT (CMAKE_BUILD_TYPE MATCHES "Debug"))
466-
add_custom_command(TARGET ${the_module} POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "${__opencv_java_location}")
465+
add_custom_command(TARGET ${the_module} POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "$<TARGET_FILE:${the_module}>")
467466
endif()
468467
endif()
469468

modules/java/android_test/CMakeLists.txt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,10 @@ add_custom_command(
4343

4444
list(APPEND opencv_test_java_file_deps ${android_proj_target_files})
4545

46-
get_target_property(java_location opencv_java LOCATION)
47-
get_filename_component(java_name "${java_location}" NAME)
48-
4946
# build java part
5047
add_custom_command(
5148
OUTPUT "${opencv_test_java_bin_dir}/bin/OpenCVTest-debug.apk"
52-
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${java_location}" "${opencv_test_java_bin_dir}/libs/${ANDROID_NDK_ABI_NAME}/${java_name}"
49+
COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<TARGET_FILE:opencv_java>" "${opencv_test_java_bin_dir}/libs/${ANDROID_NDK_ABI_NAME}/$<TARGET_FILE_NAME:opencv_java>"
5350
COMMAND ${ANT_EXECUTABLE} -q -noinput -k debug -Djava.target=1.6 -Djava.source=1.6
5451
COMMAND ${CMAKE_COMMAND} -E touch "${opencv_test_java_bin_dir}/bin/OpenCVTest-debug.apk" # needed because ant does not update the timestamp of updated apk
5552
WORKING_DIRECTORY "${opencv_test_java_bin_dir}"

0 commit comments

Comments
 (0)