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

View File

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