2019-12-06 17:18:47 -05:00
|
|
|
{ lib ? rosSelf.lib or self.lib
|
|
|
|
, self ? null
|
|
|
|
, rosSelf ? null }:
|
|
|
|
{
|
2020-08-02 15:05:33 -04:00
|
|
|
mkOverlay = overlays: let
|
2023-08-05 19:55:59 -04:00
|
|
|
s = lib.composeManyExtensions overlays s {};
|
2020-08-02 15:05:33 -04:00
|
|
|
in s;
|
|
|
|
|
2023-08-05 19:50:56 -04:00
|
|
|
# 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,
|
2023-10-02 22:41:43 -04:00
|
|
|
hook ? "",
|
|
|
|
hash ? null
|
2023-11-26 16:18:48 -05:00
|
|
|
}: src: self.runCommand ("${src.name}.tar" + lib.optionalString compress ".gz") ({
|
2023-10-02 22:41:43 -04:00
|
|
|
inherit src;
|
2023-11-26 16:18:48 -05:00
|
|
|
} // lib.optionalAttrs (hash != null) {
|
2023-10-02 22:41:43 -04:00
|
|
|
outputHashMode = "flat";
|
|
|
|
outputHash = hash;
|
2023-11-26 16:18:48 -05:00
|
|
|
}) ''
|
2023-08-05 19:50:56 -04:00
|
|
|
unpackPhase
|
|
|
|
pushd "$sourceRoot"
|
|
|
|
${hook}
|
|
|
|
popd
|
|
|
|
tar --sort=name \
|
|
|
|
--format=gnu \
|
|
|
|
--owner=0 --group=0 --numeric-owner \
|
2023-09-28 22:37:26 -04:00
|
|
|
--mtime="@$SOURCE_DATE_EPOCH" \
|
2023-08-05 19:50:56 -04:00
|
|
|
${lib.optionalString compress "-z"} \
|
|
|
|
-cf "$out" "$sourceRoot"
|
|
|
|
'';
|
|
|
|
|
2019-12-06 17:18:47 -05:00
|
|
|
patchVendorUrl = pkg: {
|
2023-08-05 19:50:56 -04:00
|
|
|
url, hash ? "", sha256 ? "",
|
2019-12-06 17:18:47 -05:00
|
|
|
originalUrl ? url,
|
|
|
|
file ? "CMakeLists.txt"
|
|
|
|
}: pkg.overrideAttrs ({
|
|
|
|
postPatch ? "", ...
|
|
|
|
}: {
|
|
|
|
postPatch = ''
|
2023-08-05 19:55:59 -04:00
|
|
|
substituteInPlace ${lib.escapeShellArg file} \
|
2024-07-21 17:16:34 -04:00
|
|
|
--replace-fail ${lib.escapeShellArg originalUrl} ${lib.escapeShellArg (self.fetchurl { inherit url hash sha256; })}
|
2019-12-06 17:18:47 -05:00
|
|
|
'' + postPatch;
|
|
|
|
});
|
|
|
|
|
2023-09-08 20:45:48 -04:00
|
|
|
patchExternalProjectGit = pkg: {
|
2020-02-04 21:08:38 -05:00
|
|
|
url,
|
2024-07-23 22:22:37 -04:00
|
|
|
rev,
|
|
|
|
originalRev ? rev,
|
2023-08-05 19:50:56 -04:00
|
|
|
originalUrl ? url,
|
2019-12-09 22:39:31 -05:00
|
|
|
file ? "CMakeLists.txt",
|
|
|
|
fetchgitArgs ? {}
|
|
|
|
}: pkg.overrideAttrs ({
|
|
|
|
postPatch ? "", ...
|
|
|
|
}: {
|
2024-07-23 22:22:37 -04:00
|
|
|
postPatch = let
|
|
|
|
script = ''
|
|
|
|
$0 ~ "GIT_REPOSITORY[[:blank:]]+" originalUrl \
|
|
|
|
{ print "URL \"" path "\""; foundUrl=1; next } \
|
|
|
|
{ print }
|
|
|
|
$0 ~ "GIT_TAG[[:blank:]]+" originalRev { print; foundRev=1 }
|
|
|
|
END {
|
|
|
|
if (!foundUrl) print "patchExternalProjectGit: did not find URL: " originalUrl > "/dev/stderr"
|
|
|
|
if (!foundRev) print "patchExternalProjectGit: did not find revision: " originalRev > "/dev/stderr"
|
|
|
|
exit !(foundUrl && foundRev)
|
|
|
|
}
|
|
|
|
'';
|
|
|
|
in ''
|
|
|
|
awk -i inplace \
|
|
|
|
-v originalUrl=${lib.escapeShellArg originalUrl} \
|
|
|
|
-v originalRev=${lib.escapeShellArg originalRev} \
|
|
|
|
-v path=${lib.escapeShellArg (self.fetchgit ({ inherit url rev; } // fetchgitArgs))} \
|
|
|
|
${lib.escapeShellArg script} \
|
2023-08-05 19:55:59 -04:00
|
|
|
${lib.escapeShellArg file}
|
2023-08-05 19:50:56 -04:00
|
|
|
'' + 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}
|
2019-12-09 22:39:31 -05:00
|
|
|
'' + postPatch;
|
|
|
|
});
|
|
|
|
|
2024-07-06 22:48:54 +02:00
|
|
|
# patchAmentVendorGit specialized for gz-*-vendor packages. In
|
|
|
|
# addition to patching ament_vendor() calls, it adds a check to
|
|
|
|
# CMakeLists.txt to detect upstream updates of the vendored package
|
|
|
|
# version.
|
|
|
|
patchGzAmentVendorGit = pkg: {
|
|
|
|
version,
|
|
|
|
hash,
|
|
|
|
tarSourceArgs ? {}
|
|
|
|
}: let
|
|
|
|
stem = lib.strings.removeSuffix "-vendor"
|
|
|
|
(lib.strings.removePrefix "ros-${pkg.rosDistro}-" pkg.pname); # e.g. gz-cmake
|
|
|
|
majorNum = lib.versions.major version;
|
|
|
|
patchedPkg = lib.patchAmentVendorGit pkg {
|
|
|
|
url = "https://github.com/gazebosim/${stem}.git";
|
|
|
|
originalUrl = "https://github.com/gazebosim/\${GITHUB_NAME}.git";
|
|
|
|
rev = "${stem}${majorNum}_${version}"; # e.g. "gz-cmake3_3.5.3"
|
|
|
|
fetchgitArgs.hash = hash;
|
|
|
|
inherit tarSourceArgs;
|
|
|
|
};
|
2024-10-15 21:40:40 -04:00
|
|
|
in patchedPkg.overrideAttrs ({
|
|
|
|
pname, postPatch ? "", ...
|
|
|
|
}: {
|
|
|
|
postPatch = postPatch + ''
|
|
|
|
# Use standard installation paths rather than /opt
|
|
|
|
substituteInPlace CMakeLists.txt \
|
|
|
|
--replace-fail 'opt/''${PROJECT_NAME}/extra_cmake' 'share/extra_cmake'
|
|
|
|
substituteInPlace *-extras.cmake.in \
|
|
|
|
--replace-fail 'opt/@PROJECT_NAME@/extra_cmake' 'share/extra_cmake'
|
|
|
|
|
|
|
|
cat >> CMakeLists.txt <<'EOF'
|
|
|
|
if(NOT ''${LIB_VER} VERSION_EQUAL "${version}")
|
|
|
|
message(FATAL_ERROR "Mismatch in ${pname} version (Nix: ${version}, upstream: ''${LIB_VER}). Fix this in overrides.nix.")
|
|
|
|
endif()
|
|
|
|
EOF
|
|
|
|
'';
|
|
|
|
});
|
2024-07-06 22:48:54 +02:00
|
|
|
|
2022-03-29 12:50:00 -04:00
|
|
|
patchBoostPython = pkg: pkg.overrideAttrs ({
|
|
|
|
postPatch ? "", ...
|
|
|
|
}: {
|
|
|
|
postPatch = let
|
|
|
|
pythonVersion = rosSelf.python.sourceVersion;
|
|
|
|
pythonLib = "python${pythonVersion.major}${pythonVersion.minor}";
|
|
|
|
in ''
|
|
|
|
sed -i CMakeLists.txt \
|
|
|
|
-e '/Boost [^)]*/s/python[^ )]*/${pythonLib}/'
|
|
|
|
'' + postPatch;
|
|
|
|
});
|
|
|
|
|
2019-12-08 12:08:42 -05:00
|
|
|
# Many ROS packages claim to have a dependency on Boost signals when they
|
|
|
|
# really don't or they actually depend on signals2. Boost 1.69 removed
|
|
|
|
# signals causing these packages to fail to build.
|
2019-12-06 17:18:47 -05:00
|
|
|
patchBoostSignals = pkg: pkg.overrideAttrs ({
|
|
|
|
postPatch ? "", ...
|
|
|
|
}: {
|
|
|
|
postPatch = ''
|
|
|
|
sed -i '/find_package(Boost [^)]*/s/signals//g' CMakeLists.txt
|
|
|
|
'' + postPatch;
|
|
|
|
});
|
2020-08-02 15:05:33 -04:00
|
|
|
}
|