From db218e7df4fffc8be3538afbbafa73c74d98a5ee Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 7 Mar 2023 14:56:45 +0100 Subject: [PATCH 1/2] fix cmakedeps systemlibs visibility --- .../cmake/cmakedeps/templates/target_data.py | 1 - conan/tools/microsoft/msbuilddeps.py | 1 - .../cmake/cmakedeps/test_cmakedeps.py | 40 +++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/conan/tools/cmake/cmakedeps/templates/target_data.py b/conan/tools/cmake/cmakedeps/templates/target_data.py index e682235c115..6adee43708e 100644 --- a/conan/tools/cmake/cmakedeps/templates/target_data.py +++ b/conan/tools/cmake/cmakedeps/templates/target_data.py @@ -322,7 +322,6 @@ def join_defines(values, prefix=""): # self.lib_paths = "" IMPORTANT! LINKERS IN LINUX FOR SHARED MIGHT NEED IT EVEN IF # NOT REALLY LINKING LIB self.libs = "" - self.system_libs = "" self.frameworks = "" if require and not require.libs and not require.headers: self.defines = "" diff --git a/conan/tools/microsoft/msbuilddeps.py b/conan/tools/microsoft/msbuilddeps.py index 1f813720286..ec754dc9873 100644 --- a/conan/tools/microsoft/msbuilddeps.py +++ b/conan/tools/microsoft/msbuilddeps.py @@ -197,7 +197,6 @@ def join_paths(paths): if require and not require.libs: lib_dirs = "" libs = "" - system_libs = "" if require and not require.libs and not require.headers: definitions = "" compiler_flags = "" diff --git a/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py b/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py index 45add87f6ce..46b2a127147 100644 --- a/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py +++ b/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py @@ -503,3 +503,43 @@ def generate(self): c.run("create . -pr:b=profile_build") # it doesn't crash anymore, it used to crash assert "pkg/0.1: Created package" in c.out + + +def test_system_libs_transitivity(): + """ + https://github.com/conan-io/conan/issues/13358 + """ + c = TestClient() + system = textwrap.dedent("""\ + from conan import ConanFile + class Pkg(ConanFile): + name = "dep" + version = "system" + def package_info(self): + self.cpp_info.system_libs = ["m"] + """) + header = textwrap.dedent(""" + from conan import ConanFile + class Header(ConanFile): + name = "header" + version = "0.1" + package_type = "header-library" + requires = "dep/system" + def package_info(self): + self.cpp_info.system_libs = ["dl"] + """) + app = textwrap.dedent("""\ + from conan import ConanFile + class App(ConanFile): + requires = "header/0.1" + settings = "build_type" + generators = "CMakeDeps" + """) + c.save({"dep/conanfile.py": system, + "header/conanfile.py": header, + "app/conanfile.py": app}) + c.run("create dep") + c.run("create header") + c.run("install app") + assert "set(dep_SYSTEM_LIBS_RELEASE m)" in c.load("app/dep-release-data.cmake") + assert "set(header_SYSTEM_LIBS_RELEASE dl)" in c.load("app/header-release-data.cmake") From dff0fb6fb74314fd1cb4a5eb6c0baded13daec66 Mon Sep 17 00:00:00 2001 From: memsharded Date: Thu, 9 Mar 2023 13:57:03 +0100 Subject: [PATCH 2/2] workaround for frameworks --- conan/tools/cmake/cmakedeps/templates/target_data.py | 4 +++- .../toolchains/cmake/cmakedeps/test_cmakedeps.py | 10 ++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/conan/tools/cmake/cmakedeps/templates/target_data.py b/conan/tools/cmake/cmakedeps/templates/target_data.py index 6adee43708e..3f13b34467b 100644 --- a/conan/tools/cmake/cmakedeps/templates/target_data.py +++ b/conan/tools/cmake/cmakedeps/templates/target_data.py @@ -322,7 +322,9 @@ def join_defines(values, prefix=""): # self.lib_paths = "" IMPORTANT! LINKERS IN LINUX FOR SHARED MIGHT NEED IT EVEN IF # NOT REALLY LINKING LIB self.libs = "" - self.frameworks = "" + if cpp_info.frameworkdirs: # Only invalidate for in-package frameworks + # FIXME: The mix of in-package frameworks + system ones is broken + self.frameworks = "" if require and not require.libs and not require.headers: self.defines = "" self.compile_definitions = "" diff --git a/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py b/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py index 46b2a127147..41f3f7d0865 100644 --- a/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py +++ b/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py @@ -517,6 +517,7 @@ class Pkg(ConanFile): version = "system" def package_info(self): self.cpp_info.system_libs = ["m"] + self.cpp_info.frameworks = ["CoreFoundation"] """) header = textwrap.dedent(""" from conan import ConanFile @@ -527,6 +528,7 @@ class Header(ConanFile): requires = "dep/system" def package_info(self): self.cpp_info.system_libs = ["dl"] + self.cpp_info.frameworks = ["CoreDriver"] """) app = textwrap.dedent("""\ from conan import ConanFile @@ -541,5 +543,9 @@ class App(ConanFile): c.run("create dep") c.run("create header") c.run("install app") - assert "set(dep_SYSTEM_LIBS_RELEASE m)" in c.load("app/dep-release-data.cmake") - assert "set(header_SYSTEM_LIBS_RELEASE dl)" in c.load("app/header-release-data.cmake") + dep = c.load("app/dep-release-data.cmake") + assert "set(dep_SYSTEM_LIBS_RELEASE m)" in dep + assert "set(dep_FRAMEWORKS_RELEASE CoreFoundation)" in dep + app = c.load("app/header-release-data.cmake") + assert "set(header_SYSTEM_LIBS_RELEASE dl)" in app + assert "set(header_FRAMEWORKS_RELEASE CoreDriver)" in app