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

Alternative way of setting properties that depend on generator specific features. #8727

Merged
merged 60 commits into from Apr 15, 2021
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
c2c7644
wip
czoido Mar 26, 2021
76c0a2f
wip
czoido Mar 26, 2021
12bd1d4
wip
czoido Mar 26, 2021
5f6332d
wip
czoido Mar 26, 2021
f0dadfd
wip
czoido Mar 27, 2021
aaa11da
wip
czoido Mar 27, 2021
7825939
wip
czoido Mar 27, 2021
c0f6432
fix
czoido Mar 29, 2021
3f93a30
wip
czoido Mar 29, 2021
e8f3c6f
wip
czoido Mar 29, 2021
6183b0a
wip
czoido Mar 29, 2021
216d829
wip
czoido Mar 29, 2021
40b33f1
remove unused
czoido Mar 29, 2021
9838b46
wip
czoido Mar 29, 2021
9d820a8
wip
czoido Mar 29, 2021
dcac203
wip
czoido Mar 29, 2021
e7eee31
wip
czoido Mar 29, 2021
77dce8f
wip
czoido Mar 29, 2021
4c6c42b
minor changes
czoido Mar 29, 2021
39a31db
wip
czoido Mar 29, 2021
3bb2de4
fix local flow
czoido Mar 30, 2021
919b5d2
wip
czoido Mar 30, 2021
90e6299
simplify code
czoido Mar 31, 2021
785cdbe
change update function name
czoido Mar 31, 2021
ec0475f
generalize name
czoido Mar 31, 2021
234add7
start build modules support
czoido Mar 31, 2021
54f497d
wip
czoido Mar 31, 2021
edc7fc1
wip
czoido Apr 1, 2021
ade9123
update test
czoido Apr 1, 2021
3d51f94
old behaviour
czoido Apr 1, 2021
9a22ca5
wip
czoido Apr 1, 2021
5b04a78
wip
czoido Apr 2, 2021
82188cb
add custom content to pkg-config generator
czoido Apr 3, 2021
dcf3de9
add tests with components
czoido Apr 5, 2021
f1f4259
add some unit tests
czoido Apr 6, 2021
02c163d
remove translate
czoido Apr 6, 2021
6a9499f
revert changes
czoido Apr 6, 2021
45929da
revert changes
czoido Apr 6, 2021
90e578c
revert changes
czoido Apr 6, 2021
7121b3d
use other properties names
czoido Apr 6, 2021
8cf1d7c
update tests
czoido Apr 6, 2021
eaeb0c4
fix filename
czoido Apr 6, 2021
7e287c6
fix gets
czoido Apr 6, 2021
8aaa18c
add tests
czoido Apr 6, 2021
c5b4869
fix test
czoido Apr 6, 2021
2fa20cd
add note
czoido Apr 6, 2021
547b636
test multi
czoido Apr 6, 2021
65d29c3
move to integration
czoido Apr 6, 2021
bd839b3
fix name
czoido Apr 6, 2021
95a7d79
revert change
czoido Apr 6, 2021
cc89990
Merge branch 'develop' of github.com:conan-io/conan into feature/chan…
czoido Apr 6, 2021
491cc83
add more tests
czoido Apr 6, 2021
d83e979
remove argument
czoido Apr 6, 2021
85932a4
review
czoido Apr 7, 2021
97df85e
review
czoido Apr 7, 2021
e74d73c
minor refactor
czoido Apr 7, 2021
a7851e2
change name
czoido Apr 12, 2021
aed1359
fix stylistic things
czoido Apr 15, 2021
fe274a4
cache ret val
czoido Apr 15, 2021
a4b7e41
correct caching
memsharded Apr 15, 2021
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
1 change: 1 addition & 0 deletions conans/client/generators/text.py
Expand Up @@ -185,6 +185,7 @@ def _populate_cpp_info(_cpp_info, _data, _rootpath):
cpp_info_config = getattr(dep_cpp_info, config)
_populate_cpp_info(cpp_info_config, config_data, rootpath)

dep_cpp_info.update_generator_properties()
# Add to the dependecy list
deps_cpp_info.add(dep, DepCppInfo(dep_cpp_info))

Expand Down
1 change: 1 addition & 0 deletions conans/client/installer.py
Expand Up @@ -637,6 +637,7 @@ def _call_package_info(self, conanfile, package_folder, ref):
conanfile.name, conanfile.requires)
except ConanException as e:
raise ConanException("%s package_info(): %s" % (str(conanfile), e))
conanfile.cpp_info.update_generator_properties()
conanfile._conan_dep_cpp_info = DepCppInfo(conanfile.cpp_info)
self._hook_manager.execute("post_package_info", conanfile=conanfile,
reference=ref)
45 changes: 38 additions & 7 deletions conans/model/build_info.py
Expand Up @@ -104,6 +104,7 @@ class _CppInfo(object):

def __init__(self):
self._name = None
self._generator_properties = {}
self.names = {}
self.system_libs = [] # Ordered list of system libraries
self.includedirs = [] # Ordered list of include paths
Expand Down Expand Up @@ -209,14 +210,44 @@ def name(self):
def name(self, value):
self._name = value

def get_name(self, generator):
return self.names.get(generator, self._name)
def set_generator_property(self, property_name, value, generator=None):
czoido marked this conversation as resolved.
Show resolved Hide resolved
generator = generator or "conan_default_generators_value"
gen_dict = self._generator_properties.get(generator)
if gen_dict:
gen_dict.update({property_name: value})
else:
self._generator_properties.update({generator: {property_name: value}})
czoido marked this conversation as resolved.
Show resolved Hide resolved

def get_filename(self, generator):
result = self.filenames.get(generator)
if result:
return result
return self.get_name(generator)
def get_generator_property(self, property_name, generator=None):
generator = generator or "conan_default_generators_value"
try:
gen_dict = self._generator_properties.get(generator)
if gen_dict:
return gen_dict.get(property_name)
elif self._generator_properties.get("conan_default_generators_value"):
return self._generator_properties.get("conan_default_generators_value").get(property_name)
except KeyError:
czoido marked this conversation as resolved.
Show resolved Hide resolved
return None

def update_generator_properties(self):
czoido marked this conversation as resolved.
Show resolved Hide resolved
for _, component in self.components.items():
for generator, value in component.names.items():
component.set_generator_property("names", value, generator=generator)
component.set_generator_property("filenames", value, generator=generator)
for generator, value in component.filenames.items():
component.set_generator_property("filenames", value, generator=generator)

for generator, value in self.names.items():
self.set_generator_property("names", value, generator=generator)
self.set_generator_property("filenames", value, generator=generator)
for generator, value in self.filenames.items():
self.set_generator_property("filenames", value, generator=generator)

def get_name(self, generator=None):
return self.get_generator_property("names", generator) or self._name

def get_filename(self, generator=None):
return self.get_generator_property("filenames", generator) or self._name

# Compatibility for 'cppflags' (old style property to allow decoration)
def get_cppflags(self):
Expand Down
@@ -0,0 +1,142 @@
import os
import textwrap

import pytest

from conans.test.assets.genconanfile import GenConanfile
from conans.test.utils.tools import TestClient


@pytest.fixture(scope="module")
def setup_client():
client = TestClient()
custom_generator = textwrap.dedent("""
from conans.model import Generator
from conans import ConanFile
from conans.model.conan_generator import GeneratorComponentsMixin
import textwrap
import os

class custom_generator(GeneratorComponentsMixin, Generator):
name = "custom_generator"
@property
def filename(self):
return "my-generator.txt"

def _get_components(self, pkg_name, cpp_info):
components = super(custom_generator, self)._get_components(pkg_name, cpp_info)
ret = []
for comp_genname, comp, comp_requires_gennames in components:
ret.append("{}:{}".format(comp.name, comp_genname))
return ret

@property
def content(self):
info = []
for pkg_name, cpp_info in self.deps_build_info.dependencies:
info.append("{}:{}".format(pkg_name, cpp_info.get_generator_property("names", self.name)))
info.extend(self._get_components(pkg_name, cpp_info))
return os.linesep.join(info)
""")
client.save({"custom_generator.py": custom_generator})
client.run("config install custom_generator.py -tf generators")

client.save({"consumer.py": GenConanfile("consumer", "1.0").with_requires("mypkg/1.0").
with_generator("custom_generator").with_generator("cmake_find_package")})
return client


@pytest.mark.tool_cmake
def test_same_results_components(setup_client):
client = setup_client
mypkg = textwrap.dedent("""
import os
from conans import ConanFile, CMake, tools
class MyPkg(ConanFile):
name = "mypkg"
version = "1.0"
def package_info(self):
self.cpp_info.components["mycomponent"].libs = ["mycomponent-lib"]
self.cpp_info.components["mycomponent"].set_generator_property("names", "mycomponent-name")
""")

client.save({"mypkg.py": mypkg})
client.run("export mypkg.py")

client.run("install consumer.py --build missing")

with open(os.path.join(client.current_folder, "my-generator.txt")) as custom_gen_file:
assert "mycomponent:mycomponent-name" in custom_gen_file.read()

with open(os.path.join(client.current_folder, "Findmypkg.cmake")) as properties_package_file:
properties_find_package_content = properties_package_file.read()

mypkg = textwrap.dedent("""
import os
from conans import ConanFile, CMake, tools
class MyPkg(ConanFile):
name = "mypkg"
version = "1.0"
def package_info(self):
self.cpp_info.components["mycomponent"].libs = ["mycomponent-lib"]
self.cpp_info.components["mycomponent"].names["cmake_find_package"] = "mycomponent-name"
self.cpp_info.components["mycomponent"].names["custom_generator"] = "mycomponent-name"
""")
client.save({"mypkg.py": mypkg})
client.run("create mypkg.py")
client.run("install consumer.py")

with open(os.path.join(client.current_folder, "my-generator.txt")) as custom_gen_file:
assert "mycomponent:mycomponent-name" in custom_gen_file.read()

with open(os.path.join(client.current_folder, "Findmypkg.cmake")) as find_package_file:
normal_find_package_content = find_package_file.read()

assert properties_find_package_content == normal_find_package_content


@pytest.mark.tool_cmake
def test_same_results_without_components(setup_client):
client = setup_client
mypkg = textwrap.dedent("""
import os
from conans import ConanFile, CMake, tools
class MyPkg(ConanFile):
name = "mypkg"
version = "1.0"
def package_info(self):
self.cpp_info.set_generator_property("names", "mypkg-name")
""")

client.save({"mypkg.py": mypkg})
client.run("export mypkg.py")

client.run("install consumer.py --build missing")

with open(os.path.join(client.current_folder, "my-generator.txt")) as custom_gen_file:
assert "mypkg:mypkg-name" in custom_gen_file.read()

with open(os.path.join(client.current_folder, "Findmypkg.cmake")) as properties_package_file:
properties_find_package_content = properties_package_file.read()

mypkg = textwrap.dedent("""
import os
from conans import ConanFile, CMake, tools
class MyPkg(ConanFile):
name = "mypkg"
version = "1.0"
def package_info(self):
self.cpp_info.names["cmake_find_package"] = "mypkg-name"
self.cpp_info.names["custom_generator"] = "mypkg-name"
""")
client.save({"mypkg.py": mypkg})
client.run("create mypkg.py")
client.run("install consumer.py")

with open(os.path.join(client.current_folder, "my-generator.txt")) as custom_gen_file:
assert "mypkg:mypkg-name" in custom_gen_file.read()

with open(os.path.join(client.current_folder, "Findmypkg.cmake")) as find_package_file:
normal_find_package_content = find_package_file.read()

assert properties_find_package_content == normal_find_package_content
Expand Up @@ -76,6 +76,7 @@ def test_cpp_info_names(self):
cpp_info = CppInfo("pkg_reference_name", tmp)
cpp_info.name = "PkgCMakeName"
cpp_info.names["cmake_paths"] = "MyCMakePathsPkgName"
cpp_info.update_generator_properties()
conanfile.deps_cpp_info.add("pkg_reference_name", cpp_info)
generator = CMakePathsGenerator(conanfile)
self.assertIn('set(CONAN_MYCMAKEPATHSPKGNAME_ROOT', generator.content)
2 changes: 2 additions & 0 deletions conans/test/unittests/client/generators/cmake_test.py
Expand Up @@ -479,6 +479,7 @@ def setUp(self):
cpp_info.names["cmake_multi"] = "MyCMakeMultiName"
cpp_info.names["cmake_find_package"] = "MyCMakeFindPackageName"
cpp_info.names["cmake_find_package_multi"] = "MyCMakeFindPackageMultiName"
cpp_info.update_generator_properties()
self.conanfile.deps_cpp_info.add(ref.name, cpp_info)
ref = ConanFileReference.loads("my_pkg2/0.1@lasote/stables")
cpp_info = CppInfo(ref.name, "dummy_root_folder2")
Expand All @@ -488,6 +489,7 @@ def setUp(self):
cpp_info.names["cmake_find_package"] = "MyCMakeFindPackageName2"
cpp_info.names["cmake_find_package_multi"] = "MyCMakeFindPackageMultiName2"
cpp_info.public_deps = ["my_pkg"]
cpp_info.update_generator_properties()
self.conanfile.deps_cpp_info.add(ref.name, cpp_info)

def test_cmake(self):
Expand Down
Expand Up @@ -20,13 +20,14 @@ def test_names_per_generator(self):
cpp_info.names["txt"] = "txt_name"
cpp_info.names["cmake_find_package"] = "SpecialName"
cpp_info.filenames["cmake_find_package"] = "SpecialFileName"
cpp_info.update_generator_properties()
conanfile = ConanFile(Mock(), None)
conanfile.initialize(Settings({}), EnvValues())
conanfile.deps_cpp_info.add("pkg_name", DepCppInfo(cpp_info))
content = TXTGenerator(conanfile).content
parsed_deps_cpp_info, _, _, _ = TXTGenerator.loads(content, filter_empty=False)

parsed_cpp_info = parsed_deps_cpp_info["pkg_name"]
parsed_cpp_info.update_generator_properties()
self.assertEqual(parsed_cpp_info.get_name("txt"), "txt_name")
self.assertEqual(parsed_cpp_info.get_name("cmake_find_package"), "SpecialName")
self.assertEqual(parsed_cpp_info.get_filename("cmake_find_package"), "SpecialFileName")
Expand All @@ -45,13 +46,15 @@ def test_idempotent(self):
cpp_info.cxxflags = ["-cxxflag_parent"]
cpp_info.includedirs = ["mypkg1/include"]
cpp_info.filter_empty = False
cpp_info.update_generator_properties()
conanfile.deps_cpp_info.add(ref.name, cpp_info)

ref = ConanFileReference.loads("MyPkg2/0.1@lasote/stables")
cpp_info = CppInfo(ref.name, "dummy_root_folder2")
cpp_info.defines = ["MYDEFINE2"]
cpp_info.cxxflags = ["-cxxflag_dep"]
cpp_info.filter_empty = False
cpp_info.update_generator_properties()
conanfile.deps_cpp_info.add(ref.name, cpp_info)

# Add env_info
Expand Down
1 change: 1 addition & 0 deletions conans/test/unittests/model/build_info_test.py
Expand Up @@ -233,6 +233,7 @@ def test_cpp_info_name(self):
info = CppInfo("myname", folder)
info.name = "MyName"
info.names["my_generator"] = "MyNameForMyGenerator"
info.update_generator_properties()
deps_cpp_info = DepsCppInfo()
deps_cpp_info.add("myname", DepCppInfo(info))
self.assertIn("MyName", deps_cpp_info["myname"].get_name("my_undefined_generator"))
Expand Down