@@ -45,6 +45,9 @@ module Distribution.Simple.Build
45
45
46
46
-- * Internal package database creation
47
47
, createInternalPackageDB
48
+
49
+ -- * Handling of internal build tools
50
+ , addInternalBuildTools
48
51
) where
49
52
50
53
import Distribution.Compat.Prelude
@@ -76,7 +79,7 @@ import qualified Distribution.Simple.UHC as UHC
76
79
77
80
import Distribution.Simple.Build.Macros (generateCabalMacrosHeader )
78
81
import Distribution.Simple.Build.PackageInfoModule (generatePackageInfoModule )
79
- import Distribution.Simple.Build.PathsModule (generatePathsModule )
82
+ import Distribution.Simple.Build.PathsModule (generatePathsModule , pkgPathEnvVar )
80
83
import qualified Distribution.Simple.Program.HcPkg as HcPkg
81
84
82
85
import Distribution.InstalledPackageInfo (InstalledPackageInfo )
@@ -95,6 +98,7 @@ import Distribution.Simple.LocalBuildInfo
95
98
import Distribution.Simple.PreProcess
96
99
import Distribution.Simple.Program
97
100
import Distribution.Simple.Program.Builtin (haskellSuiteProgram )
101
+ import Distribution.Simple.Program.Db
98
102
import qualified Distribution.Simple.Program.GHC as GHC
99
103
import Distribution.Simple.Program.Types
100
104
import Distribution.Simple.Register
@@ -189,6 +193,7 @@ build_setupHooks
189
193
let comp = targetComponent target
190
194
clbi = targetCLBI target
191
195
bi = componentBuildInfo comp
196
+ -- Include any build-tool-depends on build tools internal to the current package.
192
197
progs' = addInternalBuildTools pkg_descr lbi bi (withPrograms lbi)
193
198
lbi' =
194
199
lbi
@@ -208,7 +213,6 @@ build_setupHooks
208
213
(ruleFromId, _mons) <- SetupHooks. computeRules verbosity inputs pbcRules
209
214
SetupHooks. executeRules verbosity lbi2 tgt ruleFromId
210
215
preBuildComponent runPreBuildHooks verbosity lbi' target
211
-
212
216
let numJobs = buildNumJobs flags
213
217
par_strat <-
214
218
toFlag <$> case buildUseSemaphore flags of
@@ -378,6 +382,7 @@ repl_setupHooks
378
382
lbi'
379
383
{ withPackageDB = withPackageDB lbi ++ [internalPackageDB]
380
384
, withPrograms =
385
+ -- Include any build-tool-depends on build tools internal to the current package.
381
386
addInternalBuildTools
382
387
pkg_descr
383
388
lbi'
@@ -911,24 +916,49 @@ createInternalPackageDB verbosity lbi distPref = do
911
916
dbRelPath = internalPackageDBPath lbi distPref
912
917
dbPath = interpretSymbolicPathLBI lbi dbRelPath
913
918
919
+ -- | Update the program database to include any build-tool-depends specified
920
+ -- in the given 'BuildInfo' on build tools internal to the current package.
921
+ --
922
+ -- This function:
923
+ --
924
+ -- - adds these internal build tools to the 'ProgramDb', including
925
+ -- paths to their respective data directories,
926
+ -- - adds their paths to the current 'progSearchPath', and adds the data
927
+ -- directory environment variable for the current package to the current
928
+ -- 'progOverrideEnv', so that any programs configured from now on will be
929
+ -- able to invoke these build tools.
914
930
addInternalBuildTools
915
931
:: PackageDescription
916
932
-> LocalBuildInfo
917
933
-> BuildInfo
918
934
-> ProgramDb
919
935
-> ProgramDb
920
936
addInternalBuildTools pkg lbi bi progs =
921
- foldr updateProgram progs internalBuildTools
937
+ prependProgramSearchPathNoLogging
938
+ internalToolPaths
939
+ [pkgDataDirVar]
940
+ $ foldr updateProgram progs internalBuildTools
922
941
where
942
+ internalToolPaths = map (takeDirectory . programPath) internalBuildTools
943
+ pkgDataDirVar = (pkgPathEnvVar pkg " datadir" , Just dataDirPath)
923
944
internalBuildTools =
924
- [ simpleConfiguredProgram toolName' (FoundOnSystem toolLocation)
945
+ [ (simpleConfiguredProgram toolName' (FoundOnSystem toolLocation))
946
+ { programOverrideEnv = [pkgDataDirVar]
947
+ }
925
948
| toolName <- getAllInternalToolDependencies pkg bi
926
949
, let toolName' = unUnqualComponentName toolName
927
950
, let toolLocation =
928
951
interpretSymbolicPathLBI lbi $
929
952
buildDir lbi
930
953
</> makeRelativePathEx (toolName' </> toolName' <.> exeExtension (hostPlatform lbi))
931
954
]
955
+ mbWorkDir = mbWorkDirLBI lbi
956
+ rawDataDir = dataDir pkg
957
+ dataDirPath
958
+ | null $ getSymbolicPath rawDataDir =
959
+ interpretSymbolicPath mbWorkDir sameDirectory
960
+ | otherwise =
961
+ interpretSymbolicPath mbWorkDir rawDataDir
932
962
933
963
-- TODO: build separate libs in separate dirs so that we can build
934
964
-- multiple libs, e.g. for 'LibTest' library-style test suites
0 commit comments