def _create_unmerged_devel_setup(context, unbuilt): # Find all of the leaf packages in the workspace # where leaf means that nothing in the workspace depends on it ordered_packages = context.packages workspace_packages = dict([(p.name, p) for pth, p in ordered_packages]) # Get all packages which are dependencies of packages in the workspace which have been built dependencies = set( sum([[ d.name for d in p.buildtool_depends + p.build_depends + p.run_depends ] for _, p in workspace_packages.items() if p.name not in unbuilt], [])) # Compute the packages on which no other packages depend leaf_packages = [ pkg.name for name, pkg in workspace_packages.items() if pkg.name not in dependencies ] leaf_paths = [ os.path.join(context.devel_space_abs, p, 'setup.sh') for p in leaf_packages ] leaf_sources = [ '. {}'.format(source_path) for source_path in leaf_paths if os.path.isfile(source_path) ] # In addition to the leaf packages, we need to source the recursive run depends of the leaf packages run_depends_packages = get_recursive_run_depends_in_workspace( [workspace_packages[p] for p in leaf_packages], ordered_packages) run_depends_paths = [ os.path.join(context.devel_space_abs, pth, 'setup.sh') for pth, pkg in run_depends_packages ] run_depends_sources = [ '. {}'.format(source_path) for source_path in run_depends_paths if os.path.isfile(source_path) ] # Create the setup.sh file setup_sh_path = os.path.join(context.devel_space_abs, 'setup.sh') env_file = SETUP_SH_TEMPLATE.format( first_source=leaf_sources[0], leaf_sources='\n'.join(leaf_sources[1:]), run_depends_sources='\n'.join(run_depends_sources)) with open(setup_sh_path, 'w') as f: f.write(env_file) # Create setup.bash file setup_bash_path = os.path.join(context.devel_space_abs, 'setup.bash') with open(setup_bash_path, 'w') as f: f.write(SETUP_BASH_TEMPLATE) # Create setup.zsh file setup_zsh_path = os.path.join(context.devel_space_abs, 'setup.zsh') with open(setup_zsh_path, 'w') as f: f.write(SETUP_ZSH_TEMPLATE)
def _create_unmerged_devel_setup(context, unbuilt): # Find all of the leaf packages in the workspace # where leaf means that nothing in the workspace depends on it ordered_packages = context.packages workspace_packages = dict([(p.name, p) for pth, p in ordered_packages]) # Get all packages which are dependencies of packages in the workspace which have been built dependencies = set(sum([ [d.name for d in p.buildtool_depends + p.build_depends + p.run_depends] for _, p in workspace_packages.items() if p.name not in unbuilt ], [])) # Compute the packages on which no other packages depend leaf_packages = [ pkg.name for name, pkg in workspace_packages.items() if pkg.name not in dependencies ] leaf_paths = [ os.path.join(context.devel_space_abs, p, 'setup.sh') for p in leaf_packages ] leaf_sources = [ '. {}'.format(source_path) for source_path in leaf_paths if os.path.isfile(source_path) ] # In addition to the leaf packages, we need to source the recursive run depends of the leaf packages run_depends_packages = get_recursive_run_depends_in_workspace( [workspace_packages[p] for p in leaf_packages], ordered_packages) run_depends_paths = [ os.path.join(context.devel_space_abs, pth, 'setup.sh') for pth, pkg in run_depends_packages ] run_depends_sources = [ '. {}'.format(source_path) for source_path in run_depends_paths if os.path.isfile(source_path) ] # Create the setup.sh file setup_sh_path = os.path.join(context.devel_space_abs, 'setup.sh') env_file = SETUP_SH_TEMPLATE.format( first_source=leaf_sources[0], leaf_sources='\n'.join(leaf_sources[1:]), run_depends_sources='\n'.join(run_depends_sources) ) with open(setup_sh_path, 'w') as f: f.write(env_file) os.chmod(setup_sh_path, stat.S_IXUSR | stat.S_IWUSR | stat.S_IRUSR) # Create setup.bash file setup_bash_path = os.path.join(context.devel_space_abs, 'setup.bash') with open(setup_bash_path, 'w') as f: f.write(SETUP_BASH_TEMPLATE) os.chmod(setup_bash_path, stat.S_IXUSR | stat.S_IWUSR | stat.S_IRUSR) # Create setup.zsh file setup_zsh_path = os.path.join(context.devel_space_abs, 'setup.zsh') with open(setup_zsh_path, 'w') as f: f.write(SETUP_ZSH_TEMPLATE) os.chmod(setup_zsh_path, stat.S_IXUSR | stat.S_IWUSR | stat.S_IRUSR)
def main(opts): # Load the context ctx = Context.load(opts.workspace, opts.profile, load_env=False) if not ctx: sys.exit(clr("@{rf}ERROR: Could not determine workspace.@|"), file=sys.stderr) if opts.directory: folders = opts.directory else: folders = [ctx.source_space_abs] list_entry_format = '@{pf}-@| @{cf}%s@|' if not opts.unformatted else '%s' opts.depends_on = set(opts.depends_on) if opts.depends_on else set() warnings = [] for folder in folders: try: packages = find_packages(folder, warnings=warnings) ordered_packages = topological_order_packages(packages) if ordered_packages and ordered_packages[-1][0] is None: sys.exit( clr("@{rf}ERROR: Circular dependency within packages:@| " + ordered_packages[-1][1]), file=sys.stderr) packages_by_name = { pkg.name: (pth, pkg) for pth, pkg in ordered_packages } if opts.depends_on or opts.rdepends_on: dependents = set() for pth, pkg in ordered_packages: is_dep = opts.depends_on.intersection( [p.name for p in pkg.build_depends + pkg.run_depends]) if is_dep: dependents.add(pkg.name) for pth, pkg in [ packages_by_name.get(n) for n in opts.rdepends_on ]: if pkg is None: continue rbd = get_recursive_build_dependents_in_workspace( pkg.name, ordered_packages) rrd = get_recursive_run_dependents_in_workspace( pkg.name, ordered_packages) dependents.update([p.name for _, p in rbd]) dependents.update([p.name for _, p in rrd]) filtered_packages = [(pth, pkg) for pth, pkg in ordered_packages if pkg.name in dependents] elif opts.this: this_package = find_enclosing_package( search_start_path=getcwd(), ws_path=ctx.workspace, warnings=[]) if this_package is None: sys.exit(1) if this_package in packages_by_name: filtered_packages = [packages_by_name[this_package]] else: filtered_packages = [] else: filtered_packages = ordered_packages for pkg_pth, pkg in filtered_packages: print(clr(list_entry_format % pkg.name)) if opts.rdeps: build_deps = [ p for dp, p in get_recursive_build_depends_in_workspace( pkg, ordered_packages) ] run_deps = [ p for dp, p in get_recursive_run_depends_in_workspace( [pkg], ordered_packages) ] else: build_deps = [ dep for dep in pkg.build_depends if dep.evaluated_condition ] run_deps = [ dep for dep in pkg.run_depends if dep.evaluated_condition ] if opts.deps or opts.rdeps: if len(build_deps) > 0: print(clr(' @{yf}build_depend:@|')) for dep in build_deps: print(clr(' @{pf}-@| %s' % dep.name)) if len(run_deps) > 0: print(clr(' @{yf}run_depend:@|')) for dep in run_deps: print(clr(' @{pf}-@| %s' % dep.name)) except InvalidPackage as ex: sys.exit( clr("@{rf}Error:@| The file %s is an invalid package.xml file." " See below for details:\n\n%s" % (ex.package_path, ex.msg))) # Print out warnings if not opts.quiet: for warning in warnings: print(clr("@{yf}Warning:@| %s" % warning), file=sys.stderr)
def _create_unmerged_devel_setup(context): # Find all of the leaf packages in the workspace # where leaf means that nothing in the workspace depends on it workspace_packages = find_packages(context.source_space_abs, exclude_subspaces=True) ordered_packages = topological_order_packages(workspace_packages) workspace_packages = dict([(p.name, p) for pth, p in workspace_packages.items()]) dependencies = set([]) for name, pkg in workspace_packages.items(): dependencies.update([ d.name for d in pkg.buildtool_depends + pkg.build_depends + pkg.run_depends ]) leaf_packages = [] for name, pkg in workspace_packages.items(): if pkg.name not in dependencies: leaf_packages.append(pkg.name) assert leaf_packages, leaf_packages # Defensive, there should always be at least one leaf leaf_sources = [] for pkg_name in leaf_packages: source_path = os.path.join(context.devel_space_abs, pkg_name, 'setup.sh') if os.path.isfile(source_path): leaf_sources.append('. {0}'.format(source_path)) # In addition to the leaf packages, we need to source the recursive run depends of the leaf packages run_depends = get_recursive_run_depends_in_workspace( [workspace_packages[p] for p in leaf_packages], ordered_packages) run_depends_sources = [] for run_dep_name in [p.name for pth, p in run_depends]: source_path = os.path.join(context.devel_space_abs, run_dep_name, 'setup.sh') if os.path.isfile(source_path): run_depends_sources.append('. {0}'.format(source_path)) # Create the setup.sh file setup_sh_path = os.path.join(context.devel_space_abs, 'setup.sh') env_file = """\ #!/usr/bin/env sh # generated from within catkin_tools/verbs/catkin_build/build.py # This file is aggregates the many setup.sh files in the various # unmerged devel spaces in this folder. # This is occomplished by sourcing each leaf package and all the # recursive run dependencies of those leaf packages # Source the first package's setup.sh without the --extend option {first_source} # remove all passed in args, resetting $@, $*, $#, $n shift $# # set the --extend arg for rest of the packages setup.sh's set -- $@ "--extend" # source setup.sh for each of the leaf packages in the workspace {leaf_sources} # And now the setup.sh for each of their recursive run dependencies {run_depends_sources} """.format(first_source=leaf_sources[0], leaf_sources='\n'.join(leaf_sources[1:]), run_depends_sources='\n'.join(run_depends_sources)) with open(setup_sh_path, 'w') as f: f.write(env_file) # Make this file executable os.chmod(setup_sh_path, stat.S_IXUSR | stat.S_IWUSR | stat.S_IRUSR) # Create the setup.bash file setup_bash_path = os.path.join(context.devel_space_abs, 'setup.bash') with open(setup_bash_path, 'w') as f: f.write("""\ #!/usr/bin/env bash # generated from within catkin_tools/verbs/catkin_build/build.py CATKIN_SHELL=bash # source setup.sh from same directory as this file _BUILD_SETUP_DIR=$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" && pwd) . "$_BUILD_SETUP_DIR/setup.sh" """) # Make this file executable os.chmod(setup_bash_path, stat.S_IXUSR | stat.S_IWUSR | stat.S_IRUSR) setup_zsh_path = os.path.join(context.devel_space_abs, 'setup.zsh') with open(setup_zsh_path, 'w') as f: f.write("""\ #!/usr/bin/env zsh # generated from within catkin_tools/verbs/catkin_build/build.py CATKIN_SHELL=zsh # source setup.sh from same directory as this file _BUILD_SETUP_DIR=$(builtin cd -q "`dirname "$0"`" && pwd) emulate sh # emulate POSIX . "$_BUILD_SETUP_DIR/setup.sh" emulate zsh # back to zsh mode """) # Make this file executable os.chmod(setup_zsh_path, stat.S_IXUSR | stat.S_IWUSR | stat.S_IRUSR)
def _create_unmerged_devel_setup(context): # Find all of the leaf packages in the workspace # where leaf means that nothing in the workspace depends on it # Find all packages in the source space # Suppress warnings since this is an internal function whose goal is not to # give feedback on the user's packages workspace_packages = find_packages(context.source_space_abs, exclude_subspaces=True, warnings=[]) ordered_packages = topological_order_packages(workspace_packages) workspace_packages = dict([(p.name, p) for pth, p in workspace_packages.items()]) dependencies = set([]) for name, pkg in workspace_packages.items(): dependencies.update([d.name for d in pkg.buildtool_depends + pkg.build_depends + pkg.run_depends]) leaf_packages = [] for name, pkg in workspace_packages.items(): if pkg.name not in dependencies: leaf_packages.append(pkg.name) assert leaf_packages, leaf_packages # Defensive, there should always be at least one leaf leaf_sources = [] for pkg_name in leaf_packages: source_path = os.path.join(context.devel_space_abs, pkg_name, 'setup.sh') if os.path.isfile(source_path): leaf_sources.append('. {0}'.format(source_path)) # In addition to the leaf packages, we need to source the recursive run depends of the leaf packages run_depends = get_recursive_run_depends_in_workspace( [workspace_packages[p] for p in leaf_packages], ordered_packages) run_depends_sources = [] for run_dep_name in [p.name for pth, p in run_depends]: source_path = os.path.join(context.devel_space_abs, run_dep_name, 'setup.sh') if os.path.isfile(source_path): run_depends_sources.append('. {0}'.format(source_path)) # Create the setup.sh file setup_sh_path = os.path.join(context.devel_space_abs, 'setup.sh') env_file = """\ #!/usr/bin/env sh # generated from within catkin_tools/verbs/catkin_build/build.py # This file is aggregates the many setup.sh files in the various # unmerged devel spaces in this folder. # This is occomplished by sourcing each leaf package and all the # recursive run dependencies of those leaf packages # Source the first package's setup.sh without the --extend option {first_source} # remove all passed in args, resetting $@, $*, $#, $n shift $# # set the --extend arg for rest of the packages setup.sh's set -- $@ "--extend" # source setup.sh for each of the leaf packages in the workspace {leaf_sources} # And now the setup.sh for each of their recursive run dependencies {run_depends_sources} """.format( first_source=leaf_sources[0], leaf_sources='\n'.join(leaf_sources[1:]), run_depends_sources='\n'.join(run_depends_sources) ) with open(setup_sh_path, 'w') as f: f.write(env_file) # Make this file executable os.chmod(setup_sh_path, stat.S_IXUSR | stat.S_IWUSR | stat.S_IRUSR) # Create the setup.bash file setup_bash_path = os.path.join(context.devel_space_abs, 'setup.bash') with open(setup_bash_path, 'w') as f: f.write("""\ #!/usr/bin/env bash # generated from within catkin_tools/verbs/catkin_build/build.py CATKIN_SHELL=bash # source setup.sh from same directory as this file _BUILD_SETUP_DIR=$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" && pwd) . "$_BUILD_SETUP_DIR/setup.sh" """) # Make this file executable os.chmod(setup_bash_path, stat.S_IXUSR | stat.S_IWUSR | stat.S_IRUSR) setup_zsh_path = os.path.join(context.devel_space_abs, 'setup.zsh') with open(setup_zsh_path, 'w') as f: f.write("""\ #!/usr/bin/env zsh # generated from within catkin_tools/verbs/catkin_build/build.py CATKIN_SHELL=zsh # source setup.sh from same directory as this file _BUILD_SETUP_DIR=$(builtin cd -q "`dirname "$0"`" && pwd) emulate sh # emulate POSIX . "$_BUILD_SETUP_DIR/setup.sh" emulate zsh # back to zsh mode """) # Make this file executable os.chmod(setup_zsh_path, stat.S_IXUSR | stat.S_IWUSR | stat.S_IRUSR)
def main(opts): # Load the context ctx = Context.load(opts.workspace, opts.profile, load_env=False) if not ctx: print(clr("@{rf}ERROR: Could not determine workspace.@|"), file=sys.stderr) sys.exit(1) folders = [ctx.source_space_abs] list_entry_format = '@{pf}-@| @{cf}%s@|' if not opts.unformatted else '%s' opts.depends_on = set(opts.depends_on) if opts.depends_on else set() warnings = [] for folder in folders: try: packages = find_packages(folder, warnings=warnings) ordered_packages = topological_order_packages(packages) packages_by_name = {pkg.name: (pth, pkg) for pth, pkg in ordered_packages} if opts.depends_on or opts.rdepends_on: dependents = set() for pth, pkg in ordered_packages: is_dep = opts.depends_on.intersection([ p.name for p in pkg.build_depends + pkg.run_depends]) if is_dep: dependents.add(pkg.name) for pth, pkg in [packages_by_name.get(n) for n in opts.rdepends_on]: if pkg is None: continue rbd = get_recursive_build_dependents_in_workspace(pkg.name, ordered_packages) rrd = get_recursive_run_dependents_in_workspace(pkg.name, ordered_packages) dependents.update([p.name for _, p in rbd]) dependents.update([p.name for _, p in rrd]) filtered_packages = [ (pth, pkg) for pth, pkg in ordered_packages if pkg.name in dependents] elif opts.this: this_package = find_enclosing_package( search_start_path=getcwd(), ws_path=ctx.workspace, warnings=[]) if this_package is None: sys.exit(1) if this_package in packages_by_name: filtered_packages = [packages_by_name[this_package]] else: filtered_packages = [] else: filtered_packages = ordered_packages for pkg_pth, pkg in filtered_packages: print(clr(list_entry_format % pkg.name)) if opts.rdeps: build_deps = [p for dp, p in get_recursive_build_depends_in_workspace(pkg, ordered_packages)] run_deps = [p for dp, p in get_recursive_run_depends_in_workspace([pkg], ordered_packages)] else: build_deps = pkg.build_depends run_deps = pkg.run_depends if opts.deps or opts.rdeps: if len(build_deps) > 0: print(clr(' @{yf}build_depend:@|')) for dep in build_deps: print(clr(' @{pf}-@| %s' % dep.name)) if len(run_deps) > 0: print(clr(' @{yf}run_depend:@|')) for dep in run_deps: print(clr(' @{pf}-@| %s' % dep.name)) except InvalidPackage as ex: message = '\n'.join(ex.args) print(clr("@{rf}Error:@| The directory %s contains an invalid package." " See below for details:\n\n%s" % (folder, message))) # Print out warnings if not opts.quiet: for warning in warnings: print(clr("@{yf}Warning:@| %s" % warning), file=sys.stderr)