Revert "writers: add support for wrapping"
This commit is contained in:
parent
0d58a849c9
commit
ea4b95755d
2 changed files with 148 additions and 432 deletions
|
@ -1,14 +1,4 @@
|
|||
{
|
||||
buildPackages,
|
||||
gixy,
|
||||
lib,
|
||||
libiconv,
|
||||
makeBinaryWrapper,
|
||||
mkNugetDeps,
|
||||
mkNugetSource,
|
||||
pkgs,
|
||||
stdenv,
|
||||
}:
|
||||
{ pkgs, buildPackages, lib, stdenv, libiconv, mkNugetDeps, mkNugetSource, gixy }:
|
||||
let
|
||||
inherit (lib)
|
||||
concatMapStringsSep
|
||||
|
@ -16,6 +6,7 @@ let
|
|||
escapeShellArg
|
||||
last
|
||||
optionalString
|
||||
stringLength
|
||||
strings
|
||||
types
|
||||
;
|
||||
|
@ -27,285 +18,137 @@ rec {
|
|||
# Examples:
|
||||
# writeBash = makeScriptWriter { interpreter = "${pkgs.bash}/bin/bash"; }
|
||||
# makeScriptWriter { interpreter = "${pkgs.dash}/bin/dash"; } "hello" "echo hello world"
|
||||
makeScriptWriter = { interpreter, check ? "", makeWrapperArgs ? [], }: nameOrPath: content:
|
||||
makeScriptWriter = { interpreter, check ? "" }: nameOrPath: content:
|
||||
assert lib.or (types.path.check nameOrPath) (builtins.match "([0-9A-Za-z._])[0-9A-Za-z._-]*" nameOrPath != null);
|
||||
assert lib.or (types.path.check content) (types.str.check content);
|
||||
let
|
||||
nameIsPath = types.path.check nameOrPath;
|
||||
name = last (builtins.split "/" nameOrPath);
|
||||
path = if nameIsPath then nameOrPath else "/bin/${name}";
|
||||
# The inner derivation which creates the executable under $out/bin (never at $out directly)
|
||||
# This is required in order to support wrapping, as wrapped programs consist of at least two files: the executable and the wrapper.
|
||||
inner =
|
||||
pkgs.runCommandLocal name (
|
||||
{
|
||||
inherit makeWrapperArgs;
|
||||
nativeBuildInputs = [
|
||||
makeBinaryWrapper
|
||||
];
|
||||
meta.mainProgram = name;
|
||||
}
|
||||
// (
|
||||
if (types.str.check content) then {
|
||||
inherit content interpreter;
|
||||
passAsFile = [ "content" ];
|
||||
} else {
|
||||
inherit interpreter;
|
||||
contentPath = content;
|
||||
}
|
||||
)
|
||||
)
|
||||
''
|
||||
# On darwin a script cannot be used as an interpreter in a shebang but
|
||||
# there doesn't seem to be a limit to the size of shebang and multiple
|
||||
# arguments to the interpreter are allowed.
|
||||
if [[ -n "${toString pkgs.stdenvNoCC.isDarwin}" ]] && isScript $interpreter
|
||||
then
|
||||
wrapperInterpreterLine=$(head -1 "$interpreter" | tail -c+3)
|
||||
# Get first word from the line (note: xargs echo remove leading spaces)
|
||||
wrapperInterpreter=$(echo "$wrapperInterpreterLine" | xargs echo | cut -d " " -f1)
|
||||
in
|
||||
|
||||
if isScript $wrapperInterpreter
|
||||
then
|
||||
echo "error: passed interpreter ($interpreter) is a script which has another script ($wrapperInterpreter) as an interpreter, which is not supported."
|
||||
exit 1
|
||||
fi
|
||||
pkgs.runCommandLocal name (
|
||||
lib.optionalAttrs (nameOrPath == "/bin/${name}") {
|
||||
meta.mainProgram = name;
|
||||
}
|
||||
// (
|
||||
if (types.str.check content) then {
|
||||
inherit content interpreter;
|
||||
passAsFile = [ "content" ];
|
||||
} else {
|
||||
inherit interpreter;
|
||||
contentPath = content;
|
||||
}
|
||||
)
|
||||
)
|
||||
''
|
||||
# On darwin a script cannot be used as an interpreter in a shebang but
|
||||
# there doesn't seem to be a limit to the size of shebang and multiple
|
||||
# arguments to the interpreter are allowed.
|
||||
if [[ -n "${toString pkgs.stdenvNoCC.isDarwin}" ]] && isScript $interpreter
|
||||
then
|
||||
wrapperInterpreterLine=$(head -1 "$interpreter" | tail -c+3)
|
||||
# Get first word from the line (note: xargs echo remove leading spaces)
|
||||
wrapperInterpreter=$(echo "$wrapperInterpreterLine" | xargs echo | cut -d " " -f1)
|
||||
|
||||
# This should work as long as wrapperInterpreter is a shell, which is
|
||||
# the case for programs wrapped with makeWrapper, like
|
||||
# python3.withPackages etc.
|
||||
interpreterLine="$wrapperInterpreterLine $interpreter"
|
||||
else
|
||||
interpreterLine=$interpreter
|
||||
fi
|
||||
if isScript $wrapperInterpreter
|
||||
then
|
||||
echo "error: passed interpreter ($interpreter) is a script which has another script ($wrapperInterpreter) as an interpreter, which is not supported."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "#! $interpreterLine" > $out
|
||||
cat "$contentPath" >> $out
|
||||
${optionalString (check != "") ''
|
||||
${check} $out
|
||||
''}
|
||||
chmod +x $out
|
||||
|
||||
# Relocate executable
|
||||
# Wrap it if makeWrapperArgs are specified
|
||||
mv $out tmp
|
||||
mkdir -p $out/$(dirname "${path}")
|
||||
mv tmp $out/${path}
|
||||
if [ -n "''${makeWrapperArgs+''${makeWrapperArgs[@]}}" ]; then
|
||||
wrapProgram $out/${path} ''${makeWrapperArgs[@]}
|
||||
fi
|
||||
'';
|
||||
in
|
||||
if nameIsPath
|
||||
then inner
|
||||
# In case nameOrPath is a name, the user intends the executable to be located at $out.
|
||||
# This is achieved by creating a separate derivation containing a symlink at $out linking to ${inner}/bin/${name}.
|
||||
# This breaks the override pattern.
|
||||
# In case this turns out to be a problem, we can still add more magic
|
||||
else pkgs.runCommandLocal name {} ''
|
||||
ln -s ${inner}/bin/${name} $out
|
||||
'';
|
||||
# This should work as long as wrapperInterpreter is a shell, which is
|
||||
# the case for programs wrapped with makeWrapper, like
|
||||
# python3.withPackages etc.
|
||||
interpreterLine="$wrapperInterpreterLine $interpreter"
|
||||
else
|
||||
interpreterLine=$interpreter
|
||||
fi
|
||||
|
||||
echo "#! $interpreterLine" > $out
|
||||
cat "$contentPath" >> $out
|
||||
${optionalString (check != "") ''
|
||||
${check} $out
|
||||
''}
|
||||
chmod +x $out
|
||||
${optionalString (types.path.check nameOrPath) ''
|
||||
mv $out tmp
|
||||
mkdir -p $out/$(dirname "${nameOrPath}")
|
||||
mv tmp $out/${nameOrPath}
|
||||
''}
|
||||
'';
|
||||
|
||||
# Base implementation for compiled executables.
|
||||
# Takes a compile script, which in turn takes the name as an argument.
|
||||
#
|
||||
# Examples:
|
||||
# writeSimpleC = makeBinWriter { compileScript = name: "gcc -o $out $contentPath"; }
|
||||
makeBinWriter = { compileScript, strip ? true, makeWrapperArgs ? [] }: nameOrPath: content:
|
||||
makeBinWriter = { compileScript, strip ? true }: nameOrPath: content:
|
||||
assert lib.or (types.path.check nameOrPath) (builtins.match "([0-9A-Za-z._])[0-9A-Za-z._-]*" nameOrPath != null);
|
||||
assert lib.or (types.path.check content) (types.str.check content);
|
||||
let
|
||||
nameIsPath = types.path.check nameOrPath;
|
||||
name = last (builtins.split "/" nameOrPath);
|
||||
path = if nameIsPath then nameOrPath else "/bin/${name}";
|
||||
# The inner derivation which creates the executable under $out/bin (never at $out directly)
|
||||
# This is required in order to support wrapping, as wrapped programs consist of at least two files: the executable and the wrapper.
|
||||
inner =
|
||||
pkgs.runCommandLocal name (
|
||||
{
|
||||
inherit makeWrapperArgs;
|
||||
nativeBuildInputs = [
|
||||
makeBinaryWrapper
|
||||
];
|
||||
meta.mainProgram = name;
|
||||
}
|
||||
// (
|
||||
if (types.str.check content) then {
|
||||
inherit content;
|
||||
passAsFile = [ "content" ];
|
||||
} else {
|
||||
contentPath = content;
|
||||
}
|
||||
)
|
||||
)
|
||||
''
|
||||
${compileScript}
|
||||
${lib.optionalString strip
|
||||
"${lib.getBin buildPackages.bintools-unwrapped}/bin/${buildPackages.bintools-unwrapped.targetPrefix}strip -S $out"}
|
||||
# Sometimes binaries produced for darwin (e. g. by GHC) won't be valid
|
||||
# mach-o executables from the get-go, but need to be corrected somehow
|
||||
# which is done by fixupPhase.
|
||||
${lib.optionalString pkgs.stdenvNoCC.hostPlatform.isDarwin "fixupPhase"}
|
||||
mv $out tmp
|
||||
mkdir -p $out/$(dirname "${path}")
|
||||
mv tmp $out/${path}
|
||||
if [ -n "''${makeWrapperArgs+''${makeWrapperArgs[@]}}" ]; then
|
||||
wrapProgram $out/${path} ''${makeWrapperArgs[@]}
|
||||
fi
|
||||
'';
|
||||
in
|
||||
if nameIsPath
|
||||
then inner
|
||||
# In case nameOrPath is a name, the user intends the executable to be located at $out.
|
||||
# This is achieved by creating a separate derivation containing a symlink at $out linking to ${inner}/bin/${name}.
|
||||
# This breaks the override pattern.
|
||||
# In case this turns out to be a problem, we can still add more magic
|
||||
else pkgs.runCommandLocal name {} ''
|
||||
ln -s ${inner}/bin/${name} $out
|
||||
'';
|
||||
pkgs.runCommand name ((if (types.str.check content) then {
|
||||
inherit content;
|
||||
passAsFile = [ "content" ];
|
||||
} else {
|
||||
contentPath = content;
|
||||
}) // lib.optionalAttrs (nameOrPath == "/bin/${name}") {
|
||||
meta.mainProgram = name;
|
||||
}) ''
|
||||
${compileScript}
|
||||
${lib.optionalString strip
|
||||
"${lib.getBin buildPackages.bintools-unwrapped}/bin/${buildPackages.bintools-unwrapped.targetPrefix}strip -S $out"}
|
||||
# Sometimes binaries produced for darwin (e. g. by GHC) won't be valid
|
||||
# mach-o executables from the get-go, but need to be corrected somehow
|
||||
# which is done by fixupPhase.
|
||||
${lib.optionalString pkgs.stdenvNoCC.hostPlatform.isDarwin "fixupPhase"}
|
||||
${optionalString (types.path.check nameOrPath) ''
|
||||
mv $out tmp
|
||||
mkdir -p $out/$(dirname "${nameOrPath}")
|
||||
mv tmp $out/${nameOrPath}
|
||||
''}
|
||||
'';
|
||||
|
||||
# Like writeScript but the first line is a shebang to bash
|
||||
#
|
||||
# Can be called with or without extra arguments.
|
||||
#
|
||||
# Example without arguments:
|
||||
# Example:
|
||||
# writeBash "example" ''
|
||||
# echo hello world
|
||||
# ''
|
||||
#
|
||||
# Example with arguments:
|
||||
# writeBash "example"
|
||||
# {
|
||||
# makeWrapperArgs = [
|
||||
# "--prefix" "PATH" ":" "${pkgs.hello}/bin"
|
||||
# ];
|
||||
# }
|
||||
# ''
|
||||
# hello
|
||||
# ''
|
||||
writeBash = name: argsOrScript:
|
||||
if lib.isAttrs argsOrScript && ! lib.isDerivation argsOrScript
|
||||
then makeScriptWriter (argsOrScript // { interpreter = "${lib.getExe pkgs.bash}"; }) name
|
||||
else makeScriptWriter { interpreter = "${lib.getExe pkgs.bash}"; } name argsOrScript;
|
||||
writeBash = makeScriptWriter {
|
||||
interpreter = "${lib.getExe pkgs.bash}";
|
||||
};
|
||||
|
||||
# Like writeScriptBin but the first line is a shebang to bash
|
||||
#
|
||||
# Can be called with or without extra arguments.
|
||||
#
|
||||
# Example without arguments:
|
||||
# writeBashBin "example" ''
|
||||
# echo hello world
|
||||
# ''
|
||||
#
|
||||
# Example with arguments:
|
||||
# writeBashBin "example"
|
||||
# {
|
||||
# makeWrapperArgs = [
|
||||
# "--prefix", "PATH", ":", "${pkgs.hello}/bin",
|
||||
# ];
|
||||
# }
|
||||
# ''
|
||||
# hello
|
||||
# ''
|
||||
writeBashBin = name:
|
||||
writeBash "/bin/${name}";
|
||||
|
||||
# Like writeScript but the first line is a shebang to dash
|
||||
#
|
||||
# Can be called with or without extra arguments.
|
||||
#
|
||||
# Example without arguments:
|
||||
# Example:
|
||||
# writeDash "example" ''
|
||||
# echo hello world
|
||||
# ''
|
||||
#
|
||||
# Example with arguments:
|
||||
# writeDash "example"
|
||||
# {
|
||||
# makeWrapperArgs = [
|
||||
# "--prefix", "PATH", ":", "${pkgs.hello}/bin",
|
||||
# ];
|
||||
# }
|
||||
# ''
|
||||
# hello
|
||||
# ''
|
||||
writeDash = name: argsOrScript:
|
||||
if lib.isAttrs argsOrScript && ! lib.isDerivation argsOrScript
|
||||
then makeScriptWriter (argsOrScript // { interpreter = "${lib.getExe pkgs.dash}"; }) name
|
||||
else makeScriptWriter { interpreter = "${lib.getExe pkgs.dash}"; } name argsOrScript;
|
||||
writeDash = makeScriptWriter {
|
||||
interpreter = "${lib.getExe pkgs.dash}";
|
||||
};
|
||||
|
||||
# Like writeScriptBin but the first line is a shebang to dash
|
||||
#
|
||||
# Can be called with or without extra arguments.
|
||||
#
|
||||
# Example without arguments:
|
||||
# writeDashBin "example" ''
|
||||
# echo hello world
|
||||
# ''
|
||||
#
|
||||
# Example with arguments:
|
||||
# writeDashBin "example"
|
||||
# {
|
||||
# makeWrapperArgs = [
|
||||
# "--prefix", "PATH", ":", "${pkgs.hello}/bin",
|
||||
# ];
|
||||
# }
|
||||
# ''
|
||||
# hello
|
||||
# ''
|
||||
writeDashBin = name:
|
||||
writeDash "/bin/${name}";
|
||||
|
||||
# Like writeScript but the first line is a shebang to fish
|
||||
#
|
||||
# Can be called with or without extra arguments.
|
||||
#
|
||||
# Example without arguments:
|
||||
# Example:
|
||||
# writeFish "example" ''
|
||||
# echo hello world
|
||||
# ''
|
||||
#
|
||||
# Example with arguments:
|
||||
# writeFish "example"
|
||||
# {
|
||||
# makeWrapperArgs = [
|
||||
# "--prefix", "PATH", ":", "${pkgs.hello}/bin",
|
||||
# ];
|
||||
# }
|
||||
# ''
|
||||
# hello
|
||||
# ''
|
||||
writeFish = name: argsOrScript:
|
||||
if lib.isAttrs argsOrScript && ! lib.isDerivation argsOrScript
|
||||
then makeScriptWriter (argsOrScript // {
|
||||
interpreter = "${lib.getExe pkgs.fish} --no-config";
|
||||
check = "${lib.getExe pkgs.fish} --no-config --no-execute"; # syntax check only
|
||||
}) name
|
||||
else makeScriptWriter {
|
||||
interpreter = "${lib.getExe pkgs.fish} --no-config";
|
||||
check = "${lib.getExe pkgs.fish} --no-config --no-execute"; # syntax check only
|
||||
} name argsOrScript;
|
||||
writeFish = makeScriptWriter {
|
||||
interpreter = "${lib.getExe pkgs.fish} --no-config";
|
||||
check = "${lib.getExe pkgs.fish} --no-config --no-execute"; # syntax check only
|
||||
};
|
||||
|
||||
# Like writeScriptBin but the first line is a shebang to fish
|
||||
#
|
||||
# Can be called with or without extra arguments.
|
||||
#
|
||||
# Example without arguments:
|
||||
# writeFishBin "example" ''
|
||||
# echo hello world
|
||||
# ''
|
||||
#
|
||||
# Example with arguments:
|
||||
# writeFishBin "example"
|
||||
# {
|
||||
# makeWrapperArgs = [
|
||||
# "--prefix", "PATH", ":", "${pkgs.hello}/bin",
|
||||
# ];
|
||||
# }
|
||||
# ''
|
||||
# hello
|
||||
# ''
|
||||
writeFishBin = name:
|
||||
writeFish "/bin/${name}";
|
||||
|
||||
|
@ -319,12 +162,11 @@ rec {
|
|||
# main = launchMissiles
|
||||
# '';
|
||||
writeHaskell = name: {
|
||||
libraries ? [],
|
||||
ghc ? pkgs.ghc,
|
||||
ghcArgs ? [],
|
||||
libraries ? [],
|
||||
makeWrapperArgs ? [],
|
||||
strip ? true,
|
||||
threadedRuntime ? true,
|
||||
strip ? true
|
||||
}:
|
||||
let
|
||||
appendIfNotSet = el: list: if elem el list then list else list ++ [ el ];
|
||||
|
@ -336,7 +178,7 @@ rec {
|
|||
${(ghc.withPackages (_: libraries ))}/bin/ghc ${lib.escapeShellArgs ghcArgs'} tmp.hs
|
||||
mv tmp $out
|
||||
'';
|
||||
inherit makeWrapperArgs strip;
|
||||
inherit strip;
|
||||
} name;
|
||||
|
||||
# writeHaskellBin takes the same arguments as writeHaskell but outputs a directory (like writeScriptBin)
|
||||
|
@ -345,72 +187,36 @@ rec {
|
|||
|
||||
# Like writeScript but the first line is a shebang to nu
|
||||
#
|
||||
# Can be called with or without extra arguments.
|
||||
#
|
||||
# Example without arguments:
|
||||
# Example:
|
||||
# writeNu "example" ''
|
||||
# echo hello world
|
||||
# ''
|
||||
#
|
||||
# Example with arguments:
|
||||
# writeNu "example"
|
||||
# {
|
||||
# makeWrapperArgs = [
|
||||
# "--prefix", "PATH", ":", "${pkgs.hello}/bin",
|
||||
# ];
|
||||
# }
|
||||
# ''
|
||||
# hello
|
||||
# ''
|
||||
writeNu = name: argsOrScript:
|
||||
if lib.isAttrs argsOrScript && ! lib.isDerivation argsOrScript
|
||||
then makeScriptWriter (argsOrScript // { interpreter = "${lib.getExe pkgs.nushell} --no-config-file"; }) name
|
||||
else makeScriptWriter { interpreter = "${lib.getExe pkgs.nushell} --no-config-file"; } name argsOrScript;
|
||||
|
||||
writeNu = makeScriptWriter {
|
||||
interpreter = "${lib.getExe pkgs.nushell} --no-config-file";
|
||||
};
|
||||
|
||||
# Like writeScriptBin but the first line is a shebang to nu
|
||||
#
|
||||
# Can be called with or without extra arguments.
|
||||
#
|
||||
# Example without arguments:
|
||||
# writeNuBin "example" ''
|
||||
# echo hello world
|
||||
# ''
|
||||
#
|
||||
# Example with arguments:
|
||||
# writeNuBin "example"
|
||||
# {
|
||||
# makeWrapperArgs = [
|
||||
# "--prefix", "PATH", ":", "${pkgs.hello}/bin",
|
||||
# ];
|
||||
# }
|
||||
# ''
|
||||
# hello
|
||||
# ''
|
||||
writeNuBin = name:
|
||||
writeNu "/bin/${name}";
|
||||
|
||||
# makeRubyWriter takes ruby and compatible rubyPackages and produces ruby script writer,
|
||||
# If any libraries are specified, ruby.withPackages is used as interpreter, otherwise the "bare" ruby is used.
|
||||
makeRubyWriter = ruby: rubyPackages: buildRubyPackages: name: { libraries ? [], ... } @ args:
|
||||
makeScriptWriter (
|
||||
(builtins.removeAttrs args ["libraries"])
|
||||
// {
|
||||
interpreter =
|
||||
if libraries == []
|
||||
then "${ruby}/bin/ruby"
|
||||
else "${(ruby.withPackages (ps: libraries))}/bin/ruby";
|
||||
# Rubocop doesn't seem to like running in this fashion.
|
||||
#check = (writeDash "rubocop.sh" ''
|
||||
# exec ${lib.getExe buildRubyPackages.rubocop} "$1"
|
||||
#'');
|
||||
}
|
||||
) name;
|
||||
makeRubyWriter = ruby: rubyPackages: buildRubyPackages: name: { libraries ? [], }:
|
||||
makeScriptWriter {
|
||||
interpreter =
|
||||
if libraries == []
|
||||
then "${ruby}/bin/ruby"
|
||||
else "${(ruby.withPackages (ps: libraries))}/bin/ruby";
|
||||
# Rubocop doesnt seem to like running in this fashion.
|
||||
#check = (writeDash "rubocop.sh" ''
|
||||
# exec ${lib.getExe buildRubyPackages.rubocop} "$1"
|
||||
#'');
|
||||
} name;
|
||||
|
||||
# Like writeScript but the first line is a shebang to ruby
|
||||
#
|
||||
# Example:
|
||||
# writeRuby "example" { libraries = [ pkgs.rubyPackages.git ]; } ''
|
||||
# writeRuby "example" ''
|
||||
# puts "hello world"
|
||||
# ''
|
||||
writeRuby = makeRubyWriter pkgs.ruby pkgs.rubyPackages buildPackages.rubyPackages;
|
||||
|
@ -421,20 +227,17 @@ rec {
|
|||
# makeLuaWriter takes lua and compatible luaPackages and produces lua script writer,
|
||||
# which validates the script with luacheck at build time. If any libraries are specified,
|
||||
# lua.withPackages is used as interpreter, otherwise the "bare" lua is used.
|
||||
makeLuaWriter = lua: luaPackages: buildLuaPackages: name: { libraries ? [], ... } @ args:
|
||||
makeScriptWriter (
|
||||
(builtins.removeAttrs args ["libraries"])
|
||||
// {
|
||||
interpreter = lua.interpreter;
|
||||
# if libraries == []
|
||||
# then lua.interpreter
|
||||
# else (lua.withPackages (ps: libraries)).interpreter
|
||||
# This should support packages! I just cant figure out why some dependency collision happens whenever I try to run this.
|
||||
check = (writeDash "luacheck.sh" ''
|
||||
exec ${buildLuaPackages.luacheck}/bin/luacheck "$1"
|
||||
'');
|
||||
}
|
||||
) name;
|
||||
makeLuaWriter = lua: luaPackages: buildLuaPackages: name: { libraries ? [], }:
|
||||
makeScriptWriter {
|
||||
interpreter = lua.interpreter;
|
||||
# if libraries == []
|
||||
# then lua.interpreter
|
||||
# else (lua.withPackages (ps: libraries)).interpreter
|
||||
# This should support packages! I just cant figure out why some dependency collision happens whenever I try to run this.
|
||||
check = (writeDash "luacheck.sh" ''
|
||||
exec ${buildLuaPackages.luacheck}/bin/luacheck "$1"
|
||||
'');
|
||||
} name;
|
||||
|
||||
# writeLua takes a name an attributeset with libraries and some lua source code and
|
||||
# returns an executable (should also work with luajit)
|
||||
|
@ -462,10 +265,9 @@ rec {
|
|||
writeLua "/bin/${name}";
|
||||
|
||||
writeRust = name: {
|
||||
makeWrapperArgs ? [],
|
||||
rustc ? pkgs.rustc,
|
||||
rustcArgs ? [],
|
||||
strip ? true,
|
||||
rustc ? pkgs.rustc,
|
||||
rustcArgs ? [],
|
||||
strip ? true
|
||||
}:
|
||||
let
|
||||
darwinArgs = lib.optionals stdenv.isDarwin [ "-L${lib.getLib libiconv}/lib" ];
|
||||
|
@ -475,7 +277,7 @@ rec {
|
|||
cp "$contentPath" tmp.rs
|
||||
PATH=${lib.makeBinPath [pkgs.gcc]} ${rustc}/bin/rustc ${lib.escapeShellArgs rustcArgs} ${lib.escapeShellArgs darwinArgs} -o "$out" tmp.rs
|
||||
'';
|
||||
inherit makeWrapperArgs strip;
|
||||
inherit strip;
|
||||
} name;
|
||||
|
||||
writeRustBin = name:
|
||||
|
@ -535,13 +337,10 @@ rec {
|
|||
# use boolean;
|
||||
# print "Howdy!\n" if true;
|
||||
# ''
|
||||
writePerl = name: { libraries ? [], ... } @ args:
|
||||
makeScriptWriter (
|
||||
(builtins.removeAttrs args ["libraries"])
|
||||
// {
|
||||
interpreter = "${lib.getExe (pkgs.perl.withPackages (p: libraries))}";
|
||||
}
|
||||
) name;
|
||||
writePerl = name: { libraries ? [] }:
|
||||
makeScriptWriter {
|
||||
interpreter = "${lib.getExe (pkgs.perl.withPackages (p: libraries))}";
|
||||
} name;
|
||||
|
||||
# writePerlBin takes the same arguments as writePerl but outputs a directory (like writeScriptBin)
|
||||
writePerlBin = name:
|
||||
|
@ -550,27 +349,22 @@ rec {
|
|||
# makePythonWriter takes python and compatible pythonPackages and produces python script writer,
|
||||
# which validates the script with flake8 at build time. If any libraries are specified,
|
||||
# python.withPackages is used as interpreter, otherwise the "bare" python is used.
|
||||
makePythonWriter = python: pythonPackages: buildPythonPackages: name: { libraries ? [], flakeIgnore ? [], ... } @ args:
|
||||
makePythonWriter = python: pythonPackages: buildPythonPackages: name: { libraries ? [], flakeIgnore ? [] }:
|
||||
let
|
||||
ignoreAttribute = optionalString (flakeIgnore != []) "--ignore ${concatMapStringsSep "," escapeShellArg flakeIgnore}";
|
||||
in
|
||||
makeScriptWriter
|
||||
(
|
||||
(builtins.removeAttrs args ["libraries" "flakeIgnore"])
|
||||
// {
|
||||
interpreter =
|
||||
if pythonPackages != pkgs.pypy2Packages || pythonPackages != pkgs.pypy3Packages then
|
||||
if libraries == []
|
||||
then python.interpreter
|
||||
else (python.withPackages (ps: libraries)).interpreter
|
||||
else python.interpreter
|
||||
;
|
||||
check = optionalString python.isPy3k (writeDash "pythoncheck.sh" ''
|
||||
exec ${buildPythonPackages.flake8}/bin/flake8 --show-source ${ignoreAttribute} "$1"
|
||||
'');
|
||||
}
|
||||
)
|
||||
name;
|
||||
makeScriptWriter {
|
||||
interpreter =
|
||||
if pythonPackages != pkgs.pypy2Packages || pythonPackages != pkgs.pypy3Packages then
|
||||
if libraries == []
|
||||
then python.interpreter
|
||||
else (python.withPackages (ps: libraries)).interpreter
|
||||
else python.interpreter
|
||||
;
|
||||
check = optionalString python.isPy3k (writeDash "pythoncheck.sh" ''
|
||||
exec ${buildPythonPackages.flake8}/bin/flake8 --show-source ${ignoreAttribute} "$1"
|
||||
'');
|
||||
} name;
|
||||
|
||||
# writePyPy2 takes a name an attributeset with libraries and some pypy2 sourcecode and
|
||||
# returns an executable
|
||||
|
@ -627,7 +421,7 @@ rec {
|
|||
writePyPy3 "/bin/${name}";
|
||||
|
||||
|
||||
makeFSharpWriter = { dotnet-sdk ? pkgs.dotnet-sdk, fsi-flags ? "", libraries ? _: [], ... } @ args: nameOrPath:
|
||||
makeFSharpWriter = { dotnet-sdk ? pkgs.dotnet-sdk, fsi-flags ? "", libraries ? _: [] }: nameOrPath:
|
||||
let
|
||||
fname = last (builtins.split "/" nameOrPath);
|
||||
path = if strings.hasSuffix ".fsx" nameOrPath then nameOrPath else "${nameOrPath}.fsx";
|
||||
|
@ -648,12 +442,9 @@ rec {
|
|||
${lib.getExe dotnet-sdk} fsi --quiet --nologo --readline- ${fsi-flags} "$@" < "$script"
|
||||
'';
|
||||
|
||||
in content: makeScriptWriter (
|
||||
(builtins.removeAttrs args ["dotnet-sdk" "fsi-flags" "libraries"])
|
||||
// {
|
||||
interpreter = fsi;
|
||||
}
|
||||
) path
|
||||
in content: makeScriptWriter {
|
||||
interpreter = fsi;
|
||||
} path
|
||||
''
|
||||
#i "nuget: ${nuget-source}/lib"
|
||||
${ content }
|
||||
|
@ -665,4 +456,5 @@ rec {
|
|||
|
||||
writeFSharpBin = name:
|
||||
writeFSharp "/bin/${name}";
|
||||
|
||||
}
|
||||
|
|
|
@ -1,8 +1,13 @@
|
|||
{ haskellPackages
|
||||
{ glib
|
||||
, haskellPackages
|
||||
, lib
|
||||
, nodePackages
|
||||
, perlPackages
|
||||
, pypy2Packages
|
||||
, python3Packages
|
||||
, pypy3Packages
|
||||
, luaPackages
|
||||
, rubyPackages
|
||||
, runCommand
|
||||
, testers
|
||||
, writers
|
||||
|
@ -305,85 +310,4 @@ lib.recurseIntoAttrs {
|
|||
expected = "hello: world\n";
|
||||
};
|
||||
};
|
||||
|
||||
wrapping = lib.recurseIntoAttrs {
|
||||
bash-bin = expectSuccessBin (
|
||||
writeBashBin "test-writers-wrapping-bash-bin"
|
||||
{
|
||||
makeWrapperArgs = [
|
||||
"--set"
|
||||
"ThaigerSprint"
|
||||
"Thailand"
|
||||
];
|
||||
}
|
||||
''
|
||||
if [[ "$ThaigerSprint" == "Thailand" ]]; then
|
||||
echo "success"
|
||||
fi
|
||||
''
|
||||
);
|
||||
|
||||
bash = expectSuccess (
|
||||
writeBash "test-writers-wrapping-bash"
|
||||
{
|
||||
makeWrapperArgs = [
|
||||
"--set"
|
||||
"ThaigerSprint"
|
||||
"Thailand"
|
||||
];
|
||||
}
|
||||
''
|
||||
if [[ "$ThaigerSprint" == "Thailand" ]]; then
|
||||
echo "success"
|
||||
fi
|
||||
''
|
||||
);
|
||||
|
||||
python = expectSuccess (
|
||||
writePython3 "test-writers-wrapping-python"
|
||||
{
|
||||
makeWrapperArgs = [
|
||||
"--set"
|
||||
"ThaigerSprint"
|
||||
"Thailand"
|
||||
];
|
||||
}
|
||||
''
|
||||
import os
|
||||
|
||||
if os.environ.get("ThaigerSprint") == "Thailand":
|
||||
print("success")
|
||||
''
|
||||
);
|
||||
|
||||
rust = expectSuccess (
|
||||
writeRust "test-writers-wrapping-rust"
|
||||
{
|
||||
makeWrapperArgs = [
|
||||
"--set"
|
||||
"ThaigerSprint"
|
||||
"Thailand"
|
||||
];
|
||||
}
|
||||
''
|
||||
fn main(){
|
||||
if std::env::var("ThaigerSprint").unwrap() == "Thailand" {
|
||||
println!("success")
|
||||
}
|
||||
}
|
||||
''
|
||||
);
|
||||
|
||||
no-empty-wrapper = let
|
||||
bin = writeBashBin "bin" { makeWrapperArgs = []; } ''true'';
|
||||
in runCommand "run-test-writers-wrapping-no-empty-wrapper" {} ''
|
||||
ls -A ${bin}/bin
|
||||
if [ $(ls -A ${bin}/bin | wc -l) -eq 1 ]; then
|
||||
touch $out
|
||||
else
|
||||
echo "Error: Empty wrapper was created" >&2
|
||||
exit 1
|
||||
fi
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue