diff --git a/distros/humble/overrides.nix b/distros/humble/overrides.nix index 16e5bc96cef..bfd7a85c57c 100644 --- a/distros/humble/overrides.nix +++ b/distros/humble/overrides.nix @@ -310,4 +310,55 @@ in with lib; { }) ]; }); + + zenoh-cpp-vendor = (lib.patchAmentVendorGit rosSuper.zenoh-cpp-vendor {}).overrideAttrs(finalAttrs: { + nativeBuildInputs ? [], postPatch ? "", passthru ? {}, ... + }: let + outputHashes = { + "zenoh-1.5.1" = "sha256-EeigSU9l7LCnSkm4/jP0WcdO3Hw9m91zUh8jzVXYhKw="; + }; + zenoh-c-source = finalAttrs.passthru.amentVendorSrcs.zenoh_c_vendor; + in { + postPatch = postPatch + '' + ln -s ${zenoh-c-source}/Cargo.lock Cargo.lock + ''; + nativeBuildInputs = nativeBuildInputs ++ [ + self.rustPlatform.cargoSetupHook + self.rustc + ]; + cargoDeps = self.rustPlatform.importCargoLock { + lockFile = "${zenoh-c-source}/Cargo.lock"; + inherit outputHashes; + }; + + # Patch the build.rs script to be able to build internal + # opaque-types crate without network access. + passthru = lib.recursiveUpdate passthru { + amentVendorSrcs.zenoh_c_vendor = let + src = passthru.amentVendorSrcs.zenoh_c_vendor; + in + self.applyPatches { + inherit src; + name = src.rev; + patches = [ ./zenoh-cpp-vendor/zenoh-c.patch ]; + }; + }; + + # Prepare vendored dependencies for internal opaque-types crate. + # Execute in subshell to not change variables set by the normal + # cargoSetupPostUnpackHook. + preBuild = '' + ( + mkdir nix-zenoh-opaque-types + cd nix-zenoh-opaque-types + cargoDeps=${self.rustPlatform.importCargoLock { + lockFile = "${zenoh-c-source}/build-resources/opaque-types/Cargo.lock"; + inherit outputHashes; + }} + cargoSetupPostUnpackHook + ) + # Export information for use by our patched build.rs script. + export NIX_ZENOH_OPAQUE_TYPES_CARGO_CONFIG=$PWD/nix-zenoh-opaque-types/.cargo/config.toml + ''; + }); } diff --git a/distros/humble/zenoh-cpp-vendor/vendored-source.json b/distros/humble/zenoh-cpp-vendor/vendored-source.json new file mode 100644 index 00000000000..1e6f70c645e --- /dev/null +++ b/distros/humble/zenoh-cpp-vendor/vendored-source.json @@ -0,0 +1,12 @@ +{ + "zenoh_c_vendor": { + "url": "https://github.com/eclipse-zenoh/zenoh-c.git", + "rev": "8f9ce70e4c4b55d150632730fd4c48abffbde765", + "hash": "sha256-kbDIatj4GFhUyDo9yCc6FzPYszHE+Vd79w4r452p77Y=" + }, + "zenoh_cpp_vendor": { + "url": "https://github.com/eclipse-zenoh/zenoh-cpp", + "rev": "05533d20db70ffc1d53a0e07f39caa999e82febd", + "hash": "sha256-lEicWShyKo5NSFyDeMqItZIweY3syXKF629x7woSQ0o=" + } +} diff --git a/distros/humble/zenoh-cpp-vendor/zenoh-c.patch b/distros/humble/zenoh-cpp-vendor/zenoh-c.patch new file mode 100644 index 00000000000..a2c5bc1e616 --- /dev/null +++ b/distros/humble/zenoh-cpp-vendor/zenoh-c.patch @@ -0,0 +1,25 @@ +diff --git a/buildrs/opaque_types_generator.rs b/buildrs/opaque_types_generator.rs +index c1d0bdd3..2d190518 100644 +--- a/buildrs/opaque_types_generator.rs ++++ b/buildrs/opaque_types_generator.rs +@@ -14,7 +14,10 @@ pub fn generate_opaque_types() { + let data_in = std::fs::read_to_string(path_in).unwrap(); + + // Check for cargo-level errors (dependency resolution, manifest parsing, etc.) +- if data_in.contains("error: failed to") || data_in.contains("Caused by:") { ++ if data_in.contains("error: failed to") ++ || data_in.contains("error: no matching package named") ++ || data_in.contains("Caused by:") ++ { + panic!( + "Failed to generate opaque types due to cargo error:\n\nCommand executed:\n\n{command}\n\nCargo output:\n\n{data_in}" + ); +@@ -127,6 +130,8 @@ fn produce_opaque_types_data() -> (String, PathBuf) { + .arg("build") + .args(feature_args) + .args(linker_args) ++ .arg("--config") ++ .arg(std::env::var("NIX_ZENOH_OPAQUE_TYPES_CARGO_CONFIG").unwrap()) + .arg("--target") + .arg(target) + .arg("--manifest-path") diff --git a/distros/jazzy/overrides.nix b/distros/jazzy/overrides.nix index 5b5337a0ab9..83e487861a3 100644 --- a/distros/jazzy/overrides.nix +++ b/distros/jazzy/overrides.nix @@ -275,5 +275,54 @@ in { ]; }); - zenoh-cpp-vendor = lib.patchAmentVendorGit rosSuper.zenoh-cpp-vendor { }; + zenoh-cpp-vendor = (lib.patchAmentVendorGit rosSuper.zenoh-cpp-vendor {}).overrideAttrs(finalAttrs: { + nativeBuildInputs ? [], postPatch ? "", passthru ? {}, ... + }: let + outputHashes = { + "zenoh-1.5.1" = "sha256-EeigSU9l7LCnSkm4/jP0WcdO3Hw9m91zUh8jzVXYhKw="; + }; + zenoh-c-source = finalAttrs.passthru.amentVendorSrcs.zenoh_c_vendor; + in { + postPatch = postPatch + '' + ln -s ${zenoh-c-source}/Cargo.lock Cargo.lock + ''; + nativeBuildInputs = nativeBuildInputs ++ [ + self.rustPlatform.cargoSetupHook + self.rustc + ]; + cargoDeps = self.rustPlatform.importCargoLock { + lockFile = "${zenoh-c-source}/Cargo.lock"; + inherit outputHashes; + }; + + # Patch the build.rs script to be able to build internal + # opaque-types crate without network access. + passthru = lib.recursiveUpdate passthru { + amentVendorSrcs.zenoh_c_vendor = let + src = passthru.amentVendorSrcs.zenoh_c_vendor; + in + self.applyPatches { + inherit src; + name = src.rev; + patches = [ ./zenoh-cpp-vendor/zenoh-c.patch ]; + }; + }; + + # Prepare vendored dependencies for internal opaque-types crate. + # Execute in subshell to not change variables set by the normal + # cargoSetupPostUnpackHook. + preBuild = '' + ( + mkdir nix-zenoh-opaque-types + cd nix-zenoh-opaque-types + cargoDeps=${self.rustPlatform.importCargoLock { + lockFile = "${zenoh-c-source}/build-resources/opaque-types/Cargo.lock"; + inherit outputHashes; + }} + cargoSetupPostUnpackHook + ) + # Export information for use by our patched build.rs script. + export NIX_ZENOH_OPAQUE_TYPES_CARGO_CONFIG=$PWD/nix-zenoh-opaque-types/.cargo/config.toml + ''; + }); } diff --git a/distros/jazzy/zenoh-cpp-vendor/zenoh-c.patch b/distros/jazzy/zenoh-cpp-vendor/zenoh-c.patch new file mode 100644 index 00000000000..a2c5bc1e616 --- /dev/null +++ b/distros/jazzy/zenoh-cpp-vendor/zenoh-c.patch @@ -0,0 +1,25 @@ +diff --git a/buildrs/opaque_types_generator.rs b/buildrs/opaque_types_generator.rs +index c1d0bdd3..2d190518 100644 +--- a/buildrs/opaque_types_generator.rs ++++ b/buildrs/opaque_types_generator.rs +@@ -14,7 +14,10 @@ pub fn generate_opaque_types() { + let data_in = std::fs::read_to_string(path_in).unwrap(); + + // Check for cargo-level errors (dependency resolution, manifest parsing, etc.) +- if data_in.contains("error: failed to") || data_in.contains("Caused by:") { ++ if data_in.contains("error: failed to") ++ || data_in.contains("error: no matching package named") ++ || data_in.contains("Caused by:") ++ { + panic!( + "Failed to generate opaque types due to cargo error:\n\nCommand executed:\n\n{command}\n\nCargo output:\n\n{data_in}" + ); +@@ -127,6 +130,8 @@ fn produce_opaque_types_data() -> (String, PathBuf) { + .arg("build") + .args(feature_args) + .args(linker_args) ++ .arg("--config") ++ .arg(std::env::var("NIX_ZENOH_OPAQUE_TYPES_CARGO_CONFIG").unwrap()) + .arg("--target") + .arg(target) + .arg("--manifest-path") diff --git a/distros/kilted/overrides.nix b/distros/kilted/overrides.nix index d68a9ada456..4834c435fd2 100644 --- a/distros/kilted/overrides.nix +++ b/distros/kilted/overrides.nix @@ -233,4 +233,55 @@ in { }) ]; }); + + zenoh-cpp-vendor = (lib.patchAmentVendorGit rosSuper.zenoh-cpp-vendor {}).overrideAttrs(finalAttrs: { + nativeBuildInputs ? [], postPatch ? "", passthru ? {}, ... + }: let + outputHashes = { + "zenoh-1.5.1" = "sha256-EeigSU9l7LCnSkm4/jP0WcdO3Hw9m91zUh8jzVXYhKw="; + }; + zenoh-c-source = finalAttrs.passthru.amentVendorSrcs.zenoh_c_vendor; + in { + postPatch = postPatch + '' + ln -s ${zenoh-c-source}/Cargo.lock Cargo.lock + ''; + nativeBuildInputs = nativeBuildInputs ++ [ + self.rustPlatform.cargoSetupHook + self.rustc + ]; + cargoDeps = self.rustPlatform.importCargoLock { + lockFile = "${zenoh-c-source}/Cargo.lock"; + inherit outputHashes; + }; + + # Patch the build.rs script to be able to build internal + # opaque-types crate without network access. + passthru = lib.recursiveUpdate passthru { + amentVendorSrcs.zenoh_c_vendor = let + src = passthru.amentVendorSrcs.zenoh_c_vendor; + in + self.applyPatches { + inherit src; + name = src.rev; + patches = [ ./zenoh-cpp-vendor/zenoh-c.patch ]; + }; + }; + + # Prepare vendored dependencies for internal opaque-types crate. + # Execute in subshell to not change variables set by the normal + # cargoSetupPostUnpackHook. + preBuild = '' + ( + mkdir nix-zenoh-opaque-types + cd nix-zenoh-opaque-types + cargoDeps=${self.rustPlatform.importCargoLock { + lockFile = "${zenoh-c-source}/build-resources/opaque-types/Cargo.lock"; + inherit outputHashes; + }} + cargoSetupPostUnpackHook + ) + # Export information for use by our patched build.rs script. + export NIX_ZENOH_OPAQUE_TYPES_CARGO_CONFIG=$PWD/nix-zenoh-opaque-types/.cargo/config.toml + ''; + }); } diff --git a/distros/kilted/zenoh-cpp-vendor/vendored-source.json b/distros/kilted/zenoh-cpp-vendor/vendored-source.json new file mode 100644 index 00000000000..1e6f70c645e --- /dev/null +++ b/distros/kilted/zenoh-cpp-vendor/vendored-source.json @@ -0,0 +1,12 @@ +{ + "zenoh_c_vendor": { + "url": "https://github.com/eclipse-zenoh/zenoh-c.git", + "rev": "8f9ce70e4c4b55d150632730fd4c48abffbde765", + "hash": "sha256-kbDIatj4GFhUyDo9yCc6FzPYszHE+Vd79w4r452p77Y=" + }, + "zenoh_cpp_vendor": { + "url": "https://github.com/eclipse-zenoh/zenoh-cpp", + "rev": "05533d20db70ffc1d53a0e07f39caa999e82febd", + "hash": "sha256-lEicWShyKo5NSFyDeMqItZIweY3syXKF629x7woSQ0o=" + } +} diff --git a/distros/kilted/zenoh-cpp-vendor/zenoh-c.patch b/distros/kilted/zenoh-cpp-vendor/zenoh-c.patch new file mode 100644 index 00000000000..a2c5bc1e616 --- /dev/null +++ b/distros/kilted/zenoh-cpp-vendor/zenoh-c.patch @@ -0,0 +1,25 @@ +diff --git a/buildrs/opaque_types_generator.rs b/buildrs/opaque_types_generator.rs +index c1d0bdd3..2d190518 100644 +--- a/buildrs/opaque_types_generator.rs ++++ b/buildrs/opaque_types_generator.rs +@@ -14,7 +14,10 @@ pub fn generate_opaque_types() { + let data_in = std::fs::read_to_string(path_in).unwrap(); + + // Check for cargo-level errors (dependency resolution, manifest parsing, etc.) +- if data_in.contains("error: failed to") || data_in.contains("Caused by:") { ++ if data_in.contains("error: failed to") ++ || data_in.contains("error: no matching package named") ++ || data_in.contains("Caused by:") ++ { + panic!( + "Failed to generate opaque types due to cargo error:\n\nCommand executed:\n\n{command}\n\nCargo output:\n\n{data_in}" + ); +@@ -127,6 +130,8 @@ fn produce_opaque_types_data() -> (String, PathBuf) { + .arg("build") + .args(feature_args) + .args(linker_args) ++ .arg("--config") ++ .arg(std::env::var("NIX_ZENOH_OPAQUE_TYPES_CARGO_CONFIG").unwrap()) + .arg("--target") + .arg(target) + .arg("--manifest-path") diff --git a/distros/rolling/overrides.nix b/distros/rolling/overrides.nix index 312a16e3472..545a16e44b7 100644 --- a/distros/rolling/overrides.nix +++ b/distros/rolling/overrides.nix @@ -233,4 +233,55 @@ in { }) ]; }); + + zenoh-cpp-vendor = (lib.patchAmentVendorGit rosSuper.zenoh-cpp-vendor {}).overrideAttrs(finalAttrs: { + nativeBuildInputs ? [], postPatch ? "", passthru ? {}, ... + }: let + outputHashes = { + "zenoh-1.5.1" = "sha256-EeigSU9l7LCnSkm4/jP0WcdO3Hw9m91zUh8jzVXYhKw="; + }; + zenoh-c-source = finalAttrs.passthru.amentVendorSrcs.zenoh_c_vendor; + in { + postPatch = postPatch + '' + ln -s ${zenoh-c-source}/Cargo.lock Cargo.lock + ''; + nativeBuildInputs = nativeBuildInputs ++ [ + self.rustPlatform.cargoSetupHook + self.rustc + ]; + cargoDeps = self.rustPlatform.importCargoLock { + lockFile = "${zenoh-c-source}/Cargo.lock"; + inherit outputHashes; + }; + + # Patch the build.rs script to be able to build internal + # opaque-types crate without network access. + passthru = lib.recursiveUpdate passthru { + amentVendorSrcs.zenoh_c_vendor = let + src = passthru.amentVendorSrcs.zenoh_c_vendor; + in + self.applyPatches { + inherit src; + name = src.rev; + patches = [ ./zenoh-cpp-vendor/zenoh-c.patch ]; + }; + }; + + # Prepare vendored dependencies for internal opaque-types crate. + # Execute in subshell to not change variables set by the normal + # cargoSetupPostUnpackHook. + preBuild = '' + ( + mkdir nix-zenoh-opaque-types + cd nix-zenoh-opaque-types + cargoDeps=${self.rustPlatform.importCargoLock { + lockFile = "${zenoh-c-source}/build-resources/opaque-types/Cargo.lock"; + inherit outputHashes; + }} + cargoSetupPostUnpackHook + ) + # Export information for use by our patched build.rs script. + export NIX_ZENOH_OPAQUE_TYPES_CARGO_CONFIG=$PWD/nix-zenoh-opaque-types/.cargo/config.toml + ''; + }); } diff --git a/distros/rolling/zenoh-cpp-vendor/vendored-source.json b/distros/rolling/zenoh-cpp-vendor/vendored-source.json new file mode 100644 index 00000000000..1e6f70c645e --- /dev/null +++ b/distros/rolling/zenoh-cpp-vendor/vendored-source.json @@ -0,0 +1,12 @@ +{ + "zenoh_c_vendor": { + "url": "https://github.com/eclipse-zenoh/zenoh-c.git", + "rev": "8f9ce70e4c4b55d150632730fd4c48abffbde765", + "hash": "sha256-kbDIatj4GFhUyDo9yCc6FzPYszHE+Vd79w4r452p77Y=" + }, + "zenoh_cpp_vendor": { + "url": "https://github.com/eclipse-zenoh/zenoh-cpp", + "rev": "05533d20db70ffc1d53a0e07f39caa999e82febd", + "hash": "sha256-lEicWShyKo5NSFyDeMqItZIweY3syXKF629x7woSQ0o=" + } +} diff --git a/distros/rolling/zenoh-cpp-vendor/zenoh-c.patch b/distros/rolling/zenoh-cpp-vendor/zenoh-c.patch new file mode 100644 index 00000000000..a2c5bc1e616 --- /dev/null +++ b/distros/rolling/zenoh-cpp-vendor/zenoh-c.patch @@ -0,0 +1,25 @@ +diff --git a/buildrs/opaque_types_generator.rs b/buildrs/opaque_types_generator.rs +index c1d0bdd3..2d190518 100644 +--- a/buildrs/opaque_types_generator.rs ++++ b/buildrs/opaque_types_generator.rs +@@ -14,7 +14,10 @@ pub fn generate_opaque_types() { + let data_in = std::fs::read_to_string(path_in).unwrap(); + + // Check for cargo-level errors (dependency resolution, manifest parsing, etc.) +- if data_in.contains("error: failed to") || data_in.contains("Caused by:") { ++ if data_in.contains("error: failed to") ++ || data_in.contains("error: no matching package named") ++ || data_in.contains("Caused by:") ++ { + panic!( + "Failed to generate opaque types due to cargo error:\n\nCommand executed:\n\n{command}\n\nCargo output:\n\n{data_in}" + ); +@@ -127,6 +130,8 @@ fn produce_opaque_types_data() -> (String, PathBuf) { + .arg("build") + .args(feature_args) + .args(linker_args) ++ .arg("--config") ++ .arg(std::env::var("NIX_ZENOH_OPAQUE_TYPES_CARGO_CONFIG").unwrap()) + .arg("--target") + .arg(target) + .arg("--manifest-path") diff --git a/lib/default.nix b/lib/default.nix index 3b91a57d0cd..4fae1b1e1a0 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -84,7 +84,7 @@ file ? "CMakeLists.txt", fetchgitArgs ? {}, tarSourceArgs ? {} - }: pkg.overrideAttrs ({ + }: pkg.overrideAttrs (finalAttrs: { cmakeFlags ? [], nativeBuildInputs ? [], passthru ? {}, @@ -102,12 +102,13 @@ ''; sourceInfos = builtins.fromJSON (builtins.readFile vendoredSourceJson); # ament_vendor doesn't allow patches for path inputs, so we have to pack it - # into a tar first. Additionally, vcstool only accepts tarballs with the - # version number as the root directory name. - vendor = sourceInfo: lib.tarSource tarSourceArgs ( - self.fetchgit (sourceInfo // fetchgitArgs // { - name = sourceInfo.rev; - })); + # into a tar first. + vendorTar = src: lib.tarSource tarSourceArgs src; + vendorSrc = sourceInfo: self.fetchgit (sourceInfo // fetchgitArgs // { + # vcstool only accepts tarballs with the version number as the + # root directory name. + name = sourceInfo.rev; + }); in { nativeBuildInputs = [ @@ -118,10 +119,11 @@ # CMake ExternalProject patches are applied with git apply self.git ]; - cmakeFlags = cmakeFlags ++ lib.optionals (pathExists vendoredSourceJson) - ( + cmakeFlags = + cmakeFlags + ++ ( # Tell ament_vendor_wrapper.cmake where to find tarballs with vendored sources - attrValues (mapAttrs (n: v: "-DAMENT_VENDOR_NIX_TAR_${n}=${vendor v}") sourceInfos) + attrValues (mapAttrs (n: v: "-DAMENT_VENDOR_NIX_TAR_${n}=${vendorTar v}") finalAttrs.passthru.amentVendorSrcs) ); postPatch = if pathExists vendoredSourceJson then @@ -131,6 +133,10 @@ exit 1 ''; passthru = passthru // { + # Expose vendored sources for eventual overriding + amentVendorSrcs = lib.optionalAttrs (pathExists vendoredSourceJson) + (mapAttrs (n: v: vendorSrc v) sourceInfos); + # Script to automatically update vendored-source.json by running # CMake with injected modified version of ament_cmake macro. updateAmentVendor = let