def configure(self, src_dir, defines=None, generator=None, install_prefix=None, test=True, variant=None, env=None): self.prefix.log("configure") util.mkdir(self.build_dir) args = [ src_dir, '-DCGET_CMAKE_DIR={}'.format(util.cget_dir('cmake')), '-DCGET_CMAKE_ORIGINAL_SOURCE_FILE={}'.format( os.path.join(src_dir, self.cmake_original_file)) ] for d in defines or []: args.append('-D{0}'.format(d)) if generator is not None: args = ['-G', generator] + args if self.prefix.verbose: args.extend(['-DCMAKE_VERBOSE_MAKEFILE=On']) if test: args.extend(['-DBUILD_TESTING=On']) else: args.extend(['-DBUILD_TESTING=Off']) args.extend(['-DCMAKE_BUILD_TYPE={}'.format(variant or 'Release')]) if install_prefix is not None: args.extend(['-DCMAKE_INSTALL_PREFIX=' + install_prefix]) try: self.cmake(args=args, cwd=self.build_dir, use_toolchain=True, env=env) except: self.show_logs() raise
def create_builder(self, name, tmp=False): pre = '' if tmp: pre = 'tmp-' d = self.get_builder_path(pre + name) exists = os.path.exists(d) util.mkdir(d) yield Builder(self, d, exists) if tmp: shutil.rmtree(d, ignore_errors=True)
def configure(self, src_dir, defines=None, generator=None, install_prefix=None): self.prefix.log("configure") util.mkdir(self.build_dir) args = [src_dir] if generator is not None: args = ['-G', util.quote(generator)] + args if install_prefix is not None: args.insert(0, '-DCMAKE_INSTALL_PREFIX=' + install_prefix) for d in defines or []: args.append('-D{0}'.format(d)) self.cmake(args=args, cwd=self.build_dir, use_toolchain=True)
def link(self, pkg): pkg = self.parse_pkg_src(pkg) pkg_dir = self.get_package_directory(pkg.to_fname()) unlink_dir = self.get_unlink_directory(pkg.to_fname()) if os.path.exists(unlink_dir): util.mkdir(self.get_package_directory()) os.rename(unlink_dir, pkg_dir) if util.USE_SYMLINKS: util.symlink_dir(os.path.join(pkg_dir, 'install'), self.prefix) else: util.copy_dir(os.path.join(pkg_dir, 'install'), self.prefix) # Relink dependencies for dep in util.ls(self.get_unlink_directory(), os.path.isdir): ls = util.ls(self.get_unlink_deps_directory(dep), os.path.isfile) if pkg.to_fname() in ls: self.link(dep)
def unlink(self, pkg, delete=False): pkg = self.parse_pkg_src(pkg) pkg_dir = self.get_package_directory(pkg.to_fname()) unlink_dir = self.get_unlink_directory(pkg.to_fname()) self.log("Unlink:", pkg_dir) if os.path.exists(pkg_dir): if util.USE_SYMLINKS: util.rm_symlink_from(os.path.join(pkg_dir, 'install'), self.prefix) else: util.rm_dup_dir(os.path.join(pkg_dir, 'install'), self.prefix, remove_both=False) util.rm_empty_dirs(self.prefix) if delete: shutil.rmtree(pkg_dir) else: util.mkdir(self.get_unlink_directory()) os.rename(pkg_dir, unlink_dir)
def configure(self, src_dir, defines=None, generator=None, install_prefix=None, test=True): self.prefix.log("configure") util.mkdir(self.build_dir) args = [src_dir] if generator is not None: args = ['-G', util.quote(generator)] + args if self.prefix.verbose: args.extend(['-DCMAKE_VERBOSE_MAKEFILE=On']) if test: args.extend(['-DBUILD_TESTING=On']) else: args.extend(['-DBUILD_TESTING=Off']) if install_prefix is not None: args.insert(0, '-DCMAKE_INSTALL_PREFIX=' + install_prefix) for d in defines or []: args.append('-D{0}'.format(d)) try: self.cmake(args=args, cwd=self.build_dir, use_toolchain=True) except: self.show_logs() raise
def install( self, pb, test=False, test_all=False, generator=None, update=False, track=True, insecure=False, use_build_cache=False, recipe_deps_only=False ): pb = self.parse_pkg_build(pb) pkg_dir = self.get_package_directory(pb.to_fname()) unlink_dir = self.get_unlink_directory(pb.to_fname()) # If its been unlinked, then link it in if os.path.exists(unlink_dir): if update: shutil.rmtree(unlink_dir) else: self.link(pb) self.write_parent(pb, track=track) return "Linking package {}".format(pb.to_name()) if os.path.exists(pkg_dir): self.write_parent(pb, track=track) if update: self.remove(pb) else: return "Package {} already installed".format(pb.to_name()) package_hash = self.hash_pkg(pb) self.log("package %s hash %s" % (pb.to_name(), package_hash)) pkg_install_dir = self.get_package_directory(pb.to_fname(), 'install') if use_build_cache: install_dir = util.get_cache_path("builds", pb.to_name(), package_hash) util.mkdir(pkg_dir) os.symlink(install_dir, pkg_install_dir) self.log("using cached install dir '%s'" % install_dir) else: install_dir = pkg_install_dir self.log("using local install dir '%s'" % install_dir) build_needed = True if recipe_deps_only: self.install_deps( pb, test=test, test_all=test_all, generator=generator, insecure=insecure, use_build_cache=use_build_cache, recipe_deps_only=True ) with util.cache_lock() as cache_lock: if not update and use_build_cache and os.path.exists(install_dir): print("retreived Package {} from cache".format(pb.to_name())) build_needed = False if build_needed: with self.create_builder(uuid.uuid4().hex, tmp=True) as builder: # Fetch package src_dir = builder.fetch(pb.pkg_src.url, pb.hash, (pb.cmake != None), insecure=insecure) # Install any dependencies first if not recipe_deps_only: self.install_deps( pb, src_dir=src_dir, test=test, test_all=test_all, generator=generator, insecure=insecure, use_build_cache=use_build_cache, recipe_deps_only=False ) with util.cache_lock() as cache_lock: if not update and use_build_cache and os.path.exists(install_dir): print("retreived Package {} from cache".format(pb.to_name())) else: # Setup cmake file if pb.cmake: target = os.path.join(src_dir, 'CMakeLists.txt') if os.path.exists(target): os.rename(target, os.path.join(src_dir, builder.cmake_original_file)) shutil.copyfile(pb.cmake, target) # Configure and build dependents = self.get_dependents(pb, src_dir) dep_install_paths = list([self.get_real_install_path(dep) for dep in dependents]) defines = list(pb.define or []) + [ "CMAKE_PREFIX_PATH=%s" % ";".join( ['%s' % path for path in dep_install_paths + [self.prefix]] ) ] #defines.append("PKG_CONFIG_USE_CMAKE_PREFIX_PATH=ON") #defines.append("CMAKE_FIND_USE_CMAKE_SYSTEM_PATH=OFF") #defines.append("CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=OFF") pkg_config_paths = list( filter( os.path.exists, sum( [ [ os.path.join(path, "lib/pkgconfig"), os.path.join(path, "lib64/pkgconfig"), ] for path in dep_install_paths ], [] ) ) ) bin_paths = list( filter( os.path.exists, [ os.path.join(path, "bin") for path in dep_install_paths ] ) ) + os.getenv("PATH", "").split(":") configure_env = { "PKG_CONFIG_LIBDIR":"/dev/null", "PKG_CONFIG_PATH":":".join(pkg_config_paths), "PATH":":".join(bin_paths), "CFLAGS" : os.getenv("CFLAGS", ""), "CXXFLAGS" : os.getenv("CXXFLAGS", "") } build_env = { "PATH":":".join(bin_paths) } print("defines") print(defines) print("env") print(configure_env) print("build env") print(build_env) builder.configure( src_dir, defines=defines, generator=generator, install_prefix=install_dir, test=test, variant=pb.variant, env=configure_env ) builder.build(variant=pb.variant, env=build_env) # Run tests if enabled if test or test_all: builder.test(variant=pb.variant) # Install builder.build(target='install', variant=pb.variant, env=build_env) if use_build_cache: util.fix_cache_permissions_recursive(install_dir) if util.MERGE_INSTALLS: if util.USE_SYMLINKS: util.symlink_dir(install_dir, self.prefix) else: util.copy_dir(install_dir, self.prefix) self.write_parent(pb, track=track) return "Successfully installed {}".format(pb.to_name())