def _call_package_info(self, conanfile, package_folder, ref): conanfile.cpp_info = CppInfo(conanfile.name, package_folder) conanfile.cpp_info.version = conanfile.version conanfile.cpp_info.description = conanfile.description conanfile.env_info = EnvInfo() conanfile.user_info = UserInfo() # Get deps_cpp_info from upstream nodes public_deps = [name for name, req in conanfile.requires.items() if not req.private and not req.override] conanfile.cpp_info.public_deps = public_deps # Once the node is build, execute package info, so it has access to the # package folder and artifacts conan_v2 = get_env(CONAN_V2_MODE_ENVVAR, False) with pythonpath(conanfile) if not conan_v2 else no_op(): # Minimal pythonpath, not the whole context, make it 50% slower with tools.chdir(package_folder): with conanfile_exception_formatter(str(conanfile), "package_info"): conanfile.package_folder = package_folder conanfile.source_folder = None conanfile.build_folder = None conanfile.install_folder = None self._hook_manager.execute("pre_package_info", conanfile=conanfile, reference=ref) conanfile.package_info() if conanfile._conan_dep_cpp_info is None: try: conanfile.cpp_info._raise_incorrect_components_definition( conanfile.name, conanfile.requires) except ConanException as e: raise ConanException("%s package_info(): %s" % (str(conanfile), e)) conanfile._conan_dep_cpp_info = DepCppInfo(conanfile.cpp_info) self._hook_manager.execute("post_package_info", conanfile=conanfile, reference=ref)
def _call_package_info(conanfile, package_folder): conanfile.cpp_info = CppInfo(package_folder) conanfile.cpp_info.version = conanfile.version conanfile.cpp_info.description = conanfile.description conanfile.env_info = EnvInfo() conanfile.user_info = UserInfo() # Get deps_cpp_info from upstream nodes public_deps = [ name for name, req in conanfile.requires.items() if not req.private ] conanfile.cpp_info.public_deps = public_deps # Once the node is build, execute package info, so it has access to the # package folder and artifacts with pythonpath( conanfile ): # Minimal pythonpath, not the whole context, make it 50% slower with tools.chdir(package_folder): with conanfile_exception_formatter(str(conanfile), "package_info"): conanfile.package_folder = package_folder conanfile.source_folder = None conanfile.build_folder = None conanfile.install_folder = None conanfile.package_info()
def _init_package_info(deps_graph, paths, current_path): for node in deps_graph.nodes: conan_ref, conan_file = node if conan_ref: package_id = conan_file.info.package_id() package_reference = PackageReference(conan_ref, package_id) package_folder = paths.package(package_reference, conan_file.short_paths) conan_file.package_folder = package_folder conan_file.cpp_info = CppInfo(package_folder) else: conan_file.cpp_info = CppInfo(current_path) conan_file.env_info = EnvInfo() conan_file.user_info = UserInfo()
def _call_package_info(self, conanfile, package_folder, ref): conanfile.cpp_info = CppInfo(conanfile.name, package_folder) conanfile.cpp_info.version = conanfile.version conanfile.cpp_info.description = conanfile.description conanfile.env_info = EnvInfo() conanfile.user_info = UserInfo() # Get deps_cpp_info from upstream nodes public_deps = [ name for name, req in conanfile.requires.items() if not req.private and not req.override ] conanfile.cpp_info.public_deps = public_deps # Once the node is build, execute package info, so it has access to the # package folder and artifacts # Minimal pythonpath, not the whole context, make it 50% slower # FIXME Conan 2.0, Remove old ways of reusing python code with pythonpath(conanfile): with tools.chdir(package_folder): with conanfile_exception_formatter(str(conanfile), "package_info"): conanfile.layout.set_base_package_folder(package_folder) conanfile.layout.set_base_source_folder(None) conanfile.layout.set_base_build_folder(None) conanfile.layout.set_base_install_folder(None) self._hook_manager.execute("pre_package_info", conanfile=conanfile, reference=ref) conanfile.package_info() if conanfile._conan_dep_cpp_info is None: try: conanfile.cpp_info._raise_incorrect_components_definition( conanfile.name, conanfile.requires) except ConanException as e: raise ConanException("%s package_info(): %s" % (str(conanfile), e)) conanfile._conan_dep_cpp_info = DepCppInfo( conanfile.cpp_info) self._hook_manager.execute("post_package_info", conanfile=conanfile, reference=ref)
def test_user_info(self): conanfile = ConanFile(Mock(), None) conanfile.initialize(Settings({}), EnvValues()) user_info = UserInfo() user_info.VAR1 = "value1" conanfile.deps_user_info["my_pkg"] = user_info user_info = UserInfo() user_info.VAR1 = "other-value1" conanfile.deps_user_info["other-pkg"] = user_info generator = TXTGenerator(conanfile) txt_out = generator.content self.assertIn( textwrap.dedent(""" [USER_my_pkg] VAR1=value1 [USER_other-pkg] VAR1=other-value1"""), txt_out)
def test_user_info_build(self): conanfile = ConanFile(TestBufferConanOutput(), None) conanfile.initialize(Settings({}), EnvValues()) conanfile.user_info_build = DepsUserInfo() user_info = UserInfo() user_info.VAR1 = "value1" conanfile.user_info_build["build_pkg"] = user_info user_info = UserInfo() user_info.VAR1 = "other-value1" conanfile.user_info_build["other-build-pkg"] = user_info generator = TXTGenerator(conanfile) txt_out = generator.content self.assertIn( textwrap.dedent(""" [USERBUILD_build_pkg] VAR1=value1 [USERBUILD_other-build-pkg] VAR1=other-value1"""), txt_out)
def _call_package_info(self, conanfile, package_folder, ref, is_editable): conanfile.cpp_info = CppInfo(conanfile.name, package_folder) conanfile.cpp_info.version = conanfile.version conanfile.cpp_info.description = conanfile.description conanfile.env_info = EnvInfo() conanfile.user_info = UserInfo() # Get deps_cpp_info from upstream nodes public_deps = [ name for name, req in conanfile.requires.items() if not req.private and not req.override ] conanfile.cpp_info.public_deps = public_deps # Once the node is build, execute package info, so it has access to the # package folder and artifacts # Minimal pythonpath, not the whole context, make it 50% slower # FIXME Conan 2.0, Remove old ways of reusing python code with pythonpath(conanfile): with tools.chdir(package_folder): with conanfile_exception_formatter(str(conanfile), "package_info"): self._hook_manager.execute("pre_package_info", conanfile=conanfile, reference=ref) if hasattr(conanfile, "layout"): # Old cpp info without defaults (the defaults are in the new one) conanfile.cpp_info = CppInfo( conanfile.name, package_folder, default_values=CppInfoDefaultValues()) if not is_editable: conanfile.cpp.package.set_relative_base_folder( conanfile.package_folder) # Copy the infos.package into the old cppinfo fill_old_cppinfo(conanfile.cpp.package, conanfile.cpp_info) else: conanfile.cpp_info.filter_empty = False conanfile.package_info() if hasattr(conanfile, "layout") and is_editable: # Adjust the folders of the layout to consolidate the rootfolder of the # cppinfos inside # convert directory entries to be relative to the declared folders.build conanfile.cpp.build.set_relative_base_folder( conanfile.build_folder) # convert directory entries to be relative to the declared folders.source conanfile.cpp.source.set_relative_base_folder( conanfile.source_folder) full_editable_cppinfo = NewCppInfo() full_editable_cppinfo.merge(conanfile.cpp.source) full_editable_cppinfo.merge(conanfile.cpp.build) # Paste the editable cpp_info but prioritizing it, only if a # variable is not declared at build/source, the package will keep the value fill_old_cppinfo(full_editable_cppinfo, conanfile.cpp_info) if conanfile._conan_dep_cpp_info is None: try: if not is_editable and not hasattr( conanfile, "layout"): # FIXME: The default for the cppinfo from build are not the same # so this check fails when editable # FIXME: Remove when new cppinfo model. If using the layout method # the cppinfo object is filled from self.cpp.package new # model and we cannot check if the defaults have been modified # because it doesn't exist in the new model where the defaults # for the components are always empty conanfile.cpp_info._raise_incorrect_components_definition( conanfile.name, conanfile.requires) except ConanException as e: raise ConanException("%s package_info(): %s" % (str(conanfile), e)) conanfile._conan_dep_cpp_info = DepCppInfo( conanfile.cpp_info) self._hook_manager.execute("post_package_info", conanfile=conanfile, reference=ref)
def test_idempotent(self): conanfile = ConanFile(Mock(), None) conanfile.initialize(Settings({}), EnvValues()) # Add some cpp_info ref = ConanFileReference.loads("MyPkg/0.1@lasote/stables") cpp_info = CppInfo(ref.name, "dummy_root_folder1") cpp_info.names["txt"] = "mypkg1-txt" cpp_info.version = ref.version cpp_info.defines = ["MYDEFINE1"] cpp_info.cxxflags = ["-cxxflag_parent"] cpp_info.includedirs = ["mypkg1/include"] cpp_info.filter_empty = False 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 conanfile.deps_cpp_info.add(ref.name, cpp_info) # Add env_info env_info = EnvInfo() env_info.VAR1 = "value1" env_info.PATH.append("path-extended") conanfile.deps_env_info.update(env_info, "my_pkg") env_info = EnvInfo() env_info.VAR1 = "other-value1" env_info.PATH.append("other-path-extended") conanfile.deps_env_info.update(env_info, "other-pkg") # Add user_info for HOST user_info = UserInfo() user_info.VAR1 = "value1" conanfile.deps_user_info["my_pkg"] = user_info user_info = UserInfo() user_info.VAR1 = "other-value1" conanfile.deps_user_info["other-pkg"] = user_info # Add user_info for BUILD conanfile.user_info_build = DepsUserInfo() user_info = UserInfo() user_info.VAR1 = "value1" conanfile.user_info_build["build_pkg"] = user_info user_info = UserInfo() user_info.VAR1 = "other-value1" conanfile.user_info_build["other-build-pkg"] = user_info master_content = TXTGenerator(conanfile).content after_cpp_info, after_user_info, after_env_info, after_user_info_build = \ TXTGenerator.loads(master_content, filter_empty=False) # Assign them to a different conanfile other_conanfile = ConanFile(Mock(), None) other_conanfile.initialize(Settings({}), EnvValues()) other_conanfile.deps_cpp_info = after_cpp_info other_conanfile.deps_env_info = after_env_info other_conanfile.deps_user_info = after_user_info other_conanfile.user_info_build = after_user_info_build after_content = TXTGenerator(other_conanfile).content self.assertListEqual(master_content.splitlines(), after_content.splitlines())
def variables_setup_test(self): conanfile = ConanFile(TestBufferConanOutput(), None) conanfile.initialize(Settings({}), EnvValues()) # Add some cpp_info for dependencies ref = ConanFileReference.loads("MyPkg/0.1@lasote/stables") cpp_info = CppInfo(ref.name, "dummy_root_folder1") cpp_info.defines = ["MYDEFINE1"] cpp_info.cflags.append("-Flag1=23") cpp_info.version = "1.3" cpp_info.description = "My cool description" 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.version = "2.3" cpp_info.exelinkflags = ["-exelinkflag"] cpp_info.sharedlinkflags = ["-sharedlinkflag"] cpp_info.cxxflags = ["-cxxflag"] cpp_info.public_deps = ["MyPkg"] conanfile.deps_cpp_info.add(ref.name, cpp_info) # Add env_info env_info = EnvInfo() env_info.VAR1 = "env_info-value1" env_info.PATH.append("path-extended") conanfile.deps_env_info.update(env_info, "env_info_pkg") # Add user_info user_info = UserInfo() user_info.VAR1 = "user_info-value1" conanfile.deps_user_info["user_info_pkg"] = user_info # Add user_info_build conanfile.user_info_build = DepsUserInfo() user_info = UserInfo() user_info.VAR1 = "user_info_build-value1" conanfile.user_info_build["user_info_build_pkg"] = user_info generator = JsonGenerator(conanfile) json_out = generator.content parsed = json.loads(json_out) # Check dependencies dependencies = parsed["dependencies"] self.assertEqual(len(dependencies), 2) my_pkg = dependencies[0] self.assertEqual(my_pkg["name"], "MyPkg") self.assertEqual(my_pkg["description"], "My cool description") self.assertEqual(my_pkg["defines"], ["MYDEFINE1"]) # Check env_info env_info = parsed["deps_env_info"] self.assertListEqual(sorted(env_info.keys()), sorted(["VAR1", "PATH"])) self.assertEqual(env_info["VAR1"], "env_info-value1") self.assertListEqual(env_info["PATH"], ["path-extended"]) # Check user_info user_info = parsed["deps_user_info"] self.assertListEqual(list(user_info.keys()), ["user_info_pkg"]) self.assertListEqual(list(user_info["user_info_pkg"].keys()), ["VAR1"]) self.assertEqual(user_info["user_info_pkg"]["VAR1"], "user_info-value1") # Check user_info_build user_info_build = parsed["user_info_build"] self.assertListEqual(list(user_info_build.keys()), ["user_info_build_pkg"]) self.assertListEqual( list(user_info_build["user_info_build_pkg"].keys()), ["VAR1"]) self.assertEqual(user_info_build["user_info_build_pkg"]["VAR1"], "user_info_build-value1")