]> gitweb.factorcode.org Git - factor.git/commitdiff
shell.nix: supply `wrapFactor` helper to make standalone factor binary
authortimor <timor.dd@googlemail.com>
Wed, 20 May 2020 15:04:01 +0000 (17:04 +0200)
committerJohn Benediktsson <mrjbq7@gmail.com>
Fri, 22 May 2020 17:11:26 +0000 (17:11 +0000)
This adds the shell function `wrapFactor`.  This function is intended to wrap
the result of calling `build.sh` in the shell environment so it can be executed
outside of the nix shell.

Example:

```
$ nix-shell
[nix-shell] $ ./build.sh bootstrap
...build factor vm and image...
[nix-shell] $ wrapFactor .
exit
$ ./factor
```

`wrapFactor` takes the path to the factor root dir as argument, and expects the
binary `factor` and the image file `factor.image` there and uses Nixpkgs'
`makeWrapper` to wrap the `factor` executable in-place with the correct
`LD_LIBRARY_PATH`.  Afterwards, the factor executable can be called outside of
the nix-shell environment.

shell.nix

index e1576d3cb12102e8967a62ebfe9f1922e51d559c..b9d4a136b0a5de7de38a88be1e78bbe29c878359 100644 (file)
--- a/shell.nix
+++ b/shell.nix
@@ -15,13 +15,25 @@ let
     udis86 # available since NixOS 19.09
     openal
   ];
+  runtimeLibPath = lib.makeLibraryPath runtimeLibs;
 in
 (mkClangShell {
   name = "factor-shell-env";
-  LD_LIBRARY_PATH = "/run/opengl-driver/lib:${lib.makeLibraryPath runtimeLibs}" ;
+  LD_LIBRARY_PATH = "/run/opengl-driver/lib:${runtimeLibPath}" ;
   buildInputs = runtimeLibs ++ [
     # for building factor
     git
     curl
+    makeWrapper
   ];
+  shellHook = ''
+    wrapFactor () {
+    [ -n "$1" ] || { printf "Usage: wrapFactor <factor-root>" ; return; }
+    local root="$(realpath $1)"
+    local binary="''${root}/factor"
+    wrapProgram "$binary" --prefix LD_LIBRARY_PATH : ${runtimeLibPath} \
+      --argv0 factor
+    ln -sf "''${root}/factor.image" "''${root}/.factor-wrapped.image"
+    }
+  '';
 })