diff --git a/conans/client/installer.py b/conans/client/installer.py index 9ebe38b75a0..1f35bdfac08 100644 --- a/conans/client/installer.py +++ b/conans/client/installer.py @@ -191,35 +191,35 @@ def build_package(self, node, keep_build, recorder, remotes): with package_layout.conanfile_read_lock(self._output): _remove_folder_raising(package_folder) mkdir(build_folder) - os.chdir(build_folder) - self._output.info('Building your package in %s' % build_folder) - try: - if getattr(conanfile, 'no_copy_source', False): - conanfile.source_folder = source_folder - else: - conanfile.source_folder = build_folder - - if not skip_build: - with get_env_context_manager(conanfile): - conanfile.build_folder = build_folder - conanfile.package_folder = package_folder - # In local cache, install folder always is build_folder - conanfile.install_folder = build_folder - self._build(conanfile, pref, build_folder) - clean_dirty(build_folder) - - prev = self._package(conanfile, pref, package_layout, conanfile_path, build_folder, - package_folder) - assert prev - node.prev = prev - log_file = os.path.join(build_folder, RUN_LOG_NAME) - log_file = log_file if os.path.exists(log_file) else None - log_package_built(pref, time.time() - t1, log_file) - recorder.package_built(pref) - except ConanException as exc: - recorder.package_install_error(pref, INSTALL_ERROR_BUILDING, - str(exc), remote_name=None) - raise exc + with tools.chdir(build_folder): + self._output.info('Building your package in %s' % build_folder) + try: + if getattr(conanfile, 'no_copy_source', False): + conanfile.source_folder = source_folder + else: + conanfile.source_folder = build_folder + + if not skip_build: + with get_env_context_manager(conanfile): + conanfile.build_folder = build_folder + conanfile.package_folder = package_folder + # In local cache, install folder always is build_folder + conanfile.install_folder = build_folder + self._build(conanfile, pref, build_folder) + clean_dirty(build_folder) + + prev = self._package(conanfile, pref, package_layout, conanfile_path, build_folder, + package_folder) + assert prev + node.prev = prev + log_file = os.path.join(build_folder, RUN_LOG_NAME) + log_file = log_file if os.path.exists(log_file) else None + log_package_built(pref, time.time() - t1, log_file) + recorder.package_built(pref) + except ConanException as exc: + recorder.package_install_error(pref, INSTALL_ERROR_BUILDING, + str(exc), remote_name=None) + raise exc return node.pref diff --git a/conans/test/functional/workspace/workspace_test.py b/conans/test/functional/workspace/workspace_test.py index d01255d1246..45f8742bbd4 100644 --- a/conans/test/functional/workspace/workspace_test.py +++ b/conans/test/functional/workspace/workspace_test.py @@ -12,7 +12,7 @@ from conans.errors import ConanException from conans.model.workspace import Workspace from conans.test.utils.test_files import temp_folder -from conans.test.utils.tools import TestClient +from conans.test.utils.tools import TestClient, GenConanfile from conans.util.files import load, save conanfile_build = """from conans import ConanFile, CMake @@ -1020,6 +1020,44 @@ class Lib(ConanFile): self.assertTrue(os.path.exists(os.path.join(client.current_folder, "ws_install", "conanworkspace.cmake"))) + def test_install_folder_rebuilt_requirements(self): + # https://github.com/conan-io/conan/issues/6046 + client = TestClient() + tool = dedent(""" + from conans import ConanFile + class Tool(ConanFile): + def package_info(self): + self.cpp_info.libs = ["MyToolLib"] + """) + client.save({"conanfile.py": tool}) + client.run("export . Tool/0.1@user/testing") + client.save({"conanfile.py": GenConanfile().with_name("HelloB").with_version("0.1")}, + path=os.path.join(client.current_folder, "B")) + client.save({"conanfile.py": GenConanfile().with_name("HelloA").with_version( + "0.1").with_build_require_plain("Tool/0.1@user/testing").with_require_plain("HelloB/0.1")}, + path=os.path.join(client.current_folder, "A")) + + project = dedent(""" + editables: + HelloB/0.1: + path: B + HelloA/0.1: + path: A + layout: layout + root: HelloA/0.1 + workspace_generator: cmake + """) + layout = dedent(""" + [build_folder] + build + """) + client.save({"conanws.yml": project, + "layout": layout}) + client.run( + "workspace install conanws.yml --install-folder=ws_install --build Tool/0.1@user/testing") + self.assertTrue(os.path.exists(os.path.join(client.current_folder, "ws_install", + "conanworkspace.cmake"))) + def missing_subarguments_test(self): client = TestClient() client.run("workspace", assert_error=True)