From 51fbc696fd3a31c95c8a7d69ae9bb5a9d81cfc3d Mon Sep 17 00:00:00 2001 From: memsharded Date: Thu, 18 Mar 2021 00:48:07 +0100 Subject: [PATCH] further minor improvements to CMakeDeps --- conan/tools/cmake/cmakedeps.py | 114 +++++++++++++++------------------ 1 file changed, 50 insertions(+), 64 deletions(-) diff --git a/conan/tools/cmake/cmakedeps.py b/conan/tools/cmake/cmakedeps.py index baf8d0009a9..8d1aabc28ae 100644 --- a/conan/tools/cmake/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps.py @@ -39,43 +39,37 @@ conan_package_library_targets = textwrap.dedent(""" function(conan_package_library_targets libraries package_libdir deps out_libraries out_libraries_target build_type package_name) unset(_CONAN_ACTUAL_TARGETS CACHE) - unset(_CONAN_FOUND_SYSTEM_LIBS CACHE) + foreach(_LIBRARY_NAME ${libraries}) find_library(CONAN_FOUND_LIBRARY NAME ${_LIBRARY_NAME} PATHS ${package_libdir} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) if(CONAN_FOUND_LIBRARY) conan_message(STATUS "Library ${_LIBRARY_NAME} found ${CONAN_FOUND_LIBRARY}") list(APPEND _out_libraries ${CONAN_FOUND_LIBRARY}) - if(NOT ${CMAKE_VERSION} VERSION_LESS "3.0") + + # Create a micro-target for each lib/a found + set(_LIB_NAME CONAN_LIB::${package_name}_${_LIBRARY_NAME}${build_type}) + if(NOT TARGET ${_LIB_NAME}) # Create a micro-target for each lib/a found - set(_LIB_NAME CONAN_LIB::${package_name}_${_LIBRARY_NAME}${build_type}) - if(NOT TARGET ${_LIB_NAME}) - # Create a micro-target for each lib/a found - add_library(${_LIB_NAME} UNKNOWN IMPORTED) - set_target_properties(${_LIB_NAME} PROPERTIES IMPORTED_LOCATION ${CONAN_FOUND_LIBRARY}) - set(_CONAN_ACTUAL_TARGETS ${_CONAN_ACTUAL_TARGETS} ${_LIB_NAME}) - else() - conan_message(STATUS "Skipping already existing target: ${_LIB_NAME}") - endif() - list(APPEND _out_libraries_target ${_LIB_NAME}) + add_library(${_LIB_NAME} UNKNOWN IMPORTED) + set_target_properties(${_LIB_NAME} PROPERTIES IMPORTED_LOCATION ${CONAN_FOUND_LIBRARY}) + set(_CONAN_ACTUAL_TARGETS ${_CONAN_ACTUAL_TARGETS} ${_LIB_NAME}) + else() + conan_message(STATUS "Skipping already existing target: ${_LIB_NAME}") endif() + list(APPEND _out_libraries_target ${_LIB_NAME}) conan_message(STATUS "Found: ${CONAN_FOUND_LIBRARY}") else() - conan_message(STATUS "Library ${_LIBRARY_NAME} not found in package, might be system one") - list(APPEND _out_libraries_target ${_LIBRARY_NAME}) - list(APPEND _out_libraries ${_LIBRARY_NAME}) - set(_CONAN_FOUND_SYSTEM_LIBS "${_CONAN_FOUND_SYSTEM_LIBS};${_LIBRARY_NAME}") + conan_message(ERROR "Library ${_LIBRARY_NAME} not found in package") endif() unset(CONAN_FOUND_LIBRARY CACHE) endforeach() - if(NOT ${CMAKE_VERSION} VERSION_LESS "3.0") - # Add all dependencies to all targets - string(REPLACE " " ";" deps_list "${deps}") - foreach(_CONAN_ACTUAL_TARGET ${_CONAN_ACTUAL_TARGETS}) - set_property(TARGET ${_CONAN_ACTUAL_TARGET} PROPERTY INTERFACE_LINK_LIBRARIES "${_CONAN_FOUND_SYSTEM_LIBS};${deps_list}") - endforeach() - endif() + # Add all dependencies to all targets + string(REPLACE " " ";" deps_list "${deps}") + foreach(_CONAN_ACTUAL_TARGET ${_CONAN_ACTUAL_TARGETS}) + set_property(TARGET ${_CONAN_ACTUAL_TARGET} PROPERTY INTERFACE_LINK_LIBRARIES "${deps_list}") + endforeach() set(${out_libraries} ${_out_libraries} PARENT_SCOPE) set(${out_libraries_target} ${_out_libraries_target} PARENT_SCOPE) @@ -87,25 +81,33 @@ set({name}_INCLUDE_DIRS{build_type_suffix} {deps.include_paths}) set({name}_RES_DIRS{build_type_suffix} {deps.res_paths}) set({name}_DEFINITIONS{build_type_suffix} {deps.defines}) -set({name}_LINKER_FLAGS{build_type_suffix}_LIST - "$<$,SHARED_LIBRARY>:{deps.sharedlinkflags_list}>" - "$<$,MODULE_LIBRARY>:{deps.sharedlinkflags_list}>" - "$<$,EXECUTABLE>:{deps.exelinkflags_list}>" -) +set({name}_SHARED_LINK_FLAGS{build_type_suffix} {deps.sharedlinkflags_list}) +set({name}_EXE_LINK_FLAGS{build_type_suffix} {deps.exelinkflags_list}) set({name}_COMPILE_DEFINITIONS{build_type_suffix} {deps.compile_definitions}) -set({name}_COMPILE_OPTIONS{build_type_suffix}_LIST "{deps.cxxflags_list}" "{deps.cflags_list}") -set({name}_COMPILE_OPTIONS_C{build_type_suffix} "{deps.cflags_list}") -set({name}_COMPILE_OPTIONS_CXX{build_type_suffix} "{deps.cxxflags_list}") +set({name}_COMPILE_OPTIONS_C{build_type_suffix} {deps.cflags_list}) +set({name}_COMPILE_OPTIONS_CXX{build_type_suffix} {deps.cxxflags_list}) set({name}_LIB_DIRS{build_type_suffix} {deps.lib_paths}) set({name}_LIBS{build_type_suffix} {deps.libs}) set({name}_SYSTEM_LIBS{build_type_suffix} {deps.system_libs}) set({name}_FRAMEWORK_DIRS{build_type_suffix} {deps.framework_paths}) set({name}_FRAMEWORKS{build_type_suffix} {deps.frameworks}) set({name}_BUILD_MODULES_PATHS{build_type_suffix} {deps.build_modules_paths}) +set({name}_BUILD_DIRS{build_type_suffix} {deps.build_paths}) +# Missing the dependencies information here """ dynamic_variables_template = """ + +set({name}_COMPILE_OPTIONS{build_type_suffix} + "$<$:${{{name}_COMPILE_OPTIONS_CXX{build_type_suffix}}}>" + "$<$:${{{name}_COMPILE_OPTIONS_C{build_type_suffix}}}>") + +set({name}_LINKER_FLAGS{build_type_suffix} + "$<$,SHARED_LIBRARY>:${{{name}_SHARED_LINK_FLAGS{build_type_suffix}}}>" + "$<$,MODULE_LIBRARY>:${{{name}_SHARED_LINK_FLAGS{build_type_suffix}}}>" + "$<$,EXECUTABLE>:${{{name}_EXE_LINK_FLAGS{build_type_suffix}}}>") + set({name}_FRAMEWORKS_FOUND{build_type_suffix} "") # Will be filled later conan_find_apple_frameworks({name}_FRAMEWORKS_FOUND{build_type_suffix} "${{{name}_FRAMEWORKS{build_type_suffix}}}" "${{{name}_FRAMEWORK_DIRS{build_type_suffix}}}") @@ -136,8 +138,10 @@ set({name}_LIBRARIES_TARGETS{build_type_suffix} "${{{name}_LIBRARIES_TARGETS{build_type_suffix}}};{deps_names}") set({name}_LIBRARIES{build_type_suffix} "${{{name}_LIBRARIES{build_type_suffix}}};{deps_names}") -set(CMAKE_MODULE_PATH {deps.build_paths} ${{CMAKE_MODULE_PATH}}) -set(CMAKE_PREFIX_PATH {deps.build_paths} ${{CMAKE_PREFIX_PATH}}) + +# FIXME: What is the result of this for multi-config? All configs adding themselves to path? +set(CMAKE_MODULE_PATH ${{{name}_BUILD_DIRS{build_type_suffix}}} ${{CMAKE_MODULE_PATH}}) +set(CMAKE_PREFIX_PATH ${{{name}_BUILD_DIRS{build_type_suffix}}} ${{CMAKE_PREFIX_PATH}}) """ @@ -146,13 +150,7 @@ def find_transitive_dependencies(public_deps_filenames): # https://github.com/conan-io/conan/issues/5040 find = textwrap.dedent(""" if(NOT {dep_filename}_FOUND) - if(${{CMAKE_VERSION}} VERSION_LESS "3.9.0") - find_package({dep_filename} REQUIRED NO_MODULE) - else() - find_dependency({dep_filename} REQUIRED NO_MODULE) - endif() - else() - message(STATUS "Dependency {dep_filename} already found") + find_dependency({dep_filename} REQUIRED NO_MODULE) endif() """) lines = ["", "# Library dependencies", "include(CMakeFindDependencyMacro)"] @@ -232,11 +230,6 @@ def join_paths_single_var(values): self.defines = join_defines(cpp_info.defines, "-D") self.compile_definitions = join_defines(cpp_info.defines) - self.cxxflags = join_flags(" ", cpp_info.cxxflags) - self.cflags = join_flags(" ", cpp_info.cflags) - self.sharedlinkflags = join_flags(" ", cpp_info.sharedlinkflags) - self.exelinkflags = join_flags(" ", cpp_info.exelinkflags) - # For modern CMake targets we need to prepare a list to not # loose the elements in the list by replacing " " with ";". Example "-framework Foundation" # Issue: #1251 @@ -255,9 +248,9 @@ class CMakeDeps(object): config_template = textwrap.dedent(""" include(${{CMAKE_CURRENT_LIST_DIR}}/cmakedeps_macros.cmake) - # Requires CMake > 3.0 - if(${{CMAKE_VERSION}} VERSION_LESS "3.0") - message(FATAL_ERROR "The 'cmake_find_package_multi' generator only works with CMake > 3.0") + # Requires CMake > 3.15 + if(${{CMAKE_VERSION}} VERSION_LESS "3.15") + message(FATAL_ERROR "The 'CMakeDeps' generator only works with CMake >= 3.15") endif() include(${{CMAKE_CURRENT_LIST_DIR}}/{filename}Targets.cmake) @@ -293,7 +286,7 @@ class CMakeDeps(object): PROPERTY INTERFACE_LINK_LIBRARIES {%- for config in configs %} $<$:${{'{'}}{{name}}_LIBRARIES_TARGETS_{{config.upper()}}} - ${{'{'}}{{name}}_LINKER_FLAGS_{{config.upper()}}_LIST}> + ${{'{'}}{{name}}_LINKER_FLAGS_{{config.upper()}}}> {%- endfor %}) set_property(TARGET {{name}}::{{name}} PROPERTY INTERFACE_INCLUDE_DIRECTORIES @@ -308,7 +301,7 @@ class CMakeDeps(object): set_property(TARGET {{name}}::{{name}} PROPERTY INTERFACE_COMPILE_OPTIONS {%- for config in configs %} - $<$:${{'{'}}{{name}}_COMPILE_OPTIONS_{{config.upper()}}_LIST}> + $<$:${{'{'}}{{name}}_COMPILE_OPTIONS_{{config.upper()}}}> {%- endfor %}) """) @@ -370,7 +363,7 @@ class CMakeDeps(object): set({{ pkg_name }}_{{ comp_name }}_FRAMEWORKS_{{ build_type }} {{ comp.frameworks }}) set({{ pkg_name }}_{{ comp_name }}_BUILD_MODULES_PATHS_{{ build_type }} {{ comp.build_modules_paths }}) set({{ pkg_name }}_{{ comp_name }}_DEPENDENCIES_{{ build_type }} {{ comp.public_deps }}) - set({{ pkg_name }}_{{ comp_name }}_LINKER_FLAGS_LIST_{{ build_type }} + set({{ pkg_name }}_{{ comp_name }}_LINKER_FLAGS_{{ build_type }} $<$,SHARED_LIBRARY>:{{ comp.sharedlinkflags_list }}> $<$,MODULE_LIBRARY>:{{ comp.sharedlinkflags_list }}> $<$,EXECUTABLE>:{{ comp.exelinkflags_list }}> @@ -455,9 +448,9 @@ class CMakeDeps(object): components_config_tpl = Template(textwrap.dedent("""\ ########## MACROS ########################################################################### ############################################################################################# - # Requires CMake > 3.0 - if(${CMAKE_VERSION} VERSION_LESS "3.0") - message(FATAL_ERROR "The 'cmake_find_package_multi' generator only works with CMake > 3.0") + # Requires CMake > 3.15 + if(${CMAKE_VERSION} VERSION_LESS "3.15") + message(FATAL_ERROR "The 'CMakeDeps' generator only works with CMake >= 3.15") endif() include(${CMAKE_CURRENT_LIST_DIR}/{{ pkg_filename }}Targets.cmake) @@ -470,13 +463,7 @@ class CMakeDeps(object): {%- for public_dep in pkg_public_deps %} if(NOT {{ public_dep }}_FOUND) - if(${CMAKE_VERSION} VERSION_LESS "3.9.0") - find_package({{ public_dep }} REQUIRED NO_MODULE) - else() - find_dependency({{ public_dep }} REQUIRED NO_MODULE) - endif() - else() - message(STATUS "Dependency {{ public_dep }} already found") + find_dependency({{ public_dep }} REQUIRED NO_MODULE) endif() {%- endfor %} @@ -494,7 +481,7 @@ class CMakeDeps(object): set_property(TARGET {{ pkg_name }}::{{ comp_name }} PROPERTY INTERFACE_LINK_LIBRARIES {%- for config in configs %} $<$:{{tvalue(pkg_name, comp_name, 'LINK_LIBS', config)}} - {{tvalue(pkg_name, comp_name, 'LINKER_FLAGS_LIST', config)}}> + {{tvalue(pkg_name, comp_name, 'LINKER_FLAGS', config)}}> {%- endfor %}) set_property(TARGET {{ pkg_name }}::{{ comp_name }} PROPERTY INTERFACE_INCLUDE_DIRECTORIES {%- for config in configs %} @@ -681,7 +668,7 @@ def content(self): } dynamic_variables = { "{}Target-{}.cmake".format(pkg_filename, self.configuration.lower()): - dynamic_variables_template.format(name=pkg_findname, deps=deps, + dynamic_variables_template.format(name=pkg_findname, build_type_suffix=build_type_suffix, deps_names=deps_names) } @@ -713,7 +700,6 @@ def content(self): } ret.update(variables) global_dynamic_variables = dynamic_variables_template.format(name=pkg_findname, - deps=pkg_info, build_type_suffix=build_type_suffix, deps_names=deps_names) dynamic_variables = {