ttaenc: init at 3.4.1 (#238757)
[NixPkgs.git] / pkgs / misc / my-env / default.nix
blob710536e9869ae9ccd3dbbb437c2740e8934167c3
1 # idea: provide a build environments for your developement of preference
2 /*
3   #### examples of use: ####
4   # Add this to your ~/.config/nixpkgs/config.nix:
5   {
6     packageOverrides = pkgs : with pkgs; {
7       sdlEnv = pkgs.myEnvFun {
8           name = "sdl";
9           nativeBuildInputs = [ cmake pkg-config ];
10           buildInputs = [ stdenv SDL SDL_image SDL_ttf SDL_gfx SDL_net];
11       };
12     };
13   }
15   # Then you can install it by:
16   #  $ nix-env -i env-sdl
17   # And you can load it simply calling:
18   #  $ load-env-sdl
19   # and this will update your env vars to have 'make' and 'gcc' finding the SDL
20   # headers and libs.
22   ##### Another example, more complicated but achieving more: #######
23   # Make an environment to build nix from source and create ctags (tagfiles can
24   # be extracted from TAG_FILES) from every source package. Here would be a
25   # full ~/.config/nixpkgs/config.nix
26   {
27     packageOverrides = pkgs : with pkgs; with sourceAndTags;
28     let complicatedMyEnv = { name, buildInputs ? [], cTags ? [], extraCmds ? ""}:
29             pkgs.myEnvFun {
30               inherit name;
31             buildInputs = buildInputs
32                   ++ map (x : sourceWithTagsDerivation
33                     ( (addCTaggingInfo x ).passthru.sourceWithTags ) ) cTags;
34             extraCmds = ''
35               ${extraCmds}
36               HOME=${builtins.getEnv "HOME"}
37               . ~/.bashrc
38             '';
39           };
40     in rec {
41       # this is the example we will be using
42       nixEnv = complicatedMyEnv {
43         name = "nix";
44         buildInputs = [ libtool stdenv perl curl bzip2 openssl db5 autoconf automake zlib ];
45       };
46     };
47   }
49   # Now we should build our newly defined custom environment using this command on a shell, so type:
50   #  $ nix-env -i env-nix
52   # You can load the environment simply typing a "load-env-${name}" command.
53   #  $ load-env-nix
54   # The result using that command should be:
55   #  env-nix loaded
56   and show you a shell with a prefixed prompt.
60   mkDerivation,
61   substituteAll,
62   pkgs,
65   stdenv ? pkgs.stdenv,
66   name,
67   buildInputs ? [ ],
68   propagatedBuildInputs ? [ ],
69   gcc ? stdenv.cc,
70   extraCmds ? "",
71   cleanupCmds ? "",
72   shell ? "${pkgs.bashInteractive}/bin/bash --norc",
75 mkDerivation {
76   inherit buildInputs propagatedBuildInputs;
78   name = "env-${name}";
79   phases = [
80     "buildPhase"
81     "fixupPhase"
82   ];
83   setupNew = substituteAll {
84     src = ../../stdenv/generic/setup.sh;
85     inherit gcc;
86   };
88   buildPhase =
89     let
90       initialPath = import ../../stdenv/generic/common-path.nix { inherit pkgs; };
91     in
92     ''
93       set -x
94       mkdir -p "$out/dev-envs" "$out/nix-support" "$out/bin"
95       s="$out/nix-support/setup-new-modified"
96       # shut some warning up.., do not use set -e
97       sed -e 's@set -eu@@' \
98           -e 's@assertEnvExists\s\+NIX_STORE@:@' \
99           -e 's@trap.*@@' \
100           -e '1i initialPath="${toString initialPath}"' \
101           "$setupNew" > "$s"
102       cat >> "$out/dev-envs/''${name/env-/}" << EOF
103         defaultNativeBuildInputs="$defaultNativeBuildInputs"
104         buildInputs="$buildInputs"
105         propagatedBuildInputs="$propagatedBuildInputs"
106         # the setup-new script wants to write some data to a temp file.. so just let it do that and tidy up afterwards
107         tmp="\$("${pkgs.coreutils}/bin/mktemp" -d)"
108         NIX_BUILD_TOP="\$tmp"
109         phases=
110         # only do all the setup stuff in nix-support/*
111         set +e
112         # This prevents having -rpath /lib in NIX_LDFLAGS
113         export NIX_NO_SELF_RPATH=1
114         if [[ -z "\$ZSH_VERSION" ]]; then
115           source "$s"
116         else
117           setopt interactivecomments
118           # fix bash indirection
119           # let's hope the bash arrays aren't used
120           # substitute is using bash array, so skip it
121           echo '
122               setopt NO_BAD_PATTERN
123               setopt NO_BANG_HIST
124               setopt NO_BG_NICE
125               setopt NO_EQUALS
126               setopt NO_FUNCTION_ARGZERO
127               setopt GLOB_SUBST
128               setopt NO_HUP
129               setopt INTERACTIVE_COMMENTS
130               setopt KSH_ARRAYS
131               setopt NO_MULTIOS
132               setopt NO_NOMATCH
133               setopt RM_STAR_SILENT
134               setopt POSIX_BUILTINS
135               setopt SH_FILE_EXPANSION
136               setopt SH_GLOB
137               setopt SH_OPTION_LETTERS
138               setopt SH_WORD_SPLIT
139             ' >> "\$tmp/script"
140           sed -e 's/\''${!\([^}]*\)}/\''${(P)\1}/g' \
141               -e 's/[[]\*\]//' \
142               -e 's/substitute() {/ substitute() { return; /' \
143               -e 's@PATH=\$@PATH=${pkgs.coreutils}/bin@' \
144               "$s" >> "\$tmp/script"
145           echo "\$tmp/script";
146           source "\$tmp/script";
147         fi
148         ${pkgs.coreutils}/bin/rm -fr "\$tmp"
149         ${extraCmds}
151         nix_cleanup() {
152           :
153           ${cleanupCmds}
154         }
156         export PATH
157         echo $name loaded >&2
159         trap nix_cleanup EXIT
160       EOF
162       mkdir -p $out/bin
163       sed -e 's,@shell@,${shell},' -e s,@myenvpath@,$out/dev-envs/${name}, \
164         -e 's,@name@,${name},' ${./loadenv.sh} > $out/bin/load-env-${name}
165       chmod +x $out/bin/load-env-${name}
166     '';