Skip to content

Commit a4926c5

Browse files
authored
[XcodeDeps] Avoid referencing xcconfig from skipped dependencies required in components (#19023)
* add test * better test and fix * minor changes * test files are generated * fix condition * minor changes
1 parent 5040561 commit a4926c5

File tree

2 files changed

+64
-2
lines changed

2 files changed

+64
-2
lines changed

conan/tools/apple/xcodedeps.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,10 @@ def _content(self):
256256
dep_name = _format_name(dep.ref.name)
257257

258258
include_components_names = []
259+
transitive_requires = [r for r, _ in
260+
get_transitive_requires(self._conanfile, dep).items()]
259261
if dep.cpp_info.has_components:
262+
transitive_dep_names = [_format_name(dep.ref.name) for dep in transitive_requires]
260263

261264
sorted_components = dep.cpp_info.get_sorted_components().items()
262265
for comp_name, comp_cpp_info in sorted_components:
@@ -266,7 +269,8 @@ def _content(self):
266269
# "list of names from required components from other packages")
267270
def _get_component_requires(component):
268271
requires_external = [(req.split("::")[0], req.split("::")[1]) for req in
269-
component.requires if "::" in req]
272+
component.requires if "::" in req
273+
and req.split("::")[0] in transitive_dep_names]
270274
requires_internal = [dep.cpp_info.components.get(req) for req in
271275
component.requires if "::" not in req]
272276
return requires_internal, requires_external
@@ -301,7 +305,6 @@ def _transitive_components(component):
301305
result.update(component_content)
302306
else:
303307
public_deps = []
304-
transitive_requires = [r for r, _ in get_transitive_requires(self._conanfile, dep).items()]
305308
for r, d in dep.dependencies.direct_host.items():
306309
if r not in transitive_requires:
307310
continue

test/integration/toolchains/apple/test_xcodedeps.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,3 +582,62 @@ def package_info(self):
582582
conan_uses_xcconfig = client.load("conan_uses_components_uses_components.xcconfig")
583583
assert '#include "conan_has_components_first.xcconfig"' in conan_uses_xcconfig
584584
assert '#include "conan_has_components_second.xcconfig"' not in conan_uses_xcconfig
585+
586+
587+
def test_dont_add_skipped_xcconfigs_when_required_by_components():
588+
client = TestClient()
589+
regular_lib = textwrap.dedent("""
590+
from conan import ConanFile
591+
class PkgWithComponents(ConanFile):
592+
name = 'regular_lib'
593+
version = '1.0'
594+
settings = 'os', 'compiler', 'arch', 'build_type'
595+
def requirements(self):
596+
self.requires('header_skip/1.0')
597+
self.requires('header_transitive/1.0', transitive_headers=True)
598+
def package_info(self):
599+
self.cpp_info.components['component'].requires = ['header_skip::header_skip',
600+
'header_transitive::header_transitive']
601+
""")
602+
603+
header_transitive = textwrap.dedent("""
604+
from conan import ConanFile
605+
class PkgUsesComponent(ConanFile):
606+
name = 'header_transitive'
607+
version = '1.0'
608+
settings = 'os', 'compiler', 'arch', 'build_type'
609+
package_type = 'header-library'
610+
def package_info(self):
611+
self.cpp_info.includedirs = ["include"]
612+
""")
613+
614+
header_skip = textwrap.dedent("""
615+
from conan import ConanFile
616+
class PkgUsesComponent(ConanFile):
617+
name = 'header_skip'
618+
version = '1.0'
619+
settings = 'os', 'compiler', 'arch', 'build_type'
620+
package_type = 'header-library'
621+
def package_info(self):
622+
self.cpp_info.includedirs = ["include"]
623+
""")
624+
625+
client.save({"header_transitive.py": header_transitive,
626+
"header_skip.py": header_skip,
627+
"regular_lib.py": regular_lib})
628+
client.run("create header_transitive.py")
629+
client.run("create header_skip.py")
630+
client.run("create regular_lib.py")
631+
client.run("install --requires=regular_lib/1.0 -g XcodeDeps")
632+
633+
conandeps = client.load("conan_regular_lib_component.xcconfig")
634+
assert '#include "conan_header_skip.xcconfig"' not in conandeps
635+
assert '#include "conan_header_transitive.xcconfig"' in conandeps
636+
637+
# Verify that header_skip xcconfig files are NOT generated (skipped dependency)
638+
skip_files = [f for f in os.listdir(client.current_folder) if 'header_skip' in f and f.endswith('.xcconfig')]
639+
assert len(skip_files) == 0, f"Header skip files should not be generated: {skip_files}"
640+
641+
# Verify that header_transitive xcconfig files ARE generated (transitive dependency)
642+
transitive_files = [f for f in os.listdir(client.current_folder) if 'header_transitive' in f and f.endswith('.xcconfig')]
643+
assert len(transitive_files) > 0, f"Header transitive files should be generated: {transitive_files}"

0 commit comments

Comments
 (0)