@@ -64,7 +64,7 @@ import qualified Distribution.Simple.Build.PathsModule as Build.PathsModule
64
64
65
65
import Distribution.Package
66
66
( Package (.. ), PackageName (.. ), PackageIdentifier (.. )
67
- , thisPackageVersion )
67
+ , Dependency ( .. ), thisPackageVersion )
68
68
import Distribution.Simple.Compiler
69
69
( CompilerFlavor (.. ), compilerFlavor , PackageDB (.. ) )
70
70
import Distribution.PackageDescription
@@ -78,11 +78,13 @@ import Distribution.Simple.Setup
78
78
import Distribution.Simple.PreProcess
79
79
( preprocessComponent , PPSuffixHandler )
80
80
import Distribution.Simple.LocalBuildInfo
81
- ( LocalBuildInfo (compiler , buildDir , withPackageDB )
81
+ ( LocalBuildInfo (compiler , buildDir , withPackageDB , withPrograms )
82
82
, Component (.. ), ComponentLocalBuildInfo (.. ), withComponentsLBI
83
83
, inplacePackageId )
84
+ import Distribution.Simple.Program.Types
85
+ import Distribution.Simple.Program.Db
84
86
import Distribution.Simple.BuildPaths
85
- ( autogenModulesDir , autogenModuleName , cppHeaderName )
87
+ ( autogenModulesDir , autogenModuleName , cppHeaderName , exeExtension )
86
88
import Distribution.Simple.Register
87
89
( registerPackage , inplaceInstalledPackageInfo )
88
90
import Distribution.Simple.Test ( stubFilePath , stubName )
@@ -97,6 +99,8 @@ import Distribution.Text
97
99
98
100
import Data.Maybe
99
101
( maybeToList )
102
+ import Data.List
103
+ ( intersect )
100
104
import Control.Monad
101
105
( unless )
102
106
import System.FilePath
@@ -120,15 +124,16 @@ build pkg_descr lbi flags suffixes = do
120
124
121
125
internalPackageDB <- createInternalPackageDB distPref
122
126
123
- let pre c = preprocessComponent pkg_descr c lbi False verbosity suffixes
124
- lbi' = lbi {withPackageDB = withPackageDB lbi ++ [internalPackageDB]}
125
- -- Use the internal package DB for the exes.
126
- withComponentsLBI pkg_descr lbi $ \ comp clbi -> do
127
- pre comp
127
+ let pre c lbi' = preprocessComponent pkg_descr c lbi' False verbosity suffixes
128
+ withComponentsLBI pkg_descr lbi $ \ comp clbi ->
128
129
case comp of
129
130
CLib lib -> do
131
+ let bi = libBuildInfo lib
132
+ progs' = addInternalBuildTools pkg_descr lbi bi (withPrograms lbi)
133
+ lbi' = lbi { withPrograms = progs' }
134
+ pre comp lbi'
130
135
info verbosity " Building library..."
131
- buildLib verbosity pkg_descr lbi lib clbi
136
+ buildLib verbosity pkg_descr lbi' lib clbi
132
137
133
138
-- Register the library in-place, so exes can depend
134
139
-- on internally defined libraries.
@@ -144,25 +149,40 @@ build pkg_descr lbi flags suffixes = do
144
149
(withPackageDB lbi ++ [internalPackageDB])
145
150
146
151
CExe exe -> do
152
+ let bi = buildInfo exe
153
+ progs' = addInternalBuildTools pkg_descr lbi bi (withPrograms lbi)
154
+ lbi' = lbi {
155
+ withPrograms = progs',
156
+ withPackageDB = withPackageDB lbi ++ [internalPackageDB]
157
+ }
158
+ pre comp lbi'
147
159
info verbosity $ " Building executable " ++ exeName exe ++ " ..."
148
160
buildExe verbosity pkg_descr lbi' exe clbi
149
161
150
162
CTest test -> do
151
163
case testInterface test of
152
164
TestSuiteExeV10 _ f -> do
153
- let exe = Executable
165
+ let bi = testBuildInfo test
166
+ exe = Executable
154
167
{ exeName = testName test
155
168
, modulePath = f
156
- , buildInfo = testBuildInfo test
169
+ , buildInfo = bi
157
170
}
171
+ progs' = addInternalBuildTools pkg_descr lbi bi (withPrograms lbi)
172
+ lbi' = lbi {
173
+ withPrograms = progs',
174
+ withPackageDB = withPackageDB lbi ++ [internalPackageDB]
175
+ }
176
+ pre comp lbi'
158
177
info verbosity $ " Building test suite " ++ testName test ++ " ..."
159
178
buildExe verbosity pkg_descr lbi' exe clbi
160
179
TestSuiteLibV09 _ m -> do
161
180
pwd <- getCurrentDirectory
162
- let lib = Library
181
+ let bi = testBuildInfo test
182
+ lib = Library
163
183
{ exposedModules = [ m ]
164
184
, libExposed = True
165
- , libBuildInfo = testBuildInfo test
185
+ , libBuildInfo = bi
166
186
}
167
187
pkg = pkg_descr
168
188
{ package = (package pkg_descr)
@@ -197,6 +217,13 @@ build pkg_descr lbi flags suffixes = do
197
217
: (filter (\ (_, x) -> let PackageName name = pkgName x in name == " Cabal" || name == " base" )
198
218
$ componentPackageDeps clbi)
199
219
}
220
+ progs' = addInternalBuildTools pkg_descr lbi bi (withPrograms lbi)
221
+ lbi' = lbi {
222
+ withPrograms = progs',
223
+ withPackageDB = withPackageDB lbi ++ [internalPackageDB]
224
+ }
225
+
226
+ pre comp lbi'
200
227
info verbosity $ " Building test suite " ++ testName test ++ " ..."
201
228
buildLib verbosity pkg lbi' lib clbi
202
229
registerPackage verbosity ipi pkg lbi' True $ withPackageDB lbi'
@@ -213,6 +240,22 @@ createInternalPackageDB distPref = do
213
240
writeFile dbFile " []"
214
241
return packageDB
215
242
243
+ addInternalBuildTools :: PackageDescription -> LocalBuildInfo -> BuildInfo
244
+ -> ProgramDb -> ProgramDb
245
+ addInternalBuildTools pkg lbi bi progs =
246
+ foldr updateProgram progs internalBuildTools
247
+ where
248
+ internalBuildTools =
249
+ [ simpleConfiguredProgram toolName (FoundOnSystem toolLocation)
250
+ | toolName <- toolNames
251
+ , let toolLocation = buildDir lbi </> toolName </> toolName <.> exeExtension ]
252
+ toolNames = intersect buildToolNames internalExeNames
253
+ internalExeNames = map exeName (executables pkg)
254
+ buildToolNames = map buildToolName (buildTools bi)
255
+ where
256
+ buildToolName (Dependency (PackageName name) _ ) = name
257
+
258
+
216
259
-- TODO: build separate libs in separate dirs so that we can build
217
260
-- multiple libs, e.g. for 'LibTest' library-style testsuites
218
261
buildLib :: Verbosity -> PackageDescription -> LocalBuildInfo
0 commit comments