Merge pull request #109050 from xaverdh/rust-writer

writers: add writeRust and deduplicate binary stripping
This commit is contained in:
Lassulus 2021-01-12 17:33:50 +01:00 committed by GitHub
commit ec4a1661b2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 5 deletions

View file

@ -63,7 +63,7 @@ rec {
#
# Examples:
# writeSimpleC = makeBinWriter { compileScript = name: "gcc -o $out $contentPath"; }
makeBinWriter = { compileScript }: 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
@ -76,6 +76,8 @@ rec {
contentPath = content;
}) ''
${compileScript}
${lib.optionalString strip
"${pkgs.binutils-unwrapped}/bin/strip --strip-unneeded $out"}
${optionalString (types.path.check nameOrPath) ''
mv $out tmp
mkdir -p $out/$(dirname "${nameOrPath}")
@ -109,7 +111,10 @@ rec {
# return 0;
# }
# ''
writeC = name: { libraries ? [] }:
writeC = name: {
libraries ? [],
strip ? true
}:
makeBinWriter {
compileScript = ''
PATH=${makeBinPath [
@ -131,8 +136,8 @@ rec {
-Wall \
-x c \
"$contentPath"
strip --strip-unneeded "$out"
'';
inherit strip;
} name;
# writeCBin takes the same arguments as writeC but outputs a directory (like writeScriptBin)
@ -165,21 +170,38 @@ rec {
writeHaskell = name: {
libraries ? [],
ghc ? pkgs.ghc,
ghcArgs ? []
ghcArgs ? [],
strip ? true
}:
makeBinWriter {
compileScript = ''
cp $contentPath tmp.hs
${ghc.withPackages (_: libraries )}/bin/ghc ${lib.escapeShellArgs ghcArgs} tmp.hs
mv tmp $out
${pkgs.binutils-unwrapped}/bin/strip --strip-unneeded "$out"
'';
inherit strip;
} name;
# writeHaskellBin takes the same arguments as writeHaskell but outputs a directory (like writeScriptBin)
writeHaskellBin = name:
writeHaskell "/bin/${name}";
writeRust = name: {
rustc ? pkgs.rustc,
rustcArgs ? [],
strip ? true
}:
makeBinWriter {
compileScript = ''
cp "$contentPath" tmp.rs
PATH=${makeBinPath [pkgs.gcc]} ${lib.getBin rustc}/bin/rustc ${lib.escapeShellArgs rustcArgs} -o "$out" tmp.rs
'';
inherit strip;
} name;
writeRustBin = name:
writeRust "/bin/${name}";
# writeJS takes a name an attributeset with libraries and some JavaScript sourcecode and
# returns an executable
#

View file

@ -31,6 +31,12 @@ let
test '~' = '~' && echo 'success'
'';
rust = writeRustBin "test_writers" {} ''
fn main(){
println!("success")
}
'';
haskell = writeHaskellBin "test_writers" { libraries = [ haskellPackages.acme-default ]; } ''
import Data.Default