forked from sourcegraph/sourcegraph-public-snapshot
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathshell.nix
More file actions
158 lines (134 loc) · 5.55 KB
/
shell.nix
File metadata and controls
158 lines (134 loc) · 5.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# Experimental support for developing in nix. Please reach out to @keegan or @noah if
# you encounter any issues.
#
# Things it does differently:
#
# - Runs postgres under ~/.sourcegraph with a unix socket. No need to manage a
# service. Must remember to run "pg_ctl stop" if you want to stop it.
# - Builds bazel statically (on linux) and configures it to use toolchains for nodejs
# and rust to use the ones provided by rules_nixpkgs
#
# Status: everything works on linux & darwin.
{ pkgs }:
let
# pkgs.universal-ctags installs the binary as "ctags", not "universal-ctags"
# like zoekt expects.
universal-ctags = pkgs.writeShellScriptBin "universal-ctags" ''
exec ${pkgs.universal-ctags}/bin/ctags "$@"
'';
# On darwin, we let bazelisk manage the bazel version since we actually need to run two
# different versions thanks to aspect. Additionally bazelisk allows us to do
# things like "bazel configure". So we just install a script called bazel
# which calls bazelisk.
#
# On linux, we use a from-source statically built bazel (due to libstdc++ woes) for all commands
# besides 'configure', where we transparently defer to bazelisk (which defers to aspect cli).
#
# Additionally bazel seems to break when CC and CXX is set to a nix managed
# compiler on darwin. So the script unsets those.
bazel-wrapper = pkgs.writeShellScriptBin "bazel" (if pkgs.hostPlatform.isMacOS then ''
unset CC CXX
exec ${pkgs.bazelisk}/bin/bazelisk "$@"
'' else ''
if [ "$1" == "configure" ]; then
exec env --unset=USE_BAZEL_VERSION ${pkgs.bazelisk}/bin/bazelisk "$@"
fi
exec ${pkgs.bazel_6}/bin/bazel "$@"
'');
bazel-watcher = pkgs.writeShellScriptBin "ibazel" ''
exec ${pkgs.bazel-watcher}/bin/ibazel \
${pkgs.lib.optionalString pkgs.hostPlatform.isLinux "-bazel_path=${pkgs.bazel_6}/bin/bazel"} "$@"
'';
# custom cargo-bazel so we can pass down LD_LIBRARY_PATH, see definition of LD_LIBRARY_PATH below
# for more info.
cargo-bazel = pkgs.rustPlatform.buildRustPackage {
pname = "cargo-bazel";
version = "0.8.0";
sourceRoot = "source/crate_universe";
doCheck = false;
buildInputs = [ ] ++ pkgs.lib.optional pkgs.hostPlatform.isMacOS [
pkgs.darwin.Security
];
src = pkgs.fetchFromGitHub {
owner = "bazelbuild";
repo = "rules_rust";
rev = "0.19.0";
sha256 = "sha256-+tYfw12oELy+x7V8jtGWK0EiNElTwOteO6aUEMlWXio=";
};
patches = [
./dev/nix/001-rules-rust-cargo-bazel-env.patch
];
cargoSha256 = "sha256-3zFqJrxkHM8MbYkEoThzOJGeFXj9ggTaI+zIL+Hy44I=";
};
in
pkgs.mkShell {
name = "sourcegraph-dev";
# The packages in the `buildInputs` list will be added to the PATH in our shell
nativeBuildInputs = with pkgs; [
# nix language server
nil
# Our core DB.
postgresql_13
# Cache and some store data
redis
# Used by symbols and zoekt-git-index to extract symbols from sourcecode.
universal-ctags
# Build our backend.
go_1_20
# Lots of our tooling and go tests rely on git et al.
git
git-lfs
parallel
nssTools
# CI lint tools you need locally
shfmt
shellcheck
# Web tools. Need node 16.7 so we use unstable. Yarn should also be built against it.
nodejs-16_x
(nodejs-16_x.pkgs.pnpm.override {
version = "8.1.0";
src = fetchurl {
url = "https://registry.npmjs.org/pnpm/-/pnpm-8.1.0.tgz";
sha512 = "sha512-e2H73wTRxmc5fWF/6QJqbuwU6O3NRVZC1G1WFXG8EqfN/+ZBu8XVHJZwPH6Xh0DxbEoZgw8/wy2utgCDwPu4Sg==";
};
})
nodePackages.typescript
# Rust utils for syntax-highlighter service, currently not pinned to the same versions.
cargo
rustc
rustfmt
libiconv
clippy
# special sauce bazel stuff.
bazelisk
bazel-wrapper
bazel-watcher
bazel-buildtools
];
# Startup postgres, redis & set nixos specific stuff
shellHook = ''
set -h # command hashmap is not guaranteed to be enabled, but required by sg
. ./dev/nix/shell-hook.sh
'';
# Fix for using Delve https://github.com/sourcegraph/sourcegraph/pull/35885
hardeningDisable = [ "fortify" ];
# By explicitly setting this environment variable we avoid starting up
# universal-ctags via docker.
CTAGS_COMMAND = "${universal-ctags}/bin/universal-ctags";
RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}";
DEV_WEB_BUILDER = "esbuild";
# Needed for rules_rust provisioned rust tools when running `bazel(isk) configure`, still need
# nixpkgs_rust_configure for actual compilation step
LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [ pkgs.stdenv.cc.cc.lib pkgs.zlib ];
# Tell rules_rust to use our custom cargo-bazel.
CARGO_BAZEL_GENERATOR_URL = "file://${cargo-bazel}/bin/cargo-bazel";
# Some of the bazel actions require some tools assumed to be in the PATH defined by the "strict action env" that we enable
# through --incompatible_strict_action_env. We can poke a custom PATH through with --action_env=PATH=$BAZEL_ACTION_PATH.
# See https://sourcegraph.com/github.com/bazelbuild/bazel@6.1.2/-/blob/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java?L532-547
BAZEL_ACTION_PATH = with pkgs; lib.makeBinPath [ bash stdenv.cc coreutils unzip zip curl ];
# bazel complains when the bazel version differs even by a patch version to whats defined in .bazelversion,
# so we tell it to h*ck off here.
# https://sourcegraph.com/github.com/bazelbuild/bazel@1a4da7f331c753c92e2c91efcad434dc29d10d43/-/blob/scripts/packages/bazel.sh?L23-28
USE_BAZEL_VERSION =
if pkgs.hostPlatform.isMacOS then "" else pkgs.bazel_6.version;
}