rolling: rviz-ogre-vendor: correctly patch vendor URLs

This package requires complex patching. It uses ament_vendor(), which is picky
about what kinds of sources it requires. Additionally, ogre contains its own
vendoring of imgui that needs to be patched.
This commit is contained in:
Ben Wolsieffer 2023-08-05 19:50:56 -04:00
parent d5f6bfe409
commit 5f9268646a
3 changed files with 72 additions and 17 deletions

View file

@ -7,30 +7,79 @@ with lib;
s = composeManyExtensions overlays s {};
in s;
# Create a tarball of a package source. If the source is already an archive,
# it will be unpacked and repacked as a tarball.
tarSource = {
compress ? false,
hook ? ""
}: src: self.runCommand ("${src.name}.tar" + lib.optionalString compress ".gz") { inherit src; } ''
unpackPhase
pushd "$sourceRoot"
${hook}
popd
tar --sort=name \
--format=gnu \
--owner=0 --group=0 --numeric-owner \
${lib.optionalString compress "-z"} \
-cf "$out" "$sourceRoot"
'';
patchVendorUrl = pkg: {
url, sha256,
url, hash ? "", sha256 ? "",
originalUrl ? url,
file ? "CMakeLists.txt"
}: pkg.overrideAttrs ({
postPatch ? "", ...
}: {
postPatch = ''
substituteInPlace '${file}' \
--replace '${originalUrl}' '${self.fetchurl { inherit url sha256; }}'
substituteInPlace ${escapeShellArg file} \
--replace ${escapeShellArg originalUrl} ${escapeShellArg (self.fetchurl { inherit url hash sha256; })}
'' + postPatch;
});
patchVendorGit = pkg: {
url,
originalUrl ? url,
file ? "CMakeLists.txt",
fetchgitArgs ? {}
}: pkg.overrideAttrs ({
postPatch ? "", ...
}: {
postPatch = ''
sed -i '\|GIT_REPOSITORY\s.*${escapeShellArg url}|c\
sed -i '\|GIT_REPOSITORY\s.*${originalUrl}|c\
URL "${self.fetchgit ({ inherit url; } // fetchgitArgs)}"' \
'${file}'
${escapeShellArg file}
'' + postPatch;
});
# Patch a vendored download that uses ament_vendor() with a Git repo as the
# source.
patchAmentVendorGit = pkg: {
url,
originalUrl ? url,
rev, # Must correspond to the VCS_VERSION argument
file ? "CMakeLists.txt",
fetchgitArgs ? {},
tarSourceArgs ? {}
}: pkg.overrideAttrs ({
nativeBuildInputs ? [],
postPatch ? "", ...
}: let
# 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 = lib.tarSource tarSourceArgs (self.fetchgit (fetchgitArgs // {
name = rev;
inherit url rev;
}));
in {
# CMake ExternalProject patches are applied with git apply
nativeBuildInputs = nativeBuildInputs ++ [ self.git ];
postPatch = ''
sed -i '\|VCS_URL\s*${originalUrl}|c\
VCS_URL "file://${vendor}"\
VCS_TYPE tar' \
${lib.escapeShellArg file}
'' + postPatch;
});