Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplify XcodeDeps generator #11491

Merged
merged 5 commits into from Jun 21, 2022
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
53 changes: 11 additions & 42 deletions conan/tools/apple/xcodedeps.py
Expand Up @@ -59,36 +59,17 @@ def _add_includes_to_file_or_create(filename, template, files_to_include):
class XcodeDeps(object):
general_name = "conandeps.xcconfig"

_vars_xconfig = textwrap.dedent("""\
// Definition of Conan variables for {{pkg_name}}::{{comp_name}}
CONAN_{{pkg_name}}_{{comp_name}}_BINARY_DIRECTORIES{{condition}} = {{bin_dirs}}
CONAN_{{pkg_name}}_{{comp_name}}_C_COMPILER_FLAGS{{condition}} = {{c_compiler_flags}}
CONAN_{{pkg_name}}_{{comp_name}}_CXX_COMPILER_FLAGS{{condition}} = {{cxx_compiler_flags}}
CONAN_{{pkg_name}}_{{comp_name}}_LINKER_FLAGS{{condition}} = {{linker_flags}}
CONAN_{{pkg_name}}_{{comp_name}}_PREPROCESSOR_DEFINITIONS{{condition}} = {{definitions}}
CONAN_{{pkg_name}}_{{comp_name}}_INCLUDE_DIRECTORIES{{condition}} = {{include_dirs}}
CONAN_{{pkg_name}}_{{comp_name}}_RESOURCE_DIRECTORIES{{condition}} = {{res_dirs}}
CONAN_{{pkg_name}}_{{comp_name}}_LIBRARY_DIRECTORIES{{condition}} = {{lib_dirs}}
CONAN_{{pkg_name}}_{{comp_name}}_LIBRARIES{{condition}} = {{libs}}
CONAN_{{pkg_name}}_{{comp_name}}_SYSTEM_LIBS{{condition}} = {{system_libs}}
CONAN_{{pkg_name}}_{{comp_name}}_FRAMEWORKS_DIRECTORIES{{condition}} = {{frameworkdirs}}
CONAN_{{pkg_name}}_{{comp_name}}_FRAMEWORKS{{condition}} = {{frameworks}}
""")

_conf_xconfig = textwrap.dedent("""\
// Include {{pkg_name}}::{{comp_name}} vars
#include "{{vars_filename}}"

// Compiler options for {{pkg_name}}::{{pkg_name}}
HEADER_SEARCH_PATHS_{{pkg_name}}_{{comp_name}} = $(CONAN_{{pkg_name}}_{{comp_name}}_INCLUDE_DIRECTORIES)
GCC_PREPROCESSOR_DEFINITIONS_{{pkg_name}}_{{comp_name}} = $(CONAN_{{pkg_name}}_{{comp_name}}_PREPROCESSOR_DEFINITIONS)
OTHER_CFLAGS_{{pkg_name}}_{{comp_name}} = $(CONAN_{{pkg_name}}_{{comp_name}}_C_COMPILER_FLAGS)
OTHER_CPLUSPLUSFLAGS_{{pkg_name}}_{{comp_name}} = $(CONAN_{{pkg_name}}_{{comp_name}}_CXX_COMPILER_FLAGS)
FRAMEWORK_SEARCH_PATHS_{{pkg_name}}_{{comp_name}} = $(CONAN_{{pkg_name}}_{{comp_name}}_FRAMEWORKS_DIRECTORIES)
HEADER_SEARCH_PATHS_{{pkg_name}}_{{comp_name}}{{condition}} = {{include_dirs}}
GCC_PREPROCESSOR_DEFINITIONS_{{pkg_name}}_{{comp_name}}{{condition}} = {{definitions}}
OTHER_CFLAGS_{{pkg_name}}_{{comp_name}}{{condition}} = {{c_compiler_flags}}
OTHER_CPLUSPLUSFLAGS_{{pkg_name}}_{{comp_name}}{{condition}} = {{cxx_compiler_flags}}
FRAMEWORK_SEARCH_PATHS_{{pkg_name}}_{{comp_name}}{{condition}} = {{frameworkdirs}}

// Link options for {{name}}
LIBRARY_SEARCH_PATHS_{{pkg_name}}_{{comp_name}} = $(CONAN_{{pkg_name}}_{{comp_name}}_LIBRARY_DIRECTORIES)
OTHER_LDFLAGS_{{pkg_name}}_{{comp_name}} = $(CONAN_{{pkg_name}}_{{comp_name}}_LINKER_FLAGS) $(CONAN_{{pkg_name}}_{{comp_name}}_LIBRARIES) $(CONAN_{{pkg_name}}_{{comp_name}}_SYSTEM_LIBS) $(CONAN_{{pkg_name}}_{{comp_name}}_FRAMEWORKS)
LIBRARY_SEARCH_PATHS_{{pkg_name}}_{{comp_name}}{{condition}} = {{lib_dirs}}
OTHER_LDFLAGS_{{pkg_name}}_{{comp_name}}{{condition}} = {{linker_flags}} {{libs}} {{system_libs}} {{frameworks}}
""")

_dep_xconfig = textwrap.dedent("""\
Expand Down Expand Up @@ -140,16 +121,14 @@ def generate(self):
for generator_file, content in generator_files.items():
save(generator_file, content)

def _vars_xconfig_file(self, pkg_name, comp_name, cpp_info):
def _conf_xconfig_file(self, pkg_name, comp_name, cpp_info):
"""
returns a .xcconfig file with the variables definition for one package for one configuration
content for conan_poco_x86_release.xcconfig, containing the activation
"""

fields = {
'pkg_name': pkg_name,
'comp_name': comp_name,
'bin_dirs': " ".join('"{}"'.format(p) for p in cpp_info.bindirs),
'res_dirs': " ".join('"{}"'.format(p) for p in cpp_info.resdirs),
'include_dirs': " ".join('"{}"'.format(p) for p in cpp_info.includedirs),
'lib_dirs': " ".join('"{}"'.format(p) for p in cpp_info.libdirs),
'libs': " ".join("-l{}".format(lib) for lib in cpp_info.libs),
Expand All @@ -163,16 +142,9 @@ def _vars_xconfig_file(self, pkg_name, comp_name, cpp_info):
'exe_flags': " ".join('"{}"'.format(p.replace('"', '\\"')) for p in cpp_info.exelinkflags),
'condition': _xcconfig_conditional(self._conanfile.settings)
}
formatted_template = Template(self._vars_xconfig).render(**fields)
return formatted_template

def _conf_xconfig_file(self, pkg_name, comp_name, vars_xconfig_name):
"""
content for conan_poco_x86_release.xcconfig, containing the activation
"""
template = Template(self._conf_xconfig)
content_multi = template.render(pkg_name=pkg_name, comp_name=comp_name,
vars_filename=vars_xconfig_name)
content_multi = template.render(**fields)
return content_multi

def _dep_xconfig_file(self, pkg_name, comp_name, name_general, dep_xconfig_filename, reqs):
Expand Down Expand Up @@ -225,12 +197,9 @@ def get_content_for_component(self, pkg_name, component_name, cpp_info, reqs):
result = {}

conf_name = _xcconfig_settings_filename(self._conanfile.settings)
# One file per configuration, with just the variables
vars_xconfig_name = "conan_{}_{}_vars{}.xcconfig".format(pkg_name, component_name, conf_name)
result[vars_xconfig_name] = self._vars_xconfig_file(pkg_name, component_name, cpp_info)

props_name = "conan_{}_{}{}.xcconfig".format(pkg_name, component_name, conf_name)
result[props_name] = self._conf_xconfig_file(pkg_name, component_name, vars_xconfig_name)
result[props_name] = self._conf_xconfig_file(pkg_name, component_name, cpp_info)

# The entry point for each package
file_dep_name = "conan_{}_{}.xcconfig".format(pkg_name, component_name)
Expand Down
Expand Up @@ -114,7 +114,7 @@ def test_xcodedeps_dashes_names_and_arch():
"project.yml": xcode_project}, clean_first=True)
client.run("install . -s arch=armv8 --build=missing -g XcodeDeps")
assert os.path.exists(os.path.join(client.current_folder,
"conan_hello_dashes_hello_dashes_vars_release_arm64.xcconfig"))
"conan_hello_dashes_hello_dashes_release_arm64.xcconfig"))
client.run_command("xcodegen generate")
client.run_command("xcodebuild -project app.xcodeproj -arch arm64")
assert "BUILD SUCCEEDED" in client.out
Expand Down
Expand Up @@ -225,5 +225,4 @@ def build_requirements(self):
assert os.path.isfile(os.path.join(client.current_folder, "conan_gtest.xcconfig"))
assert os.path.isfile(os.path.join(client.current_folder, "conan_gtest_gtest.xcconfig"))
assert os.path.isfile(os.path.join(client.current_folder, "conan_gtest_gtest_release_x86_64.xcconfig"))
assert os.path.isfile(os.path.join(client.current_folder, "conan_gtest_gtest_vars_release_x86_64.xcconfig"))
assert '#include "conan_gtest.xcconfig"' in client.load("conandeps.xcconfig")
43 changes: 9 additions & 34 deletions conans/test/integration/toolchains/apple/test_xcodedeps.py
Expand Up @@ -17,30 +17,14 @@
"OTHER_LDFLAGS = $(inherited) $(OTHER_LDFLAGS_{name}_{name})",
]

_expected_vars_xconfig = [
"CONAN_{name}_{name}_BINARY_DIRECTORIES[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] =",
"CONAN_{name}_{name}_C_COMPILER_FLAGS[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] =",
"CONAN_{name}_{name}_CXX_COMPILER_FLAGS[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] =",
"CONAN_{name}_{name}_LINKER_FLAGS[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] =",
"CONAN_{name}_{name}_PREPROCESSOR_DEFINITIONS[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] =",
"CONAN_{name}_{name}_INCLUDE_DIRECTORIES[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] =",
"CONAN_{name}_{name}_RESOURCE_DIRECTORIES[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] =",
"CONAN_{name}_{name}_LIBRARY_DIRECTORIES[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] =",
"CONAN_{name}_{name}_LIBRARIES[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] = -l{name}",
"CONAN_{name}_{name}_SYSTEM_LIBS[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] =",
"CONAN_{name}_{name}_FRAMEWORKS_DIRECTORIES[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] =",
"CONAN_{name}_{name}_FRAMEWORKS[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] = -framework framework_{name}"
]

_expected_conf_xconfig = [
"#include \"{vars_name}\"",
"HEADER_SEARCH_PATHS_{name}_{name} = $(CONAN_{name}_{name}_INCLUDE_DIRECTORIES",
"GCC_PREPROCESSOR_DEFINITIONS_{name}_{name} = $(CONAN_{name}_{name}_PREPROCESSOR_DEFINITIONS",
"OTHER_CFLAGS_{name}_{name} = $(CONAN_{name}_{name}_C_COMPILER_FLAGS",
"OTHER_CPLUSPLUSFLAGS_{name}_{name} = $(CONAN_{name}_{name}_CXX_COMPILER_FLAGS",
"FRAMEWORK_SEARCH_PATHS_{name}_{name} = $(CONAN_{name}_{name}_FRAMEWORKS_DIRECTORIES",
"LIBRARY_SEARCH_PATHS_{name}_{name} = $(CONAN_{name}_{name}_LIBRARY_DIRECTORIES",
"OTHER_LDFLAGS_{name}_{name} = $(CONAN_{name}_{name}_LINKER_FLAGS) $(CONAN_{name}_{name}_LIBRARIES) $(CONAN_{name}_{name}_SYSTEM_LIBS) $(CONAN_{name}_{name}_FRAMEWORKS"
"HEADER_SEARCH_PATHS_{name}_{name}[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] = ",
"GCC_PREPROCESSOR_DEFINITIONS_{name}_{name}[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] = ",
"OTHER_CFLAGS_{name}_{name}[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] = ",
"OTHER_CPLUSPLUSFLAGS_{name}_{name}[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] = ",
"FRAMEWORK_SEARCH_PATHS_{name}_{name}[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] = ",
"LIBRARY_SEARCH_PATHS_{name}_{name}[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] = ",
"OTHER_LDFLAGS_{name}_{name}[config={configuration}][arch={architecture}][sdk={sdk}{sdk_version}] = "
]


Expand All @@ -50,8 +34,6 @@ def expected_files(current_folder, configuration, architecture, sdk, sdk_version
deps = ["hello", "goodbye"]
files.extend(
[os.path.join(current_folder, "conan_{dep}_{dep}{name}.xcconfig".format(dep=dep, name=name)) for dep in deps])
files.extend(
[os.path.join(current_folder, "conan_{dep}_{dep}_vars{name}.xcconfig".format(dep=dep, name=name)) for dep in deps])
files.append(os.path.join(current_folder, "conandeps.xcconfig"))
return files

Expand All @@ -67,17 +49,10 @@ def check_contents(client, deps, configuration, architecture, sdk, sdk_version):
line = var.format(name=dep_name)
assert line in dep_xconfig

vars_name = "conan_{}_{}_vars{}.xcconfig".format(dep_name, dep_name,
_get_filename(configuration, architecture, sdk, sdk_version))
conan_vars = client.load(vars_name)
for var in _expected_vars_xconfig:
line = var.format(name=dep_name, configuration=configuration, architecture=architecture,
sdk=sdk, sdk_version=sdk_version)
assert line in conan_vars

conan_conf = client.load(conf_name)
for var in _expected_conf_xconfig:
assert var.format(vars_name=vars_name, name=dep_name) in conan_conf
assert var.format(name=dep_name, configuration=configuration, architecture=architecture,
sdk=sdk, sdk_version=sdk_version) in conan_conf


@pytest.mark.skipif(platform.system() != "Darwin", reason="Only for MacOS")
Expand Down