def main(opts): try: # Determine if the user is trying to perform some action, in which # case, the workspace should be automatically initialized ignored_opts = ['main', 'verb'] actions = [v for k, v in vars(opts).items() if k not in ignored_opts] no_action = not any(actions) # Try to find a metadata directory to get context defaults # Otherwise use the specified directory context = Context.load(opts.workspace, opts.profile, opts, append=opts.append_args, remove=opts.remove_args) do_init = opts.init or not no_action summary_notes = [] if not context.initialized() and do_init: summary_notes.append( clr('@!@{cf}Initialized new catkin workspace in `%s`@|' % context.workspace)) if context.initialized() or do_init: Context.save(context) if opts.mkdirs and not context.source_space_exists(): os.makedirs(context.source_space_abs) print(context.summary(notes=summary_notes)) except IOError as exc: # Usually happens if workspace is already underneath another catkin_tools workspace print('error: could not configure catkin workspace: %s' % exc.message) return 1 return 0
def main(opts): try: # Determine if the user is trying to perform some action, in which # case, the workspace should be automatically initialized ignored_opts = ['main', 'verb'] actions = [v for k, v in vars(opts).items() if k not in ignored_opts] no_action = not any(actions) # Try to find a metadata directory to get context defaults # Otherwise use the specified directory context = Context.load( opts.workspace, opts.profile, opts, append=opts.append_args, remove=opts.remove_args) do_init = opts.init or not no_action summary_notes = [] if not context.initialized() and do_init: summary_notes.append(clr('@!@{cf}Initialized new catkin workspace in `%s`@|' % sanitize(context.workspace))) if context.initialized() or do_init: Context.save(context) if opts.mkdirs and not context.source_space_exists(): os.makedirs(context.source_space_abs) print(context.summary(notes=summary_notes)) except IOError as exc: # Usually happens if workspace is already underneath another catkin_tools workspace print('error: could not configure catkin workspace: %s' % exc.message) return 1 return 0
def main(opts): try: # Load a context with initialization ctx = Context.load(opts.workspace, load_env=False) if not ctx.initialized(): print( "A catkin workspace must be initialized before profiles can be managed." ) return 1 profiles = get_profile_names(ctx.workspace) active_profile = get_active_profile(ctx.workspace) if opts.subcommand == 'list': print( list_profiles(profiles, active_profile, unformatted=opts.unformatted, active=opts.active)) elif opts.subcommand == 'add': if opts.name in profiles: if opts.force: print( clr('[profile] @{yf}Warning:@| Overwriting existing profile named @{cf}%s@|' % (opts.name))) else: print( clr('catkin profile: error: A profile named ' '@{cf}%s@| already exists. Use `--force` to ' 'overwrite.' % (opts.name))) return 1 if opts.copy_active: ctx.profile = opts.name Context.save(ctx) print( clr('[profile] Created a new profile named @{cf}%s@| ' 'based on active profile @{cf}%s@|' % (opts.name, active_profile))) elif opts.copy: if opts.copy in profiles: new_ctx = Context.load(opts.workspace, profile=opts.copy) new_ctx.profile = opts.name Context.save(new_ctx) print( clr('[profile] Created a new profile named @{cf}%s@| ' 'based on profile @{cf}%s@|' % (opts.name, opts.copy))) else: print( clr('[profile] @{rf}A profile with this name does not exist: %s@|' % opts.copy)) else: new_ctx = Context(workspace=ctx.workspace, profile=opts.name) Context.save(new_ctx) print( clr('[profile] Created a new profile named @{cf}%s@| with default settings.' % (opts.name))) profiles = get_profile_names(ctx.workspace) active_profile = get_active_profile(ctx.workspace) print(list_profiles(profiles, active_profile)) elif opts.subcommand == 'set': if opts.name in profiles: set_active_profile(ctx.workspace, opts.name) active_profile = get_active_profile(ctx.workspace) print( clr('[profile] Activated catkin metadata profile: @{cf}%s@|' % active_profile)) else: print( 'catkin profile: error: Profile `%s` does not exist in workspace `%s`.' % (opts.name, ctx.workspace)) return 1 profiles = get_profile_names(ctx.workspace) active_profile = get_active_profile(ctx.workspace) print(list_profiles(profiles, active_profile)) elif opts.subcommand == 'rename': if opts.current_name in profiles: if opts.new_name in profiles: if opts.force: print( clr('[profile] @{yf}Warning:@| Overwriting ' 'existing profile named @{cf}%s@|' % (opts.new_name))) else: print( clr('catkin profile: error: A profile named ' '@{cf}%s@| already exists. Use `--force` to ' 'overwrite.' % (opts.new_name))) return 1 ctx.profile = opts.new_name Context.save(ctx) remove_profile(ctx.workspace, opts.current_name) if opts.current_name == active_profile: set_active_profile(ctx.workspace, opts.new_name) print( clr('[profile] Renamed profile @{cf}%s@| to @{cf}%s@|' % (opts.current_name, opts.new_name))) else: print( 'catkin profile: error: Profile `%s` does not exist in workspace `%s`.' % (opts.current_name, ctx.workspace)) return 1 profiles = get_profile_names(ctx.workspace) active_profile = get_active_profile(ctx.workspace) print(list_profiles(profiles, active_profile)) elif opts.subcommand == 'remove': for name in opts.name: if name == active_profile: print( 'Profile `%s` is currently active. Re-setting active profile to `%s`.' % (name, DEFAULT_PROFILE_NAME)) set_active_profile(ctx.workspace, DEFAULT_PROFILE_NAME) if name in profiles: remove_profile(ctx.workspace, name) else: print( 'catkin profile: error: Profile `%s` does not exist in workspace `%s`.' % (name, ctx.workspace)) return 1 print(clr('[profile] Removed profile: @{rf}%s@|' % name)) profiles = get_profile_names(ctx.workspace) active_profile = get_active_profile(ctx.workspace) print(list_profiles(profiles, active_profile)) except IOError as exc: # Usually happens if workspace is already underneath another catkin_tools workspace print('error: could not %s catkin profile: %s' % (opts.subcommand, exc.message)) return 1 return 0
def main(opts): try: # Load a context with initialization ctx = Context.load(opts.workspace) if not ctx.initialized(): print("A catkin workspace must be initialized before profiles can be managed.") return 1 profiles = get_profile_names(ctx.workspace) active_profile = get_active_profile(ctx.workspace) if opts.subcommand == 'list': print(list_profiles(profiles, active_profile, unformatted=opts.unformatted)) elif opts.subcommand == 'add': if opts.name in profiles: if opts.force: print(clr('[profile] @{yf}Warning:@| Overwriting existing profile named @{cf}%s@|' % (opts.name))) else: print(clr('catkin profile: error: A profile named ' '@{cf}%s@| already exists. Use `--force` to ' 'overwrite.' % (opts.name))) return 1 if opts.copy_active: ctx.profile = opts.name Context.save(ctx) print(clr('[profile] Created a new profile named @{cf}%s@| ' 'based on active profile @{cf}%s@|' % (opts.name, active_profile))) elif opts.copy: if opts.copy in profiles: new_ctx = Context.load(opts.workspace, profile=opts.copy) new_ctx.profile = opts.name Context.save(new_ctx) print(clr('[profile] Created a new profile named @{cf}%s@| ' 'based on profile @{cf}%s@|' % (opts.name, opts.copy))) else: print(clr('[profile] @{rf}A profile with this name does not exist: %s@|' % opts.copy)) else: new_ctx = Context(workspace=ctx.workspace, profile=opts.name) Context.save(new_ctx) print(clr('[profile] Created a new profile named @{cf}%s@| with default settings.' % (opts.name))) profiles = get_profile_names(ctx.workspace) active_profile = get_active_profile(ctx.workspace) print(list_profiles(profiles, active_profile)) elif opts.subcommand == 'set': if opts.name in profiles: set_active_profile(ctx.workspace, opts.name) active_profile = get_active_profile(ctx.workspace) print(clr('[profile] Activated catkin metadata profile: @{cf}%s@|' % active_profile)) else: print('catkin profile: error: Profile `%s` does not exist in workspace `%s`.' % (opts.name[0], ctx.workspace)) return 1 profiles = get_profile_names(ctx.workspace) active_profile = get_active_profile(ctx.workspace) print(list_profiles(profiles, active_profile)) elif opts.subcommand == 'rename': if opts.current_name in profiles: if opts.new_name in profiles: if opts.force: print(clr('[profile] @{yf}Warning:@| Overwriting ' 'existing profile named @{cf}%s@|' % (opts.new_name))) else: print(clr('catkin profile: error: A profile named ' '@{cf}%s@| already exists. Use `--force` to ' 'overwrite.' % (opts.new_name))) return 1 ctx.profile = opts.new_name Context.save(ctx) remove_profile(ctx.workspace, opts.current_name) if opts.current_name == active_profile: set_active_profile(ctx.workspace, opts.new_name) print(clr('[profile] Renamed profile @{cf}%s@| to @{cf}%s@|' % (opts.current_name, opts.new_name))) else: print('catkin profile: error: Profile `%s` does not exist in workspace `%s`.' % (opts.current_name, ctx.workspace)) return 1 profiles = get_profile_names(ctx.workspace) active_profile = get_active_profile(ctx.workspace) print(list_profiles(profiles, active_profile)) elif opts.subcommand == 'remove': for name in opts.name: if name == active_profile: print('Profile `%s` is currently active. Re-setting active profile to `%s`.' % (name, DEFAULT_PROFILE_NAME)) set_active_profile(ctx.workspace, DEFAULT_PROFILE_NAME) if name in profiles: remove_profile(ctx.workspace, name) else: print('catkin profile: error: Profile `%s` does not exist in workspace `%s`.' % (name, ctx.workspace)) return 1 print(clr('[profile] Removed profile: @{rf}%s@|' % name)) profiles = get_profile_names(ctx.workspace) active_profile = get_active_profile(ctx.workspace) print(list_profiles(profiles, active_profile)) except IOError as exc: # Usually happens if workspace is already underneath another catkin_tools workspace print('error: could not %s catkin profile: %s' % (opts.subcommand, exc.message)) return 1 return 0
def main(opts): # Context-aware args if opts.build_this or opts.start_with_this: # Determine the enclosing package try: ws_path = find_enclosing_workspace(getcwd()) # Suppress warnings since this won't necessaraly find all packages # in the workspace (it stops when it finds one package), and # relying on it for warnings could mislead people. this_package = find_enclosing_package(search_start_path=getcwd(), ws_path=ws_path, warnings=[]) except (InvalidPackage, RuntimeError): this_package = None # Handle context-based package building if opts.build_this: if this_package: opts.packages += [this_package] else: sys.exit( "catkin build: --this was specified, but this directory is not in a catkin package." ) # If --start--with was used without any packages and --this was specified, start with this package if opts.start_with_this: if this_package: opts.start_with = this_package else: sys.exit( "catkin build: --this was specified, but this directory is not in a catkin package." ) if opts.no_deps and not opts.packages: sys.exit("With --no-deps, you must specify packages to build.") # Load the context ctx = Context.load(opts.workspace, opts.profile, opts, append=True) # Initialize the build configuration make_args, makeflags, cli_flags, jobserver = configure_make_args( ctx.make_args, ctx.use_internal_make_jobserver) # Set the jobserver memory limit if jobserver and opts.mem_limit: log( clr("@!@{pf}EXPERIMENTAL: limit memory to '%s'@|" % str(opts.mem_limit))) # At this point psuitl will be required, check for it and bail out if not set try: import psutil # noqa except ImportError as exc: log("Could not import psutil, but psutil is required when using --mem-limit." ) log("Please either install psutil or avoid using --mem-limit.") sys.exit("Exception: {0}".format(exc)) set_jobserver_max_mem(opts.mem_limit) ctx.make_args = make_args # Load the environment of the workspace to extend if ctx.extend_path is not None: try: load_resultspace_environment(ctx.extend_path) except IOError as exc: log( clr("@!@{rf}Error:@| Unable to extend workspace from \"%s\": %s" % (ctx.extend_path, exc.message))) return 1 # Display list and leave the file system untouched if opts.dry_run: dry_run(ctx, opts.packages, opts.no_deps, opts.start_with) return # Check if the context is valid before writing any metadata if not ctx.source_space_exists(): print("catkin build: error: Unable to find source space `%s`" % ctx.source_space_abs) return 1 # Always save the last context under the build verb update_metadata(ctx.workspace, ctx.profile, 'build', ctx.get_stored_dict()) build_metadata = get_metadata(ctx.workspace, ctx.profile, 'build') if build_metadata.get('needs_force', False): opts.force_cmake = True update_metadata(ctx.workspace, ctx.profile, 'build', {'needs_force': False}) # Save the context as the configuration if opts.save_config: Context.save(ctx) start = time.time() try: return build_isolated_workspace( ctx, packages=opts.packages, start_with=opts.start_with, no_deps=opts.no_deps, jobs=opts.parallel_jobs, force_cmake=opts.force_cmake, force_color=opts.force_color, quiet=not opts.verbose, interleave_output=opts.interleave_output, no_status=opts.no_status, limit_status_rate=opts.limit_status_rate, lock_install=not opts.no_install_lock, no_notify=opts.no_notify, continue_on_failure=opts.continue_on_failure, summarize_build=opts.summarize # Can be True, False, or None ) finally: log("[build] Runtime: {0}".format( format_time_delta(time.time() - start)))
def main(opts): # Check for develdebug mode if opts.develdebug is not None: os.environ['TROLLIUSDEBUG'] = opts.develdebug.lower() logging.basicConfig(level=opts.develdebug.upper()) # Set color options if (opts.force_color or is_tty(sys.stdout)) and not opts.no_color: set_color(True) else: set_color(False) # Context-aware args if opts.build_this or opts.start_with_this: # Determine the enclosing package try: ws_path = find_enclosing_workspace(getcwd()) # Suppress warnings since this won't necessaraly find all packages # in the workspace (it stops when it finds one package), and # relying on it for warnings could mislead people. this_package = find_enclosing_package( search_start_path=getcwd(), ws_path=ws_path, warnings=[]) except (InvalidPackage, RuntimeError): this_package = None # Handle context-based package building if opts.build_this: if this_package: opts.packages += [this_package] else: sys.exit( "[build] Error: In order to use --this, the current directory must be part of a catkin package.") # If --start--with was used without any packages and --this was specified, start with this package if opts.start_with_this: if this_package: opts.start_with = this_package else: sys.exit( "[build] Error: In order to use --this, the current directory must be part of a catkin package.") if opts.no_deps and not opts.packages and not opts.unbuilt: sys.exit(clr("[build] @!@{rf}Error:@| With --no-deps, you must specify packages to build.")) # Load the context ctx = Context.load(opts.workspace, opts.profile, opts, append=True) # Initialize the build configuration make_args, makeflags, cli_flags, jobserver = configure_make_args( ctx.make_args, ctx.jobs_args, ctx.use_internal_make_jobserver) # Set the jobserver memory limit if jobserver and opts.mem_limit: log(clr("@!@{pf}EXPERIMENTAL: limit memory to '%s'@|" % str(opts.mem_limit))) # At this point psuitl will be required, check for it and bail out if not set try: import psutil # noqa except ImportError as exc: log("Could not import psutil, but psutil is required when using --mem-limit.") log("Please either install psutil or avoid using --mem-limit.") sys.exit("Exception: {0}".format(exc)) job_server.set_max_mem(opts.mem_limit) ctx.make_args = make_args # Load the environment of the workspace to extend if ctx.extend_path is not None: try: load_resultspace_environment(ctx.extend_path) except IOError as exc: sys.exit(clr("[build] @!@{rf}Error:@| Unable to extend workspace from \"%s\": %s" % (ctx.extend_path, exc.message))) # Check if the context is valid before writing any metadata if not ctx.source_space_exists(): sys.exit(clr("[build] @!@{rf}Error:@| Unable to find source space `%s`") % ctx.source_space_abs) # ensure the build space was previously built by catkin_tools previous_tool = get_previous_tool_used_on_the_space(ctx.build_space_abs) if previous_tool is not None and previous_tool != 'catkin build': if opts.override_build_tool_check: log(clr( "@{yf}Warning: build space at '%s' was previously built by '%s', " "but --override-build-tool-check was passed so continuing anyways." % (ctx.build_space_abs, previous_tool))) else: sys.exit(clr( "@{rf}The build space at '%s' was previously built by '%s'. " "Please remove the build space or pick a different build space." % (ctx.build_space_abs, previous_tool))) # the build space will be marked as catkin build's if dry run doesn't return # ensure the devel space was previously built by catkin_tools previous_tool = get_previous_tool_used_on_the_space(ctx.devel_space_abs) if previous_tool is not None and previous_tool != 'catkin build': if opts.override_build_tool_check: log(clr( "@{yf}Warning: devel space at '%s' was previously built by '%s', " "but --override-build-tool-check was passed so continuing anyways." % (ctx.devel_space_abs, previous_tool))) else: sys.exit(clr( "@{rf}The devel space at '%s' was previously built by '%s'. " "Please remove the devel space or pick a different devel space." % (ctx.devel_space_abs, previous_tool))) # the devel space will be marked as catkin build's if dry run doesn't return # Display list and leave the file system untouched if opts.dry_run: # TODO: Add unbuilt dry_run(ctx, opts.packages, opts.no_deps, opts.start_with) return # Print the build environment for a given package and leave the filesystem untouched if opts.get_env: return print_build_env(ctx, opts.get_env[0]) # Now mark the build and devel spaces as catkin build's since dry run didn't return. mark_space_as_built_by(ctx.build_space_abs, 'catkin build') mark_space_as_built_by(ctx.devel_space_abs, 'catkin build') # Get the last build context build_metadata = get_metadata(ctx.workspace, ctx.profile, 'build') if build_metadata.get('cmake_args') != ctx.cmake_args or build_metadata.get('cmake_args') != opts.cmake_args: opts.force_cmake = True if build_metadata.get('needs_force', False): opts.force_cmake = True update_metadata(ctx.workspace, ctx.profile, 'build', {'needs_force': False}) # Always save the last context under the build verb update_metadata(ctx.workspace, ctx.profile, 'build', ctx.get_stored_dict()) # Save the context as the configuration if opts.save_config: Context.save(ctx) # Get parallel toplevel jobs try: parallel_jobs = int(opts.parallel_jobs) except TypeError: parallel_jobs = None # Set VERBOSE environment variable if opts.verbose: os.environ['VERBOSE'] = '1' return build_isolated_workspace( ctx, packages=opts.packages, start_with=opts.start_with, no_deps=opts.no_deps, unbuilt=opts.unbuilt, n_jobs=parallel_jobs, force_cmake=opts.force_cmake, pre_clean=opts.pre_clean, force_color=opts.force_color, quiet=not opts.verbose, interleave_output=opts.interleave_output, no_status=opts.no_status, limit_status_rate=opts.limit_status_rate, lock_install=not opts.no_install_lock, no_notify=opts.no_notify, continue_on_failure=opts.continue_on_failure, summarize_build=opts.summarize # Can be True, False, or None )
def main(opts): # Check for develdebug mode if opts.develdebug is not None: os.environ['TROLLIUSDEBUG'] = opts.develdebug.lower() logging.basicConfig(level=opts.develdebug.upper()) # Set color options opts.force_color = os.environ.get('CATKIN_TOOLS_FORCE_COLOR', opts.force_color) if (opts.force_color or is_tty(sys.stdout)) and not opts.no_color: set_color(True) else: set_color(False) # Context-aware args if opts.build_this or opts.start_with_this: # Determine the enclosing package try: ws_path = find_enclosing_workspace(getcwd()) # Suppress warnings since this won't necessaraly find all packages # in the workspace (it stops when it finds one package), and # relying on it for warnings could mislead people. this_package = find_enclosing_package(search_start_path=getcwd(), ws_path=ws_path, warnings=[]) except (InvalidPackage, RuntimeError): this_package = None # Handle context-based package building if opts.build_this: if this_package: opts.packages += [this_package] else: sys.exit( "[build] Error: In order to use --this, the current directory must be part of a catkin package." ) # If --start--with was used without any packages and --this was specified, start with this package if opts.start_with_this: if this_package: opts.start_with = this_package else: sys.exit( "[build] Error: In order to use --this, the current directory must be part of a catkin package." ) if opts.no_deps and not opts.packages and not opts.unbuilt: sys.exit( clr("[build] @!@{rf}Error:@| With --no-deps, you must specify packages to build." )) # Load the context ctx = Context.load(opts.workspace, opts.profile, opts, append=True) # Initialize the build configuration make_args, makeflags, cli_flags, jobserver = configure_make_args( ctx.make_args, ctx.jobs_args, ctx.use_internal_make_jobserver) # Set the jobserver memory limit if jobserver and opts.mem_limit: log( clr("@!@{pf}EXPERIMENTAL: limit memory to '%s'@|" % str(opts.mem_limit))) # At this point psuitl will be required, check for it and bail out if not set try: import psutil # noqa except ImportError as exc: log("Could not import psutil, but psutil is required when using --mem-limit." ) log("Please either install psutil or avoid using --mem-limit.") sys.exit("Exception: {0}".format(exc)) job_server.set_max_mem(opts.mem_limit) ctx.make_args = make_args # Load the environment of the workspace to extend if ctx.extend_path is not None: try: load_resultspace_environment(ctx.extend_path) except IOError as exc: sys.exit( clr("[build] @!@{rf}Error:@| Unable to extend workspace from \"%s\": %s" % (ctx.extend_path, exc.message))) # Check if the context is valid before writing any metadata if not ctx.source_space_exists(): sys.exit( clr("[build] @!@{rf}Error:@| Unable to find source space `%s`") % ctx.source_space_abs) # ensure the build space was previously built by catkin_tools previous_tool = get_previous_tool_used_on_the_space(ctx.build_space_abs) if previous_tool is not None and previous_tool != 'catkin build': if opts.override_build_tool_check: log( clr("@{yf}Warning: build space at '%s' was previously built by '%s', " "but --override-build-tool-check was passed so continuing anyways." % (ctx.build_space_abs, previous_tool))) else: sys.exit( clr("@{rf}The build space at '%s' was previously built by '%s'. " "Please remove the build space or pick a different build space." % (ctx.build_space_abs, previous_tool))) # the build space will be marked as catkin build's if dry run doesn't return # ensure the devel space was previously built by catkin_tools previous_tool = get_previous_tool_used_on_the_space(ctx.devel_space_abs) if previous_tool is not None and previous_tool != 'catkin build': if opts.override_build_tool_check: log( clr("@{yf}Warning: devel space at '%s' was previously built by '%s', " "but --override-build-tool-check was passed so continuing anyways." % (ctx.devel_space_abs, previous_tool))) else: sys.exit( clr("@{rf}The devel space at '%s' was previously built by '%s'. " "Please remove the devel space or pick a different devel space." % (ctx.devel_space_abs, previous_tool))) # the devel space will be marked as catkin build's if dry run doesn't return # Display list and leave the file system untouched if opts.dry_run: # TODO: Add unbuilt dry_run(ctx, opts.packages, opts.no_deps, opts.start_with) return # Print the build environment for a given package and leave the filesystem untouched if opts.get_env: return print_build_env(ctx, opts.get_env[0]) # Now mark the build and devel spaces as catkin build's since dry run didn't return. mark_space_as_built_by(ctx.build_space_abs, 'catkin build') mark_space_as_built_by(ctx.devel_space_abs, 'catkin build') # Get the last build context build_metadata = get_metadata(ctx.workspace, ctx.profile, 'build') # Force cmake if the CMake arguments have changed if build_metadata.get('cmake_args') != ctx.cmake_args: opts.force_cmake = True # Check the devel layout compatibility last_devel_layout = build_metadata.get('devel_layout', ctx.devel_layout) if last_devel_layout != ctx.devel_layout: sys.exit( clr("@{rf}@!Error:@|@{rf} The current devel space layout, `{}`," "is incompatible with the configured layout, `{}`.@|").format( last_devel_layout, ctx.devel_layout)) # Check if some other verb has changed the workspace in such a way that it needs to be forced if build_metadata.get('needs_force', False): opts.force_cmake = True update_metadata(ctx.workspace, ctx.profile, 'build', {'needs_force': False}) # Always save the last context under the build verb update_metadata(ctx.workspace, ctx.profile, 'build', ctx.get_stored_dict()) # Save the context as the configuration if opts.save_config: Context.save(ctx) # Get parallel toplevel jobs try: parallel_jobs = int(opts.parallel_jobs) except TypeError: parallel_jobs = None # Set VERBOSE environment variable if opts.verbose: os.environ['VERBOSE'] = '1' return build_isolated_workspace( ctx, packages=opts.packages, start_with=opts.start_with, no_deps=opts.no_deps, unbuilt=opts.unbuilt, n_jobs=parallel_jobs, force_cmake=opts.force_cmake, pre_clean=opts.pre_clean, force_color=opts.force_color, quiet=not opts.verbose, interleave_output=opts.interleave_output, no_status=opts.no_status, limit_status_rate=opts.limit_status_rate, lock_install=not opts.no_install_lock, no_notify=opts.no_notify, continue_on_failure=opts.continue_on_failure, summarize_build=opts.summarize # Can be True, False, or None )
def main(opts): try: sysargs = sys.argv[1:] # Deprecated options deprecated_args = [ ('--blacklist', '--skiplist',), ('--no-blacklist', '--no-skiplist'), ('--whitelist', '--buildlist'), ('--no-whitelist', '--no-buildlist')] used_deprecated_args = [(old, new) for old, new in deprecated_args if old in sysargs] if any(used_deprecated_args): print(fmt('@!@{rf}WARNING:@| Some arguments are deprecated and will be' ' removed in a future release.\n')) print('Please switch to using their replacements as follows:') for old_arg, new_arg in used_deprecated_args: print(" - '{}' is deprecated, use '{}' instead".format(old_arg, new_arg)) print() # Determine if the user is trying to perform some action, in which # case, the workspace should be automatically initialized ignored_opts = ['main', 'verb'] actions = [v for k, v in vars(opts).items() if k not in ignored_opts] no_action = not any(actions) # Handle old argument names necessary for Context.load if opts.buildlist is not None: opts.whitelist = opts.buildlist del opts.buildlist if opts.skiplist is not None: opts.blacklist = opts.skiplist del opts.skiplist # Try to find a metadata directory to get context defaults # Otherwise use the specified directory context = Context.load( opts.workspace, opts.profile, opts, append=opts.append_args, remove=opts.remove_args) do_init = opts.init or not no_action summary_notes = [] if not context.initialized() and do_init: summary_notes.append(clr('@!@{cf}Initialized new catkin workspace in `{}`@|').format(context.workspace)) if context.initialized() or do_init: Context.save(context) if opts.mkdirs and not context.source_space_exists(): os.makedirs(context.source_space_abs) print(context.summary(notes=summary_notes)) except IOError as exc: # Usually happens if workspace is already underneath another catkin_tools workspace print(clr("@!@{rf}Error:@| Could not configure catkin workspace: {}").format(exc), file=sys.stderr) return 1 return 0
def main(opts): # Context-aware args if opts.build_this or opts.start_with_this: # Determine the enclosing package try: ws_path = find_enclosing_workspace(getcwd()) # Suppress warnings since this won't necessaraly find all packages # in the workspace (it stops when it finds one package), and # relying on it for warnings could mislead people. this_package = find_enclosing_package( search_start_path=getcwd(), ws_path=ws_path, warnings=[]) except (InvalidPackage, RuntimeError): this_package = None # Handle context-based package building if opts.build_this: if this_package: opts.packages += [this_package] else: sys.exit("catkin build: --this was specified, but this directory is not in a catkin package.") # If --start--with was used without any packages and --this was specified, start with this package if opts.start_with_this: if this_package: opts.start_with = this_package else: sys.exit("catkin build: --this was specified, but this directory is not in a catkin package.") if opts.no_deps and not opts.packages: sys.exit("With --no-deps, you must specify packages to build.") # Load the context ctx = Context.load(opts.workspace, opts.profile, opts, append=True) # Initialize the build configuration make_args, makeflags, cli_flags, jobserver = configure_make_args(ctx.make_args, ctx.use_internal_make_jobserver) # Set the jobserver memory limit if jobserver and opts.mem_limit: log(clr("@!@{pf}EXPERIMENTAL: limit memory to '%s'@|" % str(opts.mem_limit))) # At this point psuitl will be required, check for it and bail out if not set try: import psutil # noqa except ImportError as exc: log("Could not import psutil, but psutil is required when using --mem-limit.") log("Please either install psutil or avoid using --mem-limit.") sys.exit("Exception: {0}".format(exc)) set_jobserver_max_mem(opts.mem_limit) ctx.make_args = make_args # Load the environment of the workspace to extend if ctx.extend_path is not None: try: load_resultspace_environment(ctx.extend_path) except IOError as exc: log(clr("@!@{rf}Error:@| Unable to extend workspace from \"%s\": %s" % (ctx.extend_path, exc.message))) return 1 # Display list and leave the file system untouched if opts.dry_run: dry_run(ctx, opts.packages, opts.no_deps, opts.start_with) return # Check if the context is valid before writing any metadata if not ctx.source_space_exists(): print("catkin build: error: Unable to find source space `%s`" % ctx.source_space_abs) return 1 # Always save the last context under the build verb update_metadata(ctx.workspace, ctx.profile, 'build', ctx.get_stored_dict()) build_metadata = get_metadata(ctx.workspace, ctx.profile, 'build') if build_metadata.get('needs_force', False): opts.force_cmake = True update_metadata(ctx.workspace, ctx.profile, 'build', {'needs_force': False}) # Save the context as the configuration if opts.save_config: Context.save(ctx) start = time.time() try: return build_isolated_workspace( ctx, packages=opts.packages, start_with=opts.start_with, no_deps=opts.no_deps, jobs=opts.parallel_jobs, force_cmake=opts.force_cmake, force_color=opts.force_color, quiet=not opts.verbose, interleave_output=opts.interleave_output, no_status=opts.no_status, limit_status_rate=opts.limit_status_rate, lock_install=not opts.no_install_lock, no_notify=opts.no_notify, continue_on_failure=opts.continue_on_failure, summarize_build=opts.summarize # Can be True, False, or None ) finally: log("[build] Runtime: {0}".format(format_time_delta(time.time() - start)))