def install_rosdeps(base_path, source_path, rosdistro, no_color): # -r continue even with errors cmd = ['rosdep', 'install' ] # if you want it to continue installing despite errors, '-r'] underlays = config_cache.get_underlays_list_from_config_cmake(base_path) print("Rosdep Search Paths") for underlay in underlays: underlay_path = underlay underlay_source_path = os.path.abspath( os.path.join(underlay, os.pardir, "src")) if os.path.isdir(underlay_source_path): underlay_path = underlay_source_path if os.path.isdir(underlay_path): cmd += ['--from-paths', underlay_path] print(" - adding underlay '%s'" % underlay_path) else: print(" - not adding underlay '%s' [not found]" % underlay_path) cmd += [ '--from-paths', source_path, '--ignore-src', '--rosdistro', rosdistro, '-y' ] env = os.environ.copy() try: builder.print_command_banner(cmd, source_path, color=not no_color) if no_color: builder.run_command(cmd, source_path, env=env) else: builder.run_command_colorized(cmd, source_path, env=env) except subprocess.CalledProcessError: return 1 # rosdep will already have provided its own error message, no need to regurgitate return 0
def install_rosdeps(base_path, source_path, rosdistro, no_color): # -r continue even with errors cmd = ['rosdep', 'install'] # if you want it to continue installing despite errors, '-r'] underlays = config_cache.get_underlays_list_from_config_cmake(base_path) print("Rosdep Search Paths") for underlay in underlays: underlay_path = underlay underlay_source_path = os.path.abspath(os.path.join(underlay, os.pardir, "src")) if os.path.isdir(underlay_source_path): underlay_path = underlay_source_path if os.path.isdir(underlay_path): cmd += ['--from-paths', underlay_path] print(" - adding underlay '%s'" % underlay_path) else: print(" - not adding underlay '%s' [not found]" % underlay_path) cmd += ['--from-paths', source_path, '--ignore-src', '--rosdistro', rosdistro, '-y'] env = os.environ.copy() try: builder.print_command_banner(cmd, source_path, color=not no_color) if no_color: builder.run_command(cmd, source_path, env=env) else: builder.run_command_colorized(cmd, source_path, env=env) except subprocess.CalledProcessError: return 1 # rosdep will already have provided its own error message, no need to regurgitate return 0
def install_rosdeps(base_path, source_path, rosdistro, no_color): # -r continue even with errors cmd = ['rosdep', 'install', '-r'] underlays = config_cache.get_underlays_list_from_config_cmake(base_path) for underlay in underlays: cmd += ['--from-paths', underlay] cmd += ['--from-paths', source_path, '--ignore-src', '--rosdistro', rosdistro, '-y'] env = os.environ.copy() try: builder.print_command_banner(cmd, source_path, color=not no_color) if no_color: builder.run_command(cmd, source_path, env=env) else: builder.run_command_colorized(cmd, source_path, env=env) except subprocess.CalledProcessError: return fmt('@{rf}Invoking @{boldon}"rosdep install failed')
def make_main(): args = _parse_args() cmake_args = args.cmake_args # disable colors if asked if args.no_color: terminal_color.disable_ANSI_colors() # Default paths base_path = os.path.abspath('.') build_path = os.path.join(base_path, 'build') devel_path = os.path.join(base_path, 'devel') source_path = os.path.join(base_path, 'src') validate_build_space(base_path) # raises a RuntimeError if there is a problem # Clear out previous temporaries if requested if args.pre_clean: console.pretty_print("Pre-cleaning before building.", console.cyan) shutil.rmtree(devel_path, ignore_errors=True) shutil.rmtree(build_path, ignore_errors=True) # check for new build if not os.path.exists(build_path): os.mkdir(build_path) #if not os.path.exists(devel_path): # os.mkdir(devel_path) # ensure toplevel cmake file exists toplevel_cmake = os.path.join(source_path, 'CMakeLists.txt') if not os.path.exists(toplevel_cmake): return fmt('@{rf}No toplevel cmake file@') packages = find_packages(source_path, exclude_subspaces=True) # verify that specified package exists in workspace if args.pkg: packages_by_name = {p.name: path for path, p in packages.iteritems()} if args.pkg not in packages_by_name: raise RuntimeError('Package %s not found in the workspace' % args.pkg) # check if cmake must be run (either for a changed list of package paths or changed cmake arguments) force_cmake, _ = builder.cmake_input_changed(packages, build_path, cmake_args=cmake_args) # check if toolchain.cmake, config.cmake exist toolchain_cmd = "-DCMAKE_TOOLCHAIN_FILE=%s" % os.path.join(base_path, 'toolchain.cmake') if os.path.isfile(os.path.join(base_path, 'toolchain.cmake')) else None config_cmd = "-C%s" % os.path.join(base_path, 'config.cmake') if os.path.isfile(os.path.join(base_path, 'config.cmake')) else None # Help find catkin cmake and python unused_catkin_toplevel, catkin_python_path, unused_catkin_cmake_path = common.find_catkin() env = os.environ.copy() try: env['PYTHONPATH'] = env['PYTHONPATH'] + os.pathsep + catkin_python_path except KeyError: env['PYTHONPATH'] = catkin_python_path # consider calling cmake makefile = os.path.join(build_path, 'Makefile') if not os.path.exists(makefile) or args.force_cmake or force_cmake: cmd = ['cmake', source_path] if toolchain_cmd: cmd.append(toolchain_cmd) if config_cmd: cmd.append(config_cmd) cmd += cmake_args try: builder.print_command_banner(cmd, build_path, color=not args.no_color) if args.no_color: builder.run_command(cmd, build_path, env=env) else: builder.run_command_colorized(cmd, build_path, env=env) except subprocess.CalledProcessError: return fmt('@{rf}Invoking @{boldon}"cmake"@{boldoff} failed') else: cmd = ['make', 'cmake_check_build_system'] try: builder.print_command_banner(cmd, build_path, color=not args.no_color) if args.no_color: builder.run_command(cmd, build_path, env=env) else: builder.run_command_colorized(cmd, build_path, env=env) except subprocess.CalledProcessError: return fmt('@{rf}Invoking @{boldon}"make cmake_check_build_system"@{boldoff} failed') # invoke make if args.install: cmd = ['make', 'install'] elif args.tests: cmd = ['make', 'tests'] elif args.run_tests: cmd = ['make', 'run_tests'] else: cmd = ['make'] jobs = args.jobs if args.jobs == '': cmd.append('-j') else: jobs = args.jobs if not jobs: if 'ROS_PARALLEL_JOBS' in os.environ: ros_parallel_jobs = os.environ['ROS_PARALLEL_JOBS'] cmd += [arg for arg in ros_parallel_jobs.split(' ') if arg] else: jobs = multiprocessing.cpu_count() if jobs: cmd.append('-j%d' % jobs) cmd.append('-l%d' % jobs) cmd += args.make_args try: make_path = build_path if args.pkg: make_path = os.path.join(make_path, packages_by_name[args.pkg]) builder.print_command_banner(cmd, make_path, color=not args.no_color) builder.run_command(cmd, make_path, env=env) except subprocess.CalledProcessError: return fmt('@{rf}Invoking @{boldon}"make"@{boldoff} failed')
def make_main(): args = _parse_args() cmake_args = args.cmake_args if args.no_color: terminal_color.disable_ANSI_colors() (base_path, build_path, devel_path, source_path) = common.get_default_paths() doc_path = config_cache.get_doc_prefix_from_config_cmake(base_path) validate_build_space(base_path) # raises a RuntimeError if there is a problem # Install rosdeps if requested if args.install_rosdeps: install_rosdeps(base_path, source_path, settings.get_default_track(), args.no_color) return if args.install_rosdeps_track is not None: install_rosdeps(source_path, args.install_rosdeps_track, args.no_color) return # Clear out previous temporaries if requested if args.pre_clean: console.pretty_print("Pre-cleaning before building.", console.cyan) shutil.rmtree(devel_path, ignore_errors=True) shutil.rmtree(build_path, ignore_errors=True) shutil.rmtree(doc_path, ignore_errors=True) # check for new build if not os.path.exists(build_path): os.mkdir(build_path) #if not os.path.exists(devel_path): # os.mkdir(devel_path) # ensure toplevel cmake file exists toplevel_cmake = os.path.join(source_path, 'CMakeLists.txt') if not os.path.exists(toplevel_cmake): return fmt('@{rf}No toplevel cmake file@') # did source paths get added to the original location? check_and_update_source_repo_paths(source_path) packages = find_packages(source_path, exclude_subspaces=True) # verify that specified package exists in workspace if args.pkg: packages_by_name = {p.name: path for path, p in packages.iteritems()} if args.pkg not in packages_by_name: raise RuntimeError('Package %s not found in the workspace' % args.pkg) # check if cmake must be run (either for a changed list of package paths or changed cmake arguments) force_cmake, _ = builder.cmake_input_changed(packages, build_path, cmake_args=cmake_args) # check if toolchain.cmake, config.cmake exist toolchain_cmd = "-DCMAKE_TOOLCHAIN_FILE=%s" % os.path.join(base_path, 'toolchain.cmake') if os.path.isfile(os.path.join(base_path, 'toolchain.cmake')) else None config_cmd = "-C%s" % os.path.join(base_path, 'config.cmake') if os.path.isfile(os.path.join(base_path, 'config.cmake')) else None # Help find catkin cmake and python unused_catkin_toplevel, catkin_python_path, unused_catkin_cmake_path = common.find_catkin(base_path) pkg_config_paths = common.generate_pkg_config_path(base_path) env = os.environ.copy() # PYTHONPATH # Don't add to the environment variable - this mucks up catkin's catkin_generated/setup_cached.py # environment later (how? I can't remember - something to do with the default underlay). # Maybe we can do away with this now catkin can look up install spaces? #try: # env['PYTHONPATH'] = env['PYTHONPATH'] + os.pathsep + catkin_python_path #except KeyError: # env['PYTHONPATH'] = catkin_python_path sys.path.append(catkin_python_path) # PKG_CONFIG_PATH for path in pkg_config_paths: try: env['PKG_CONFIG_PATH'] = env['PKG_CONFIG_PATH'] + os.pathsep + path except KeyError: env['PKG_CONFIG_PATH'] = path if args.doc_only: console.pretty_println('Generates documents only', console.bold_white) make_doc(source_path, doc_path, packages) return # consider calling cmake makefile = os.path.join(build_path, 'Makefile') if not os.path.exists(makefile) or args.force_cmake or force_cmake: cmd = ['cmake', source_path] if toolchain_cmd: cmd.append(toolchain_cmd) if config_cmd: cmd.append(config_cmd) cmd += cmake_args #new_env = common.generate_underlays_environment(base_path) try: builder.print_command_banner(cmd, build_path, color=not args.no_color) if args.no_color: builder.run_command(cmd, build_path, env=env) else: builder.run_command_colorized(cmd, build_path, env=env) except subprocess.CalledProcessError: return fmt('@{rf}Invoking @{boldon}"cmake"@{boldoff} failed') else: cmd = ['make', 'cmake_check_build_system'] #new_env = common.generate_environment(base_path) # underlays + current workspace try: builder.print_command_banner(cmd, build_path, color=not args.no_color) if args.no_color: builder.run_command(cmd, build_path, env=env) else: builder.run_command_colorized(cmd, build_path, env=env) except subprocess.CalledProcessError: return fmt('@{rf}Invoking @{boldon}"make cmake_check_build_system"@{boldoff} failed') insert_yujin_make_signature(base_path, devel_path) # invoke make if not args.cmake_only: if args.target: cmd = ['make', args.target] elif args.install: cmd = ['make', 'install'] elif args.tests: cmd = ['make', 'tests'] elif args.run_tests: cmd = ['make', 'test'] else: cmd = ['make'] jobs = args.jobs if args.jobs == '': cmd.append('-j') else: jobs = args.jobs if not jobs: if 'ROS_PARALLEL_JOBS' in os.environ: ros_parallel_jobs = os.environ['ROS_PARALLEL_JOBS'] cmd += [arg for arg in ros_parallel_jobs.split(' ') if arg] else: jobs = multiprocessing.cpu_count() if jobs: cmd.append('-j%d' % jobs) cmd.append('-l%d' % jobs) cmd += args.make_args try: make_path = build_path if args.pkg: make_path = os.path.join(make_path, packages_by_name[args.pkg]) builder.print_command_banner(cmd, make_path, color=not args.no_color) builder.run_command(cmd, make_path, env=env) except subprocess.CalledProcessError: return fmt('@{rf}Invoking @{boldon}"make"@{boldoff} failed') if args.doc: make_doc(source_path, doc_path, packages)
def make_isolated_main(): args = _parse_args() if args.no_color: terminal_color.disable_ANSI_colors() (base_path, build_path, devel_path, source_path) = common.get_default_paths(isolated=args.suffixes) unused_catkin_toplevel, catkin_python_path, unused_catkin_cmake_path = common.find_catkin(base_path) install_path = config_cache.get_install_prefix_from_config_cmake(isolated=args.suffixes) sys.path.insert(0, catkin_python_path) from catkin.builder import build_workspace_isolated # Clear out previous temporaries if requested if args.pre_clean: console.pretty_print("Pre-cleaning before building.", console.cyan) shutil.rmtree(devel_path, ignore_errors=True) shutil.rmtree(build_path, ignore_errors=True) shutil.rmtree(install_path, ignore_errors=True) if not os.path.exists(build_path): os.mkdir(build_path) # Validate package argument packages = find_packages(source_path, exclude_subspaces=True) packages_by_name = {p.name: path for path, p in packages.iteritems()} if args.packages: for package in args.packages: if package not in packages_by_name: raise RuntimeError('Package %s not found in the workspace' % package) make.validate_build_space(base_path) # raises a RuntimeError if there is a problem make.check_and_update_source_repo_paths(source_path) build_workspace_isolated( workspace=base_path, sourcespace=source_path, buildspace=build_path, develspace=devel_path, installspace=install_path, merge=args.merge, install=args.install, force_cmake=args.force_cmake, build_packages=args.packages, quiet=args.quiet, cmake_args=args.cmake_args, make_args=args.make_args ) # this is a really fugly way of building a specific target after all else has been built # (and rebuilt), usually this is enough as the check of already built packages is quick if args.target: env = os.environ.copy() cmd = ['make', args.target] make_paths = [] if args.packages: for package in args.packages: # It's an isolated build, so packages are listed under the build path as a flat list (not fully traceable dirs like in catkin_make) # make_path = os.path.join(make_path, packages_by_name[package]) make_paths.append(os.path.join(build_path, package)) else: for (unused_path, package) in topological_order_packages(packages): # 3rd party builds put make targets under an install directory # catkin package builds put make targets under the package name # why? no bloody idea, but just detect what is what here third_party_build_path = os.path.join(build_path, package.name, 'install') catkin_build_path = os.path.join(build_path, package.name) package_build_path = third_party_build_path if os.path.exists(third_party_build_path) else catkin_build_path make_paths.append(package_build_path) for make_path in make_paths: builder.print_command_banner(cmd, make_path, color=not args.no_color) if args.no_color: builder.run_command(cmd, make_path, env=env) else: builder.run_command_colorized(cmd, make_path, env=env)