diff --git a/conans/model/build_info.py b/conans/model/build_info.py index 92133bb5995..fed762aa936 100644 --- a/conans/model/build_info.py +++ b/conans/model/build_info.py @@ -27,31 +27,46 @@ def __init__(self): self.exelinkflags = [] # linker flags self.rootpath = "" self.sysroot = None + self._include_paths = None + self._lib_paths = None + self._bin_paths = None + self._build_paths = None + self._res_paths = None + + def _filter_paths(self, paths): + abs_paths = [os.path.join(self.rootpath, p) + if not os.path.isabs(p) else p for p in paths] + return [p for p in abs_paths if os.path.isdir(p)] @property def include_paths(self): - return [os.path.join(self.rootpath, p) - if not os.path.isabs(p) else p for p in self.includedirs] + if self._include_paths is None: + self._include_paths = self._filter_paths(self.includedirs) + return self._include_paths @property def lib_paths(self): - return [os.path.join(self.rootpath, p) - if not os.path.isabs(p) else p for p in self.libdirs] + if self._lib_paths is None: + self._lib_paths = self._filter_paths(self.libdirs) + return self._lib_paths @property def bin_paths(self): - return [os.path.join(self.rootpath, p) - if not os.path.isabs(p) else p for p in self.bindirs] + if self._bin_paths is None: + self._bin_paths = self._filter_paths(self.bindirs) + return self._bin_paths @property def build_paths(self): - return [os.path.join(self.rootpath, p) - if not os.path.isabs(p) else p for p in self.builddirs] + if self._build_paths is None: + self._build_paths = self._filter_paths(self.builddirs) + return self._build_paths @property def res_paths(self): - return [os.path.join(self.rootpath, p) - if not os.path.isabs(p) else p for p in self.resdirs] + if self._res_paths is None: + self._res_paths = self._filter_paths(self.resdirs) + return self._res_paths class CppInfo(_CppInfo): diff --git a/conans/test/command/build_test.py b/conans/test/command/build_test.py index 18eb7fbbfbe..e0da0f1b0bf 100644 --- a/conans/test/command/build_test.py +++ b/conans/test/command/build_test.py @@ -21,10 +21,15 @@ def build(self): conanfile_dep = """ from conans import ConanFile +from conans.tools import mkdir +import os class AConan(ConanFile): name = "Hello" version = "0.1" + + def package(self): + mkdir(os.path.join(self.package_folder, "include")) """ diff --git a/conans/test/integration/conan_env_test.py b/conans/test/integration/conan_env_test.py index d907ea0ddad..5031a6458e7 100644 --- a/conans/test/integration/conan_env_test.py +++ b/conans/test/integration/conan_env_test.py @@ -264,6 +264,8 @@ def test_run_env(self): client = TestClient() conanfile = ''' from conans import ConanFile +from conans.tools import mkdir +import os class HelloConan(ConanFile): name = "Hello" @@ -271,6 +273,8 @@ class HelloConan(ConanFile): build_policy = "missing" def package_info(self): + mkdir(os.path.join(self.package_folder, "bin2")) + mkdir(os.path.join(self.package_folder, "lib2")) self.cpp_info.bindirs.append("bin2") self.cpp_info.libdirs.append("lib2") diff --git a/conans/test/integration/flat_requirements_test.py b/conans/test/integration/flat_requirements_test.py index c1e5c4463d0..98a652f9379 100644 --- a/conans/test/integration/flat_requirements_test.py +++ b/conans/test/integration/flat_requirements_test.py @@ -15,6 +15,14 @@ def setUp(self): self.conan_reference = ConanFileReference.loads("Hello0/0.1@lasote/stable") self.files = cpp_hello_conan_files("Hello0", "0.1", build=False) self.conan = TestClient() + package = """def package(self): + import os + os.mkdir(os.path.join(self.package_folder, "include")) + os.mkdir(os.path.join(self.package_folder, "lib")) + os.mkdir(os.path.join(self.package_folder, "bin")) +""" + self.files["conanfile.py"] = self.files["conanfile.py"].replace("def package(self):", + package) self.conan.save(self.files) self.conan.run("export lasote/stable") diff --git a/conans/test/model/build_info_test.py b/conans/test/model/build_info_test.py index 0d64ee0c32a..15e0a8e3f26 100644 --- a/conans/test/model/build_info_test.py +++ b/conans/test/model/build_info_test.py @@ -6,6 +6,7 @@ from conans.model.env_info import DepsEnvInfo from conans.test.utils.test_files import temp_folder import platform +from conans.util.files import mkdir class BuildInfoTest(unittest.TestCase): @@ -102,13 +103,22 @@ def configs_test(self): def cpp_info_test(self): folder = temp_folder() + mkdir(os.path.join(folder, "include")) + mkdir(os.path.join(folder, "lib")) + mkdir(os.path.join(folder, "local_bindir")) + abs_folder = temp_folder() + abs_include = os.path.join(abs_folder, "usr/include") + abs_lib = os.path.join(abs_folder, "usr/lib") + abs_bin = os.path.join(abs_folder, "usr/bin") + mkdir(abs_include) + mkdir(abs_lib) + mkdir(abs_bin) info = CppInfo(folder) - info.includedirs.append("/usr/include") - info.libdirs.append("/usr/lib") - bin_abs_dir = "C:/usr/bin" if platform.system() == "Windows" else "/tmp" - info.bindirs.append(bin_abs_dir) + info.includedirs.append(abs_include) + info.libdirs.append(abs_lib) + info.bindirs.append(abs_bin) info.bindirs.append("local_bindir") - self.assertEqual(info.include_paths, [os.path.join(folder, "include"), "/usr/include"]) - self.assertEqual(info.lib_paths, [os.path.join(folder, "lib"), "/usr/lib"]) - self.assertEqual(info.bin_paths, [os.path.join(folder, "bin"), bin_abs_dir, + self.assertEqual(info.include_paths, [os.path.join(folder, "include"), abs_include]) + self.assertEqual(info.lib_paths, [os.path.join(folder, "lib"), abs_lib]) + self.assertEqual(info.bin_paths, [abs_bin, os.path.join(folder, "local_bindir")])