Skip to content

Commit

Permalink
- CMakeDeps: add cmake_target_aliases property
Browse files Browse the repository at this point in the history
Signed-off-by: SSE4 <tomskside@gmail.com>
  • Loading branch information
SSE4 committed Oct 3, 2021
1 parent e8c2528 commit 03d110c
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 1 deletion.
35 changes: 34 additions & 1 deletion conan/tools/cmake/cmakedeps/templates/targets.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,23 @@ def context(self):
target_pattern = "" if not self.find_module_mode else "module-"
target_pattern += "{}-Target-*.cmake".format(self.file_name)

cmake_target_aliases = self.conanfile.new_cpp_info.\
get_property("cmake_target_aliases", "CMakeDeps") or dict()

cmake_component_target_aliases = dict()
for comp_name in self.conanfile.new_cpp_info.components:
cmake_component_target_aliases[comp_name] = \
self.conanfile.new_cpp_info.components[comp_name].\
get_property("cmake_target_aliases", "CMakeDeps") or dict()

ret = {"pkg_name": self.pkg_name,
"target_namespace": self.target_namespace,
"global_target_name": self.global_target_name,
"file_name": self.file_name,
"data_pattern": data_pattern,
"target_pattern": target_pattern}
"target_pattern": target_pattern,
"cmake_target_aliases": cmake_target_aliases,
"cmake_component_target_aliases": cmake_component_target_aliases}

return ret

Expand Down Expand Up @@ -58,6 +69,28 @@ def template(self):
conan_message(STATUS "Conan: Target declared '{{ target_namespace }}::{{ global_target_name }}'")
endif()
{%- for alias, target in cmake_target_aliases.items() %}
if(NOT TARGET {{alias}})
add_library({{alias}} INTERFACE IMPORTED)
set_property(TARGET {{ alias }} PROPERTY INTERFACE_LINK_LIBRARIES {{target}})
endif()
{%- endfor %}
{%- for comp_name, component_aliases in cmake_component_target_aliases.items() %}
{%- for alias, target in component_aliases.items() %}
if(NOT TARGET {{alias}})
add_library({{alias}} INTERFACE IMPORTED)
set_property(TARGET {{ alias }} PROPERTY INTERFACE_LINK_LIBRARIES {{target}})
endif()
{%- endfor %}
{%- endfor %}
# Load the debug and release library finders
get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
file(GLOB CONFIG_FILES "${_DIR}/{{ target_pattern }}")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import textwrap
import pytest

from conans.test.utils.tools import TestClient

consumer = textwrap.dedent("""
from conans import ConanFile
from conan.tools.cmake import CMake
class Consumer(ConanFile):
name = "consumer"
version = "1.0"
settings = "os", "compiler", "build_type", "arch"
generators = "CMakeDeps", "CMakeToolchain"
exports_sources = ["CMakeLists.txt"]
requires = "hello/1.0"
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
""")


@pytest.mark.tool_cmake
def test_global_alias():
conanfile = textwrap.dedent("""
from conans import ConanFile
class Hello(ConanFile):
name = "hello"
version = "1.0"
settings = "os", "compiler", "build_type", "arch"
def package_info(self):
self.cpp_info.set_property("cmake_target_aliases", {"hello": "hello::hello"}, "CMakeDeps")
""")

cmakelists = textwrap.dedent("""
cmake_minimum_required(VERSION 2.8)
find_package(hello REQUIRED)
get_target_property(link_libraries hello INTERFACE_LINK_LIBRARIES)
message("hello link libraries: ${link_libraries}")
""")

client = TestClient()
client.save({"conanfile.py": conanfile})
client.run("create .")

client.save({"conanfile.py": consumer, "CMakeLists.txt": cmakelists})
client.run("create .")

assert "hello link libraries: hello::hello" in client.out


@pytest.mark.tool_cmake
def test_component_alias():
conanfile = textwrap.dedent("""
from conans import ConanFile
class Hello(ConanFile):
name = "hello"
version = "1.0"
settings = "os", "compiler", "build_type", "arch"
def package_info(self):
self.cpp_info.components["buy"].set_property("cmake_target_aliases",
{"hola::adios": "hello::buy"}, "CMakeDeps")
""")

cmakelists = textwrap.dedent("""
cmake_minimum_required(VERSION 2.8)
find_package(hello REQUIRED)
get_target_property(link_libraries hola::adios INTERFACE_LINK_LIBRARIES)
message("hola::adios link libraries: ${link_libraries}")
""")

client = TestClient()
client.save({"conanfile.py": conanfile})
client.run("create .")

client.save({"conanfile.py": consumer, "CMakeLists.txt": cmakelists})
client.run("create .")

assert "hola::adios link libraries: hello::buy" in client.out

0 comments on commit 03d110c

Please sign in to comment.