mirror of
https://github.com/ilyakooo0/nix-bundle.git
synced 2024-09-11 06:55:53 +03:00
Allow to pass a store path as a target. This is useful when combining nix-bundle with the output of another build. Eg: nix-bundle.sh $(nix-build "<nixpkgs>" -A hello) /bin/hello
64 lines
1.3 KiB
Bash
Executable File
64 lines
1.3 KiB
Bash
Executable File
#!/usr/bin/env sh
|
|
|
|
if [ "$#" -lt 2 ]; then
|
|
cat <<EOF
|
|
|
|
Usage: $0 TARGET EXECUTABLE
|
|
|
|
Create a single-file bundle from the nixpkgs attribute "TARGET".
|
|
EXECUTABLE should be relative to the TARGET's output path.
|
|
|
|
The TARGET is either an attribute in nixpkgs, or an absolute path to the
|
|
store.
|
|
|
|
For example:
|
|
|
|
$ $0 hello /bin/hello
|
|
$ ./hello
|
|
Hello, world!
|
|
|
|
EOF
|
|
|
|
exit 1
|
|
fi
|
|
|
|
nix_file=$(dirname "$0")/default.nix
|
|
|
|
target="$1"
|
|
shift
|
|
|
|
extraTargets=
|
|
if [ "$#" -gt 1 ]; then
|
|
while [ "$#" -gt 1 ]; do
|
|
extraTargets="$extraTargets $1"
|
|
shift
|
|
done
|
|
fi
|
|
|
|
exec="$1"
|
|
shift
|
|
|
|
bootstrap=nix-bootstrap
|
|
if [ "$target" = "nix-bundle" ] || [ "$target" = "nixStable" ] || [ "$target" = "nixUnstable" ] || [ "$target" = "nix" ]; then
|
|
bootstrap=nix-bootstrap-nix
|
|
elif [ -n "$extraTargets" ]; then
|
|
bootstrap=nix-bootstrap-path
|
|
fi
|
|
|
|
expr="with import <nixpkgs> {}; with import $nix_file {}; $bootstrap { target = $target; extraTargets = [ $extraTargets ]; run = \"$exec\"; }"
|
|
|
|
drv=$(nix-instantiate --no-gc-warning -E "$expr")
|
|
|
|
out=$(nix-store --no-gc-warning --realize "$drv")
|
|
|
|
if [ -z "$out" ]; then
|
|
>&2 echo "$0 failed. Exiting."
|
|
exit 1
|
|
elif [ -t 1 ]; then
|
|
filename=$(basename "$exec")
|
|
echo "Nix bundle created at $filename."
|
|
cp -f "$out" "$filename"
|
|
else
|
|
cat "$out"
|
|
fi
|