From abdbdcb5f5eb98a49fdaa51402222080793d9ba2 Mon Sep 17 00:00:00 2001 From: "Addisu Z. Taddese" Date: Tue, 2 Sep 2025 11:55:16 -0500 Subject: [PATCH 1/5] Add script to parse a gazebodistro file and create all vendor packages Signed-off-by: Addisu Z. Taddese --- create_gz_vendor_pkg/gz_vendor_all_libs.py | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 create_gz_vendor_pkg/gz_vendor_all_libs.py diff --git a/create_gz_vendor_pkg/gz_vendor_all_libs.py b/create_gz_vendor_pkg/gz_vendor_all_libs.py new file mode 100644 index 0000000..7fbcf80 --- /dev/null +++ b/create_gz_vendor_pkg/gz_vendor_all_libs.py @@ -0,0 +1,55 @@ +import argparse +from os.path import expanduser +import sys +from urllib.request import urlopen +import tempfile +import yaml +import create_vendor_package +from pathlib import Path +from subprocess import run + + +def clone(path, info): + run(["git", "clone", "--depth", "1", info["url"], path]) + + +def get_collection(release): + collection_url = f"https://github.com/gazebo-tooling/gazebodistro/raw/master/collection-{release}.yaml" # noqa + collection_yaml = urlopen(url=collection_url) + return yaml.full_load(collection_yaml) + + +def get_collection_local(release): + with open(expanduser(f"~/ws/{release}/src/collection-{release}.yaml"), "r") as f: + return yaml.full_load(f.read()) + + +def main(argv=sys.argv[1:]): + parser = argparse.ArgumentParser( + description="Update all packages for a given Gazebo release", + ) + + parser.add_argument( + "gazebo_release", + help="Name of Gazebo release to use", + ) + args, unknown_args = parser.parse_known_args(argv) + collection = get_collection_local(args.gazebo_release) + + # Sparse clone all the repos first + with tempfile.TemporaryDirectory(prefix="gz_vendor_") as libs_path: + for name, info in collection["repositories"].items(): + lib_path = Path(libs_path) / name + clone(lib_path, info) + + package_xml_path = Path(lib_path) / "package.xml" + print(package_xml_path) + + try: + create_vendor_package.main([str(package_xml_path), *unknown_args]) + except Exception as e: + print("Error: ", e) + + +if __name__ == "__main__": + main() From 6dd7a4bee11b450139c214e1cc8a73324bd3889e Mon Sep 17 00:00:00 2001 From: "Addisu Z. Taddese" Date: Thu, 4 Sep 2025 15:40:29 -0500 Subject: [PATCH 2/5] Checkout the correct branch Signed-off-by: Addisu Z. Taddese --- create_gz_vendor_pkg/gz_vendor_all_libs.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/create_gz_vendor_pkg/gz_vendor_all_libs.py b/create_gz_vendor_pkg/gz_vendor_all_libs.py index 7fbcf80..36f08dc 100644 --- a/create_gz_vendor_pkg/gz_vendor_all_libs.py +++ b/create_gz_vendor_pkg/gz_vendor_all_libs.py @@ -10,7 +10,7 @@ def clone(path, info): - run(["git", "clone", "--depth", "1", info["url"], path]) + run(["git", "clone", "--depth", "1", "-b", info["version"], info["url"], path]) def get_collection(release): @@ -49,6 +49,8 @@ def main(argv=sys.argv[1:]): create_vendor_package.main([str(package_xml_path), *unknown_args]) except Exception as e: print("Error: ", e) + import traceback + traceback.print_exc() if __name__ == "__main__": From c15ceb030a9f32779a05a7c8831343d71c3646db Mon Sep 17 00:00:00 2001 From: Steve Peters Date: Thu, 4 Sep 2025 22:42:47 +0000 Subject: [PATCH 3/5] Add --output_dir arg and append package name Write each vendor package to a subfolder of the output_dir arg named after the vendor package. Signed-off-by: Steve Peters --- create_gz_vendor_pkg/gz_vendor_all_libs.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/create_gz_vendor_pkg/gz_vendor_all_libs.py b/create_gz_vendor_pkg/gz_vendor_all_libs.py index 36f08dc..da58f79 100644 --- a/create_gz_vendor_pkg/gz_vendor_all_libs.py +++ b/create_gz_vendor_pkg/gz_vendor_all_libs.py @@ -31,8 +31,14 @@ def main(argv=sys.argv[1:]): parser.add_argument( "gazebo_release", + type=str, help="Name of Gazebo release to use", ) + parser.add_argument( + "--output_dir", + type=str, + help="Output directory", + ) args, unknown_args = parser.parse_known_args(argv) collection = get_collection_local(args.gazebo_release) @@ -45,8 +51,15 @@ def main(argv=sys.argv[1:]): package_xml_path = Path(lib_path) / "package.xml" print(package_xml_path) + output_dir_args = [] + if args.output_dir != "": + vendor_name = name.replace('-', '_') + '_vendor' + output_path = str(Path(args.output_dir) / vendor_name) + output_dir_args.append("--output_dir") + output_dir_args.append(output_path) + try: - create_vendor_package.main([str(package_xml_path), *unknown_args]) + create_vendor_package.main([str(package_xml_path), *output_dir_args, *unknown_args]) except Exception as e: print("Error: ", e) import traceback From 772b566aba2c86963b073bea30d7ad650505dc76 Mon Sep 17 00:00:00 2001 From: "Addisu Z. Taddese" Date: Fri, 5 Sep 2025 15:47:53 -0500 Subject: [PATCH 4/5] Vendor CLI11 in gz-utils (#22) CLI11 is not yet available on ci.ros2.org, so use the vendored version --------- Signed-off-by: Addisu Z. Taddese Co-authored-by: Steve Peters --- create_gz_vendor_pkg/create_vendor_package.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/create_gz_vendor_pkg/create_vendor_package.py b/create_gz_vendor_pkg/create_vendor_package.py index ffce4bd..df54c6b 100644 --- a/create_gz_vendor_pkg/create_vendor_package.py +++ b/create_gz_vendor_pkg/create_vendor_package.py @@ -334,6 +334,11 @@ def create_cmake_file(src_pkg_xml: Package, extra_params: dict): if pkg_has_docs(pkg_name_no_version) and not build_docs_deprecated(src_pkg_xml): params["cmake_args"] = ["-DBUILD_DOCS:BOOL=OFF"] + # CLI11 is not available on ci.ros2.org, which uses a curated list of dependencies instead of rosdep. + # TODO(azeey): Remove this once ros2/ci#825 and ros2/ros2#1745 are merged + if pkg_name_no_version == "gz-utils": + params["cmake_args"].append("-DGZ_UTILS_VENDOR_CLI11=ON") + if pkg_has_pybind11(pkg_name_no_version) and params["versioned_package_name"]: params["cmake_args"].append("-DSKIP_PYBIND11:BOOL=ON") if pkg_has_swig(pkg_name_no_version): From 6b3479e9a0c941f4c00c41064b9f42f499146429 Mon Sep 17 00:00:00 2001 From: "Addisu Z. Taddese" Date: Fri, 19 Sep 2025 19:42:44 -0500 Subject: [PATCH 5/5] Download collection file Signed-off-by: Addisu Z. Taddese --- create_gz_vendor_pkg/gz_vendor_all_libs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/create_gz_vendor_pkg/gz_vendor_all_libs.py b/create_gz_vendor_pkg/gz_vendor_all_libs.py index da58f79..89f600b 100644 --- a/create_gz_vendor_pkg/gz_vendor_all_libs.py +++ b/create_gz_vendor_pkg/gz_vendor_all_libs.py @@ -40,7 +40,7 @@ def main(argv=sys.argv[1:]): help="Output directory", ) args, unknown_args = parser.parse_known_args(argv) - collection = get_collection_local(args.gazebo_release) + collection = get_collection(args.gazebo_release) # Sparse clone all the repos first with tempfile.TemporaryDirectory(prefix="gz_vendor_") as libs_path: