2019-05-12 19:35:48 -04:00
|
|
|
{ lib, stdenv, buildPackages, writeText, buildEnv, catkin }:
|
2019-04-06 01:46:54 -04:00
|
|
|
{ paths ? [], ... }@args:
|
2019-03-21 00:23:14 -04:00
|
|
|
|
2019-04-06 02:18:37 -04:00
|
|
|
with lib;
|
|
|
|
|
2019-03-21 00:23:14 -04:00
|
|
|
let
|
2019-04-27 01:29:00 -04:00
|
|
|
propagatePackages = packages: let
|
|
|
|
validPackages = filter (d: d != null) packages;
|
|
|
|
partitionedPackages = partition (d: d.rosPackage or false) validPackages;
|
|
|
|
rosPackages = partitionedPackages.right;
|
|
|
|
otherPackages = partitionedPackages.wrong;
|
|
|
|
rosPropagatedPackages = unique (concatLists (catAttrs "propagatedBuildInputs" rosPackages));
|
|
|
|
recurse = propagatePackages rosPropagatedPackages;
|
|
|
|
in if length validPackages == 0 then {
|
|
|
|
rosPackages = [];
|
|
|
|
otherPackages = [];
|
|
|
|
} else {
|
|
|
|
rosPackages = unique (rosPackages ++ recurse.rosPackages);
|
|
|
|
otherPackages = unique (otherPackages ++ recurse.otherPackages);
|
|
|
|
};
|
|
|
|
|
|
|
|
propagatedPaths = propagatePackages paths;
|
2019-04-06 01:46:54 -04:00
|
|
|
|
2019-04-27 01:29:00 -04:00
|
|
|
env = (buildEnv (args // {
|
2019-04-06 01:46:54 -04:00
|
|
|
name = "ros-env";
|
2019-04-27 01:29:00 -04:00
|
|
|
# Only add ROS packages to environment. The rest are propagated like normal.
|
|
|
|
# ROS packages propagate a huge number of dependencies, which are added all
|
|
|
|
# added to the environment with nix-shell -p, but would not normally not be
|
|
|
|
# added with buildEnv. This file adds all specified ROS packages and their
|
|
|
|
# ROS dependencies to the environment, while propagating other packages like
|
|
|
|
# nix-shell -p does.
|
|
|
|
paths = propagatedPaths.rosPackages;
|
2019-04-06 01:46:54 -04:00
|
|
|
|
2019-03-21 00:23:14 -04:00
|
|
|
passthru.env = stdenv.mkDerivation {
|
|
|
|
name = "interactive-ros-env";
|
2019-04-06 22:17:28 -04:00
|
|
|
|
2019-05-12 19:35:48 -04:00
|
|
|
buildInputs = [ env ];
|
2019-03-21 00:23:14 -04:00
|
|
|
|
|
|
|
buildCommand = ''
|
|
|
|
echo >&2 ""
|
|
|
|
echo >&2 "*** ROS 'env' attributes are intended for interactive nix-shell sessions, not for building! ***"
|
|
|
|
echo >&2 ""
|
|
|
|
exit 1
|
|
|
|
'';
|
|
|
|
};
|
2019-05-12 19:35:48 -04:00
|
|
|
})).overrideAttrs ({ buildCommand, passAsFile ? [], ...}: {
|
2019-04-27 01:29:00 -04:00
|
|
|
# Hack to allow buildEnv to use propagatedBuildInputs
|
|
|
|
buildCommand = null;
|
|
|
|
oldBuildCommand = buildCommand;
|
2019-05-12 19:35:48 -04:00
|
|
|
passAsFile = (if passAsFile == null then [] else passAsFile) ++ [ "oldBuildCommand" ];
|
|
|
|
|
|
|
|
# catkin always needs to be propagated for its
|
|
|
|
propagatedBuildInputs = propagatedPaths.otherPackages;
|
|
|
|
|
2019-04-27 01:29:00 -04:00
|
|
|
buildPhase = ''
|
2019-05-12 19:35:48 -04:00
|
|
|
runHook preBuild
|
2019-04-27 01:29:00 -04:00
|
|
|
. "$oldBuildCommandPath"
|
2019-05-12 19:35:48 -04:00
|
|
|
"${buildPackages.perl}/bin/perl" "${./setup-hook-builder.pl}"
|
|
|
|
runHook postBuild
|
2019-04-27 01:29:00 -04:00
|
|
|
'';
|
|
|
|
phases = [ "buildPhase" "fixupPhase" ];
|
2019-04-06 01:46:54 -04:00
|
|
|
});
|
2019-03-21 00:23:14 -04:00
|
|
|
in env
|