Skip to content

Commit

Permalink
further minor improvements to CMakeDeps (#8666)
Browse files Browse the repository at this point in the history
  • Loading branch information
memsharded committed Mar 18, 2021
1 parent 2c9bbc8 commit 7490743
Showing 1 changed file with 50 additions and 64 deletions.
114 changes: 50 additions & 64 deletions conan/tools/cmake/cmakedeps.py
Expand Up @@ -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)
Expand All @@ -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
"$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:{deps.sharedlinkflags_list}>"
"$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,MODULE_LIBRARY>:{deps.sharedlinkflags_list}>"
"$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,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}
"$<$<COMPILE_LANGUAGE:CXX>:${{{name}_COMPILE_OPTIONS_CXX{build_type_suffix}}}>"
"$<$<COMPILE_LANGUAGE:C>:${{{name}_COMPILE_OPTIONS_C{build_type_suffix}}}>")
set({name}_LINKER_FLAGS{build_type_suffix}
"$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:${{{name}_SHARED_LINK_FLAGS{build_type_suffix}}}>"
"$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,MODULE_LIBRARY>:${{{name}_SHARED_LINK_FLAGS{build_type_suffix}}}>"
"$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,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}}}")
Expand Down Expand Up @@ -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}})
"""


Expand All @@ -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)"]
Expand Down Expand Up @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -293,7 +286,7 @@ class CMakeDeps(object):
PROPERTY INTERFACE_LINK_LIBRARIES
{%- for config in configs %}
$<$<CONFIG:{{config}}>:${{'{'}}{{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
Expand All @@ -308,7 +301,7 @@ class CMakeDeps(object):
set_property(TARGET {{name}}::{{name}}
PROPERTY INTERFACE_COMPILE_OPTIONS
{%- for config in configs %}
$<$<CONFIG:{{config}}>:${{'{'}}{{name}}_COMPILE_OPTIONS_{{config.upper()}}_LIST}>
$<$<CONFIG:{{config}}>:${{'{'}}{{name}}_COMPILE_OPTIONS_{{config.upper()}}}>
{%- endfor %})
""")

Expand Down Expand Up @@ -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 }}
$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:{{ comp.sharedlinkflags_list }}>
$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,MODULE_LIBRARY>:{{ comp.sharedlinkflags_list }}>
$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:{{ comp.exelinkflags_list }}>
Expand Down Expand Up @@ -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)
Expand All @@ -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 %}
Expand All @@ -494,7 +481,7 @@ class CMakeDeps(object):
set_property(TARGET {{ pkg_name }}::{{ comp_name }} PROPERTY INTERFACE_LINK_LIBRARIES
{%- for config in configs %}
$<$<CONFIG:{{config}}>:{{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 %}
Expand Down Expand Up @@ -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)
}
Expand Down Expand Up @@ -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 = {
Expand Down

0 comments on commit 7490743

Please sign in to comment.