Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions conan/tools/cmake/cmakedeps2/cmakedeps.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,15 @@ def _content(self):

if require.direct:
direct_deps.append((require, dep))
config = ConfigTemplate2(self, dep)
full_cpp_info = dep.cpp_info.deduce_full_cpp_info(dep)
config = ConfigTemplate2(self, require, dep, full_cpp_info)
ret[config.filename] = config.content()
config_version = ConfigVersionTemplate2(self, dep)
ret[config_version.filename] = config_version.content()

targets = TargetsTemplate2(self, dep)
ret[targets.filename] = targets.content()
target_configuration = TargetConfigurationTemplate2(self, dep, require)
target_configuration = TargetConfigurationTemplate2(self, dep, require, full_cpp_info)
ret[target_configuration.filename] = target_configuration.content()

self._print_help(direct_deps)
Expand Down
59 changes: 53 additions & 6 deletions conan/tools/cmake/cmakedeps2/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@ class ConfigTemplate2:
FooConfig.cmake
foo-config.cmake
"""
def __init__(self, cmakedeps, conanfile):
def __init__(self, cmakedeps, require, conanfile, full_cpp_info):
self._cmakedeps = cmakedeps
self._require = require
self._conanfile = conanfile
self._full_cpp_info = full_cpp_info

def content(self):
t = Template(self._template, trim_blocks=True, lstrip_blocks=True,
Expand Down Expand Up @@ -57,11 +59,41 @@ def _context(self):
cmakename = cmakename.split("::", 1)[1]
components.append(cmakename or name)
components = " ".join(components) if components else ""
return {"filename": f,
"components": components,
"pkg_name": pkg_name,
"targets_include_file": targets_include,
"build_modules_paths": build_modules_paths}

result = {"filename": f,
"components": components,
"pkg_name": pkg_name,
"targets_include_file": targets_include,
"build_modules_paths": build_modules_paths}

result.update(self._get_legacy_vars())
return result

def _get_legacy_vars(self):
# Auxiliary variables for legacy consumption and try_compile cases
pkg_name = self._conanfile.ref.name
prefixes = self._cmakedeps.get_property("cmake_additional_variables_prefixes",
self._conanfile, check_type=list) or []

f = self._cmakedeps.get_cmake_filename(self._conanfile)
prefixes = [f] + prefixes
include_dirs = definitions = libraries = None
if not self._require.build: # To add global variables for try_compile and legacy
aggregated_cppinfo = self._full_cpp_info.aggregated_components()
# FIXME: Proper escaping of paths for CMake
incdirs = [i.replace("\\", "/") for i in aggregated_cppinfo.includedirs]
incdirs = [relativize_path(i, self._cmakedeps._conanfile, "${CMAKE_CURRENT_LIST_DIR}")
for i in incdirs]
include_dirs = ";".join(incdirs)
definitions = ""
root_target_name = self._cmakedeps.get_property("cmake_target_name", self._conanfile)
libraries = root_target_name or f"{pkg_name}::{pkg_name}"

return {"additional_variables_prefixes": prefixes,
"version": self._conanfile.ref.version,
"include_dirs": include_dirs,
"definitions": definitions,
"libraries": libraries}

@property
def _template(self):
Expand Down Expand Up @@ -96,4 +128,19 @@ def _template(self):
endif()
endforeach()
{% endif %}

################# Global variables for try compile and legacy ##############
{% for prefix in additional_variables_prefixes %}
set({{ prefix }}_VERSION_STRING "{{ version }}")
{% if include_dirs is not none %}
set({{ prefix }}_INCLUDE_DIRS "{{ include_dirs }}" )
set({{ prefix }}_INCLUDE_DIR "{{ include_dirs }}" )
{% endif %}
{% if libraries is not none %}
set({{ prefix }}_LIBRARIES {{ libraries }} )
{% endif %}
{% if definitions is not none %}
set({{ prefix }}_DEFINITIONS {{ definitions}} )
{% endif %}
{% endfor %}
""")
44 changes: 4 additions & 40 deletions conan/tools/cmake/cmakedeps2/target_configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ class TargetConfigurationTemplate2:
"""
FooTarget-release.cmake
"""
def __init__(self, cmakedeps, conanfile, require):
def __init__(self, cmakedeps, conanfile, require, full_cpp_info):
self._cmakedeps = cmakedeps
self._conanfile = conanfile # The dependency conanfile, not the consumer one
self._require = require
self._full_cpp_info = full_cpp_info

def content(self):
auto_link = self._cmakedeps.get_property("cmake_set_interface_link_directories",
Expand Down Expand Up @@ -102,7 +103,7 @@ def _requires(self, info, components):

@property
def _context(self):
cpp_info = self._conanfile.cpp_info.deduce_full_cpp_info(self._conanfile)
cpp_info = self._full_cpp_info
assert isinstance(cpp_info.type, PackageType)
pkg_name = self._conanfile.ref.name
# fallback to consumer configuration if it doesn't have build_type
Expand All @@ -120,8 +121,6 @@ def _context(self):
self._add_root_lib_target(libs, pkg_name, cpp_info)
exes = self._get_exes(cpp_info, pkg_name, pkg_folder, pkg_folder_var)

prefixes = self._cmakedeps.get_property("cmake_additional_variables_prefixes",
self._conanfile, check_type=list) or []
seen_aliases = set()
root_target_name = self._cmakedeps.get_property("cmake_target_name", self._conanfile)
root_target_name = root_target_name or f"{pkg_name}::{pkg_name}"
Expand All @@ -139,20 +138,6 @@ def _context(self):
raise ConanException(f"Alias '{alias}' already defined as a target in "
f"{self._conanfile}. ")

f = self._cmakedeps.get_cmake_filename(self._conanfile)
prefixes = [f] + prefixes
include_dirs = definitions = libraries = None
if not self._require.build: # To add global variables for try_compile and legacy
aggregated_cppinfo = cpp_info.aggregated_components()
# FIXME: Proper escaping of paths for CMake
incdirs = [i.replace("\\", "/") for i in aggregated_cppinfo.includedirs]
incdirs = [relativize_path(i, self._cmakedeps._conanfile, "${CMAKE_CURRENT_LIST_DIR}")
for i in incdirs]
include_dirs = ";".join(incdirs)
definitions = ""
root_target_name = self._cmakedeps.get_property("cmake_target_name", self._conanfile)
libraries = root_target_name or f"{pkg_name}::{pkg_name}"

pkg_folder = relativize_path(pkg_folder, self._cmakedeps._conanfile,
"${CMAKE_CURRENT_LIST_DIR}")
dependencies = self._get_dependencies()
Expand All @@ -162,13 +147,7 @@ def _context(self):
"config": config,
"exes": exes,
"libs": libs,
"context": self._conanfile.context,
# Extra global variables
"additional_variables_prefixes": prefixes,
"version": self._conanfile.ref.version,
"include_dirs": include_dirs,
"definitions": definitions,
"libraries": libraries,
"context": self._conanfile.context
}

def _get_libs(self, cpp_info, pkg_name, pkg_folder, pkg_folder_var) -> dict:
Expand Down Expand Up @@ -467,21 +446,6 @@ def _template(self):
{% endif %}
{% endfor %}

################# Global variables for try compile and legacy ##############
{% for prefix in additional_variables_prefixes %}
set({{ prefix }}_VERSION_STRING "{{ version }}")
{% if include_dirs is not none %}
set({{ prefix }}_INCLUDE_DIRS "{{ include_dirs }}" )
set({{ prefix }}_INCLUDE_DIR "{{ include_dirs }}" )
{% endif %}
{% if libraries is not none %}
set({{ prefix }}_LIBRARIES {{ libraries }} )
{% endif %}
{% if definitions is not none %}
set({{ prefix }}_DEFINITIONS {{ definitions}} )
{% endif %}
{% endfor %}

################# Exes information ##############
{% for exe, location in exes.items() %}
#################### {{exe}} ####################
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,11 +145,11 @@ class PkgConan(ConanFile):
liba_config = c.load("liba-config.cmake")
assert ('include("${CMAKE_CURRENT_LIST_DIR}/full_deploy/'
'host/liba/1.0/share/cmake/crypto.cmake")') in liba_config
assert ('set(liba_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/full_deploy/'
'host/liba/1.0/includea" )') in liba_config
liba_targets = c.load("liba-Targets-release.cmake")
assert ('set(liba_PACKAGE_FOLDER_RELEASE "${CMAKE_CURRENT_LIST_DIR}/full_deploy/'
'host/liba/1.0")') in liba_targets
assert ('set(liba_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/full_deploy/'
'host/liba/1.0/includea" )') in liba_targets


def test_cmakeconfigdeps_recipe():
Expand Down
Loading