OILS / shell.nix View on Github | oilshell.org

134 lines, 117 significant
1# Nix shell expression for the oil shell (formatted with nixfmt)
2# Note: run `nixfmt shell.nix` in nix-shell to reformat in-place
3#
4# By default fetch the most-recent 19.09 version of the stable NixOS release.
5# This should be fine, but if it causes trouble it can be pinned to ensure
6# everyone is running exactly the same versions.
7{ nixpkgs ? fetchTarball "channel:nixos-19.09", dev ? "all", test ? "smoke"
8, cleanup ? true }:
9
10let
11 # Import the package set.
12 pkgs = import nixpkgs { };
13
14 # Added the following 3 declarations (and parameters/defaults above) to
15 # demonstrate how you could make the behavior a little configurable.
16 #
17 # By default, it will run:
18 # - "all" dev build (--argstr dev minimal or none to disable)
19 # - the "smoke" tests (--argstr test osh-all or none to disable)
20 # - and clean on exit (ex: --argstr cleanup none to disable)
21 build_oil = if dev == "none" then
22 "echo Skipping Oil build."
23 else ''
24 echo Building \'${dev}\' Oil.
25 "$PWD/build/py.sh" ${dev}
26 '';
27 test_oil = if test == "none" then
28 "echo Skipping Oil tests."
29 else ''
30 echo Running Oil \'${test}\' tests.
31 "$PWD/test/spec.sh" ${test}
32 '';
33 cleanup_oil = if cleanup == "none" then ''
34 echo "Note: nix-shell will *NOT* clean up Oil dev build on exit!"
35 trap 'echo "NOT cleaning up Oil dev build."' EXIT
36 '' else ''
37 echo "Note: nix-shell will clean up the dev build on exit."
38 trap 'echo "Cleaning up Oil dev build."; "$PWD/build/clean.sh"' EXIT
39 '';
40in with pkgs;
41
42let
43 # Most of the items you listed in #513 are here now. I'm not sure what the
44 # remaining items here mean, so I'm not sure if they're covered.
45 #
46 # static analysis
47 # mypy library for mycpp
48 # benchmarks
49 # ocaml configure, etc. This is just source though.
50 # C deps
51 # python headers for bootstrapping
52 # big one: Clang for ASAN and other sanitizers (even though GCC has some)
53 # Clang for coverage too
54
55 # nixpkgs: busybox linux only; no smoosh
56 # could append something like: ++ lib.optionals stdenv.isLinux [ busybox ]
57 spec_tests = [ bash dash mksh zsh busybox ];
58
59 static_analysis = [
60 mypy # This is the Python 3 version
61 (python2.withPackages (ps: with ps; [ flake8 pyannotate ]))
62 # python3Packages.black # wink wink :)
63 ];
64
65 binary = [ re2c ];
66 doctools = [ cmark ];
67 c_deps = [ readline ];
68
69 shell_deps = [
70 gawk
71 time
72 # additional command dependencies I found as I went
73 # guessing they go here...
74 # run with nix-shell --pure to make missing deps easier to find!
75 file
76 git
77 hostname
78 which
79 ];
80
81 nix_deps = [
82 nixfmt # `nixfmt shell.nix` to format in place
83 ];
84
85 # Create a shell with packages we need.
86in mkShell rec {
87
88 buildInputs = c_deps ++ binary ++ spec_tests ++ static_analysis ++ doctools
89 ++ shell_deps ++ nix_deps ++ doctools;
90
91 # Not sure if this is "right" (for nix, other platforms, etc.)
92 # doctools/cmark.py hardcoded /usr/local/lib/libcmark.so, and it looks
93 # like Nix has as much trouble with load_library as you have. For a
94 # "build" I think we'd use a patchPhase to replace the hard path
95 # in cmark.py with the correct one. Since we can't patch the source here
96 # I'm hacking an env in here and in cmark.py. Hopefully others will
97 # weigh in if there's a better way to handle this.
98 #
99 # Note: Nix automatically adds identifiers declared here to the environment!
100 _NIX_SHELL_LIBCMARK = "${cmark}/lib/libcmark${stdenv.hostPlatform.extensions.sharedLibrary}";
101
102 # Need nix to relax before it'll link against a local file.
103 NIX_ENFORCE_PURITY = 0;
104
105 # Note: failing spec test with either of these LOCALE_ARCHIVE settings.
106 #
107 # $ test/spec.sh oil-options -r 0 -v
108 # if libc.fnmatch(pat_val.s, to_match):
109 # SystemError: Invalid locale for LC_CTYPE
110 LOCALE_ARCHIVE =
111 if stdenv.isLinux then "${glibcLocales}/lib/locale/locale-archive" else "";
112
113 # a different option:
114 # LOCALE_ARCHIVE = lib.optionalString (stdenv.hostPlatform.libc == "glibc") "${glibcLocales}/lib/locale/locale-archive";
115
116 # do setup work you want to do every time you enter the shell
117 # Here are a few ideas that made sense to me:
118 shellHook = ''
119 if [[ ! -a "$PWD/py-yajl/setup.py" ]]; then
120 git submodule update --init --recursive
121 fi
122
123 if [[ ! -a "$PWD/libc.so" ]]; then
124 ${build_oil}
125 ${test_oil}
126 else
127 echo "Dev build already exists. If you made changes, run:"
128 echo " 'build/clean.sh' and "
129 echo " 'build/py.sh all' or 'build/py.sh minimal'"
130 fi
131
132 ${cleanup_oil}
133 '';
134}