99 lines
2.7 KiB
Nix
99 lines
2.7 KiB
Nix
{
|
|||
runCommand,
|
|||
buildEnv,
|
|||
makeWrapper,
|
|||
lib,
|
|||
python311,
|
|||
writeShellScript,
|
|||
}:
|
|||
let
|
|||
wrapPathsStr =
|
|||
flag: values:
|
|||
builtins.concatStringsSep " " (
|
|||
builtins.concatMap (p: [
|
|||
"--add-flags"
|
|||
flag
|
|||
"--add-flags"
|
|||
p
|
|||
]) values
|
|||
);
|
|||
|
|||
wrapCfgStr =
|
|||
typ: val:
|
|||
let
|
|||
installer = writeShellScript "insteller-${typ}" ''
|
|||
dst="$HOME/.config/FreeCAD/${typ}.cfg"
|
|||
if [ ! -f "$dst" ]; then
|
|||
mkdir -p "$(dirname "$dst")"
|
|||
cp --no-preserve=mode,ownership '${val}' "$dst"
|
|||
fi
|
|||
'';
|
|||
in
|
|||
lib.optionalString (val != null) "--run ${installer}";
|
|||
|
|||
pythonsProcessed = builtins.map (
|
|||
pyt:
|
|||
if builtins.isString pyt then
|
|||
pyt
|
|||
else if builtins.isFunction pyt then
|
|||
"${(python311.withPackages pyt)}/lib/python3.11/site-packages"
|
|||
else
|
|||
throw "Expected string or function as python paths for freecad"
|
|||
);
|
|||
|
|||
makeCustomizable =
|
|||
freecad:
|
|||
freecad
|
|||
// {
|
|||
customize =
|
|||
{
|
|||
name ? freecad.name,
|
|||
modules ? [ ],
|
|||
pythons ? [ ],
|
|||
makeWrapperFlags ? [ ],
|
|||
userCfg ? null,
|
|||
systemCfg ? null,
|
|||
}:
|
|||
let
|
|||
modulesStr = wrapPathsStr "--module-path" modules;
|
|||
pythonsStr = wrapPathsStr "--python-path" (pythonsProcessed pythons);
|
|||
makeWrapperFlagsStr = builtins.concatStringsSep " " (builtins.map (f: "'${f}'") makeWrapperFlags);
|
|||
|
|||
userCfgStr = wrapCfgStr "user" userCfg;
|
|||
systemCfgStr = wrapCfgStr "system" systemCfg;
|
|||
|
|||
bin = runCommand "${name}-bin" { nativeBuildInputs = [ makeWrapper ]; } ''
|
|||
mkdir -p "$out/bin"
|
|||
for exe in FreeCAD{,Cmd}; do
|
|||
if [[ ! -e ${freecad}/bin/$exe ]]; then
|
|||
echo "No binary $exe in freecad package"
|
|||
false
|
|||
fi
|
|||
dest="$out/bin/$exe";
|
|||
makeWrapper "${freecad}/bin/$exe" "$dest" \
|
|||
--inherit-argv0 \
|
|||
${modulesStr} \
|
|||
${pythonsStr} \
|
|||
${userCfgStr} \
|
|||
${systemCfgStr} \
|
|||
${makeWrapperFlagsStr}
|
|||
done
|
|||
ln -s FreeCAD $out/bin/freecad
|
|||
ln -s FreeCADCmd $out/bin/freecadcmd
|
|||
'';
|
|||
in
|
|||
makeCustomizable (buildEnv {
|
|||
inherit name;
|
|||
paths = [
|
|||
(lib.lowPrio freecad)
|
|||
bin
|
|||
];
|
|||
});
|
|||
override = f: makeCustomizable (freecad.override f);
|
|||
overrideAttrs = f: makeCustomizable (freecad.overrideAttrs f);
|
|||
};
|
|||
in
|
|||
{
|
|||
inherit makeCustomizable;
|
|||
}
|