def get_expected_cmakelists_txt(metaproject_name): """ Returns the expected boilerplate CMakeLists.txt file for a metaproject :param metaproject_name: name of the metaproject :type metaproject_name: str :returns: expected CMakeLists.txt file :rtype: str """ env = {"name": metaproject_name, "metaproject_arguments": ""} return configure_file(get_metaproject_cmake_template_path(), env)
def build_alpine_project( path, package, workspace, buildspace, develspace, installspace, install, force_cmake, quiet, last_env, cmake_args, make_args, destdir=None ): cprint( "Processing @{cf}alpine@| project: '@!@{bf}" + package.name + "@|'" ) # Make the build dir build_dir = _check_build_dir(package.name, workspace, buildspace) # Check last_env if last_env is not None: cprint( blue_arrow + " Building with env: " + "'{0}'".format(last_env) ) # Check for Makefile and maybe call cmake makefile = os.path.join(build_dir, 'Makefile') if not os.path.exists(makefile) or force_cmake: package_dir = os.path.dirname(package.filename) if not os.path.exists(os.path.join(package_dir, 'CMakeLists.txt')): export_tags = [e.tagname for e in package.exports] if 'metaproject' not in export_tags: print(colorize_line('Error: Project "%s" does not have a CMakeLists.txt file' % package.name)) sys.exit('Can not build alpine project without CMakeLists.txt file') # generate CMakeLists.txt for metpackages without one print(colorize_line('Warning: metaproject "%s" should have a CMakeLists.txt file' % package.name)) cmake_code = configure_file( get_metaproject_cmake_template_path(), {'name': package.name, 'metaproject_arguments': 'DIRECTORY "%s"' % package_dir}) cmakelists_txt = os.path.join(build_dir, 'CMakeLists.txt') with open(cmakelists_txt, 'w') as f: f.write(cmake_code) package_dir = build_dir # Run cmake cmake_cmd = [ 'cmake', package_dir, '-DALPINE_DEVEL_PREFIX=' + develspace, '-DCMAKE_INSTALL_PREFIX=' + installspace ] cmake_cmd.extend(cmake_args) add_env = get_additional_environment(install, destdir, installspace) isolation_print_command(' '.join(cmake_cmd), build_dir, add_env=add_env) if last_env is not None: cmake_cmd = [last_env] + cmake_cmd try: run_command_colorized(cmake_cmd, build_dir, quiet, add_env=add_env) except subprocess.CalledProcessError as e: if os.path.exists(makefile): # remove Makefile to force CMake invocation next time os.remove(makefile) raise else: print('Makefile exists, skipping explicit cmake invocation...') # Check to see if cmake needs to be run via make make_check_cmake_cmd = ['make', 'cmake_check_build_system'] add_env = get_additional_environment(install, destdir, installspace) isolation_print_command(' '.join(make_check_cmake_cmd), build_dir, add_env=add_env) if last_env is not None: make_check_cmake_cmd = [last_env] + make_check_cmake_cmd run_command_colorized( make_check_cmake_cmd, build_dir, quiet, add_env=add_env ) # Run make make_cmd = ['make'] make_cmd.extend(handle_make_arguments(make_args, force_single_threaded_when_running_tests=True)) isolation_print_command(' '.join(make_cmd), build_dir) if last_env is not None: make_cmd = [last_env] + make_cmd run_command(make_cmd, build_dir, quiet) # Make install if install: if has_make_target(build_dir, 'install'): make_install_cmd = ['make', 'install'] isolation_print_command(' '.join(make_install_cmd), build_dir) if last_env is not None: make_install_cmd = [last_env] + make_install_cmd run_command(make_install_cmd, build_dir, quiet) else: print(fmt('@{yf}Project has no "@{boldon}install@{boldoff}" target, skipping "make install" invocation...'))