def _build(self, conanfile, pref): # Read generators from conanfile and generate the needed files logger.info("GENERATORS: Writing generators") self._generator_manager.write_generators(conanfile, conanfile.build_folder, conanfile.generators_folder, self._output) logger.info("TOOLCHAIN: Writing toolchain") write_toolchain(conanfile, conanfile.generators_folder, self._output) # Build step might need DLLs, binaries as protoc to generate source files # So execute imports() before build, storing the list of copied_files copied_files = run_imports(conanfile) try: mkdir(conanfile.build_folder) with tools.chdir(conanfile.build_folder): run_build_method(conanfile, self._hook_manager, reference=pref.ref, package_id=pref.id) self._output.success("Package '%s' built" % pref.id) self._output.info("Build folder %s" % conanfile.build_folder) except Exception as exc: self._output.writeln("") self._output.error("Package '%s' build failed" % pref.id) self._output.warn("Build folder %s" % conanfile.build_folder) if isinstance(exc, ConanExceptionInUserConanfileMethod): raise exc raise ConanException(exc) finally: # Now remove all files that were imported with imports() remove_imports(conanfile, copied_files, self._output)
def cmd_build(app, conanfile_path, source_folder, build_folder, package_folder, install_folder, test=False, should_configure=True, should_build=True, should_install=True, should_test=True): """ Call to build() method saved on the conanfile.py param conanfile_path: path to a conanfile.py """ logger.debug("BUILD: folder '%s'" % build_folder) logger.debug("BUILD: Conanfile at '%s'" % conanfile_path) try: conan_file = app.graph_manager.load_consumer_conanfile( conanfile_path, install_folder, deps_info_required=True, test=test) except NotFoundException: # TODO: Auto generate conanfile from requirements file raise ConanException("'%s' file is needed for build.\n" "Create a '%s' and move manually the " "requirements and generators from '%s' file" % (CONANFILE, CONANFILE, CONANFILE_TXT)) if test: try: conan_file.requires.add_ref(test) except ConanException: pass conan_file.should_configure = should_configure conan_file.should_build = should_build conan_file.should_install = should_install conan_file.should_test = should_test try: mkdir(build_folder) os.chdir(build_folder) conan_file.build_folder = build_folder conan_file.source_folder = source_folder conan_file.package_folder = package_folder conan_file.install_folder = install_folder run_build_method(conan_file, app.hook_manager, conanfile_path=conanfile_path) if test: with get_env_context_manager(conan_file): conan_file.output.highlight("Running test()") with conanfile_exception_formatter(str(conan_file), "test"): conan_file.test() except ConanException: raise # Raise but not let to reach the Exception except (not print traceback) except Exception: import traceback trace = traceback.format_exc().split('\n') raise ConanException("Unable to build it successfully\n%s" % '\n'.join(trace[3:]))