1
- { stdenv , buildPackages , ghc , lib , pkgconfig , writeText , runCommand , haskellLib , nonReinstallablePkgs } :
1
+ { stdenv , buildPackages , ghc , lib , pkgconfig , writeText , runCommand , haskellLib , nonReinstallablePkgs , withPackage } :
2
2
3
3
{ componentId
4
4
, component
16
16
, preBuild ? null , postBuild ? null
17
17
, preCheck ? null , postCheck ? null
18
18
, preInstall ? null , postInstall ? null
19
+ , shellHook ? null
19
20
20
21
, doCheck ? component . doCheck || haskellLib . isTest componentId
21
22
, doCrossCheck ? component . doCrossCheck || false
46
47
in map ( { val , ...} : val ) closure ;
47
48
48
49
exactDep = pdbArg : p : ''
49
- if id=$(${ ghc . targetPrefix } ghc -pkg -v0 ${ pdbArg } field ${ p } id --simple-output); then
50
+ if id=$(target -pkg ${ pdbArg } field ${ p } id --simple-output); then
50
51
echo "--dependency=${ p } =$id" >> $out/configure-flags
51
52
fi
52
- if ver=$(${ ghc . targetPrefix } ghc -pkg -v0 ${ pdbArg } field ${ p } version --simple-output); then
53
+ if ver=$(target -pkg ${ pdbArg } field ${ p } version --simple-output); then
53
54
echo "constraint: ${ p } == $ver" >> $out/cabal.config
54
55
echo "constraint: ${ p } installed" >> $out/cabal.config
55
56
fi
56
57
'' ;
57
58
59
+ envDep = pdbArg : p : ''
60
+ if id=$(target-pkg ${ pdbArg } field ${ p } id --simple-output); then
61
+ echo "package-id $id" >> $out/ghc-environment
62
+ fi
63
+ '' ;
64
+
58
65
configFiles = runCommand "${ fullName } -config" { nativeBuildInputs = [ ghc ] ; } ( ''
59
66
mkdir -p $out
60
- ${ ghc . targetPrefix } ghc-pkg -v0 init $out/package.conf.d
67
+
68
+ # Calls ghc-pkg for the target platform
69
+ target-pkg() {
70
+ ${ ghc . targetPrefix } ghc-pkg "$@"
71
+ }
72
+
73
+ target-pkg init $out/package.conf.d
61
74
62
75
${ lib . concatStringsSep "\n " ( lib . mapAttrsToList flagsAndConfig {
63
76
"extra-lib-dirs" = map ( p : "${ lib . getLib p } /lib" ) component . libs ;
69
82
# Note: we need to use --global-package-db with ghc-pkg to prevent it
70
83
# from looking into the implicit global package db when registering the package.
71
84
${ lib . concatMapStringsSep "\n " ( p : ''
72
- ${ ghc . targetPrefix } ghc -pkg -v0 describe ${ p } | ${ ghc . targetPrefix } ghc -pkg -v0 --force --global-package-db $out/package.conf.d register - || true
85
+ target -pkg describe ${ p } | target -pkg --force --global-package-db $out/package.conf.d register - || true
73
86
'' ) nonReinstallablePkgs }
74
87
75
88
${ lib . concatMapStringsSep "\n " ( p : ''
76
- ${ ghc . targetPrefix } ghc -pkg -v0 -- package-db ${ p } /package.conf.d dump | ${ ghc . targetPrefix } ghc -pkg -v0 --force --package-db $out/package.conf.d register -
89
+ target -pkg -- package-db ${ p } /package.conf.d dump | target -pkg --force --package-db $out/package.conf.d register -
77
90
'' ) flatDepends }
78
91
79
92
# Note: we pass `clear` first to ensure that we never consult the implicit global package db.
80
93
${ flagsAndConfig "package-db" [ "clear" "$out/package.conf.d" ] }
81
94
82
95
echo ${ lib . concatStringsSep " " ( lib . mapAttrsToList ( fname : val : "--flags=${ lib . optionalString ( ! val ) "-" + fname } " ) flags ) } >> $out/configure-flags
83
96
97
+ # Provide a GHC environment file
98
+ cat > $out/ghc-environment <<EOF
99
+ clear-package-db
100
+ package-db $out/package.conf.d
101
+ EOF
102
+ ${ lib . concatMapStringsSep "\n " ( p : envDep "--package-db ${ p . components . library } /package.conf.d" p . identifier . name ) component . depends }
103
+ ${ lib . concatMapStringsSep "\n " ( envDep "" ) ( lib . remove "ghc" nonReinstallablePkgs ) }
104
+
84
105
'' + lib . optionalString component . doExactConfig ''
85
106
echo "--exact-configuration" >> $out/configure-flags
86
107
echo "allow-newer: ${ package . identifier . name } :*" >> $out/cabal.config
117
138
sed -i "s,dynamic-library-dirs: .*,dynamic-library-dirs: $dynamicLinksDir," $f
118
139
done
119
140
'' + ''
120
- ${ ghc . targetPrefix } ghc -pkg -v0 --package-db $out/package.conf.d recache
141
+ target -pkg --package-db $out/package.conf.d recache
121
142
'' + ''
122
- ${ ghc . targetPrefix } ghc -pkg -v0 --package-db $out/package.conf.d check
143
+ target -pkg --package-db $out/package.conf.d check
123
144
'' ) ;
124
145
125
146
finalConfigureFlags = lib . concatStringsSep " " (
147
168
++ component . configureFlags
148
169
) ;
149
170
171
+ executableToolDepends = lib . concatMap ( c : if c . isHaskell or false
172
+ then builtins . attrValues ( c . components . exes or { } )
173
+ else [ c ] ) component . build-tools ;
174
+
175
+ # Unfortunately, we need to wrap ghc commands for cabal builds to
176
+ # work in the nix-shell. See ../doc/removing-with-package-wrapper.md.
177
+ shellWrappers = withPackage {
178
+ inherit package configFiles ;
179
+ } ;
180
+
150
181
in stdenv . mkDerivation ( {
151
182
name = fullName ;
152
183
@@ -156,6 +187,7 @@ in stdenv.mkDerivation ({
156
187
inherit ( package ) identifier ;
157
188
config = component ;
158
189
inherit configFiles ;
190
+ env = shellWrappers ;
159
191
} ;
160
192
161
193
meta = {
@@ -169,6 +201,7 @@ in stdenv.mkDerivation ({
169
201
} ;
170
202
171
203
CABAL_CONFIG = configFiles + /cabal.config ;
204
+ GHC_ENVIRONMENT = configFiles + /ghc-environment ;
172
205
LANG = "en_US.UTF-8" ; # GHC needs the locale configured during the Haddock phase.
173
206
LC_ALL = "en_US.UTF-8" ;
174
207
@@ -181,9 +214,7 @@ in stdenv.mkDerivation ({
181
214
nativeBuildInputs =
182
215
[ ghc ]
183
216
++ lib . optional ( component . pkgconfig != [ ] ) pkgconfig
184
- ++ lib . concatMap ( c : if c . isHaskell or false
185
- then builtins . attrValues ( c . components . exes or { } )
186
- else [ c ] ) component . build-tools ;
217
+ ++ executableToolDepends ;
187
218
188
219
SETUP_HS = setup + /bin/Setup ;
189
220
@@ -235,6 +266,11 @@ in stdenv.mkDerivation ({
235
266
'' }
236
267
runHook postInstall
237
268
'' ;
269
+
270
+ shellHook = ''
271
+ export PATH="${ shellWrappers } /bin:$PATH"
272
+ ${ toString shellHook }
273
+ '' ;
238
274
}
239
275
# patches can (if they like) depend on the version and revision of the package.
240
276
// lib . optionalAttrs ( patches != [ ] ) { patches = map ( p : if builtins . isFunction p then p { inherit ( package . identifier ) version ; inherit revision ; } else p ) patches ; }
0 commit comments