Skip to content

Commit d1dce35

Browse files
committed
Use SetupHooks for Configure build-type
1 parent 4b173c6 commit d1dce35

File tree

5 files changed

+104
-35
lines changed

5 files changed

+104
-35
lines changed

Cabal/src/Distribution/Simple.hs

Lines changed: 67 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ module Distribution.Simple
6767
-- ** Standard sets of hooks
6868
, simpleUserHooks
6969
, autoconfUserHooks
70+
, autoconfSetupHooks
7071
, emptyUserHooks
7172
) where
7273

@@ -110,6 +111,8 @@ import Distribution.Simple.SetupHooks.Internal
110111
)
111112
import Distribution.Simple.Test
112113
import Distribution.Simple.Utils
114+
import Distribution.Types.LocalBuildInfo (buildDirPBD)
115+
import qualified Distribution.Types.LocalBuildConfig as LBC
113116
import Distribution.Utils.Path
114117
import Distribution.Verbosity
115118
import Distribution.Version
@@ -935,16 +938,11 @@ autoconfUserHooks =
935938
let common = configCommonFlags flags
936939
verbosity = fromFlag $ setupVerbosity common
937940
mbWorkDir = flagToMaybe $ setupWorkingDir common
938-
baseDir = packageRoot common
939-
confExists <- doesFileExist $ baseDir </> "configure"
940-
if confExists
941-
then
942-
runConfigureScript
943-
verbosity
944-
flags
945-
lbi
946-
else dieWithException verbosity ConfigureScriptNotFound
947-
941+
runConfigureScript
942+
flags
943+
(flagAssignment lbi)
944+
(withPrograms lbi)
945+
(hostPlatform lbi)
948946
pbi <- getHookedBuildInfo verbosity mbWorkDir (buildDir lbi)
949947
sanityCheckHookedBuildInfo verbosity pkg_descr pbi
950948
let pkg_descr' = updatePackageDescription pbi pkg_descr
@@ -991,6 +989,65 @@ getHookedBuildInfo verbosity mbWorkDir build_dir = do
991989
info verbosity $ "Reading parameters from " ++ getSymbolicPath infoFile
992990
readHookedBuildInfo verbosity mbWorkDir infoFile
993991

992+
autoconfSetupHooks :: SetupHooks
993+
autoconfSetupHooks =
994+
SetupHooks.noSetupHooks
995+
{ SetupHooks.configureHooks =
996+
SetupHooks.noConfigureHooks
997+
{ SetupHooks.postConfPackageHook = Just post_conf_pkg
998+
, SetupHooks.preConfComponentHook = Just pre_conf_comp
999+
}
1000+
}
1001+
where
1002+
post_conf_pkg
1003+
:: SetupHooks.PostConfPackageInputs
1004+
-> IO ()
1005+
post_conf_pkg
1006+
( SetupHooks.PostConfPackageInputs
1007+
{ SetupHooks.localBuildConfig =
1008+
LBC.LocalBuildConfig{LBC.withPrograms = progs}
1009+
, SetupHooks.packageBuildDescr =
1010+
LBC.PackageBuildDescr
1011+
{ LBC.configFlags = cfg
1012+
, LBC.flagAssignment = flagAssignment
1013+
, LBC.hostPlatform = plat
1014+
}
1015+
}
1016+
) = runConfigureScript cfg flagAssignment progs plat
1017+
1018+
pre_conf_comp
1019+
:: SetupHooks.PreConfComponentInputs
1020+
-> IO SetupHooks.PreConfComponentOutputs
1021+
pre_conf_comp
1022+
( SetupHooks.PreConfComponentInputs
1023+
{ SetupHooks.packageBuildDescr =
1024+
LBC.PackageBuildDescr
1025+
{ LBC.configFlags = cfg
1026+
, localPkgDescr = pkg_descr
1027+
}
1028+
, SetupHooks.component = component
1029+
}
1030+
) = do
1031+
let verbosity = fromFlag $ configVerbosity cfg
1032+
mbWorkDir = flagToMaybe $ configWorkingDir cfg
1033+
distPref = configDistPref cfg
1034+
dist_dir <- findDistPrefOrDefault distPref
1035+
-- Read the ".buildinfo" file and use that to update
1036+
-- the components (main library + executables only).
1037+
hbi <- getHookedBuildInfo verbosity mbWorkDir (dist_dir </> makeRelativePathEx "build")
1038+
sanityCheckHookedBuildInfo verbosity pkg_descr hbi
1039+
-- SetupHooks TODO: we are reading getHookedBuildInfo once
1040+
-- for each component. I think this is inherent to the SetupHooks
1041+
-- approach.
1042+
let comp_name = componentName component
1043+
diff <- case SetupHooks.hookedBuildInfoComponentDiff_maybe hbi comp_name of
1044+
Nothing -> return $ SetupHooks.emptyComponentDiff comp_name
1045+
Just do_diff -> do_diff
1046+
return $
1047+
SetupHooks.PreConfComponentOutputs
1048+
{ SetupHooks.componentDiff = diff
1049+
}
1050+
9941051
defaultTestHook
9951052
:: Args
9961053
-> PackageDescription

Cabal/src/Distribution/Simple/ConfigureScript.hs

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{-# LANGUAGE CPP #-}
2+
{-# LANGUAGE DataKinds #-}
23
{-# LANGUAGE FlexibleContexts #-}
34
{-# LANGUAGE LambdaCase #-}
45
{-# LANGUAGE RankNTypes #-}
@@ -23,19 +24,20 @@ import Prelude ()
2324
-- local
2425
import Distribution.PackageDescription
2526
import Distribution.Pretty
27+
import Distribution.Simple.Configure (findDistPrefOrDefault)
2628
import Distribution.Simple.Errors
2729
import Distribution.Simple.LocalBuildInfo
2830
import Distribution.Simple.Program
2931
import Distribution.Simple.Program.Db
3032
import Distribution.Simple.Setup.Common
3133
import Distribution.Simple.Setup.Config
3234
import Distribution.Simple.Utils
33-
import Distribution.System (buildPlatform)
35+
import Distribution.System (Platform, buildPlatform)
3436
import Distribution.Utils.NubList
3537
import Distribution.Utils.Path
36-
import Distribution.Verbosity
3738

3839
-- Base
40+
import System.Directory (createDirectoryIfMissing, doesFileExist)
3941
import qualified System.FilePath as FilePath
4042
#ifdef mingw32_HOST_OS
4143
import System.FilePath (normalise, splitDrive)
@@ -48,14 +50,24 @@ import qualified Data.List.NonEmpty as NonEmpty
4850
import qualified Data.Map as Map
4951

5052
runConfigureScript
51-
:: Verbosity
52-
-> ConfigFlags
53-
-> LocalBuildInfo
53+
:: ConfigFlags
54+
-> FlagAssignment
55+
-> ProgramDb
56+
-> Platform -- ^ host platform
5457
-> IO ()
55-
runConfigureScript verbosity flags lbi = do
58+
runConfigureScript cfg flags programDb hp = do
59+
let commonCfg = configCommonFlags cfg
60+
verbosity = fromFlag $ setupVerbosity commonCfg
61+
dist_dir <- findDistPrefOrDefault $ setupDistPref commonCfg
62+
let build_dir = dist_dir </> makeRelativePathEx "build"
63+
mbWorkDir = flagToMaybe $ setupWorkingDir commonCfg
64+
configureScriptPath = packageRoot commonCfg </> "configure"
65+
confExists <- doesFileExist configureScriptPath
66+
unless confExists $
67+
dieWithException verbosity (ConfigureScriptNotFound configureScriptPath)
68+
configureFile <-
69+
makeAbsolute $ configureScriptPath
5670
env <- getEnvironment
57-
let commonFlags = configCommonFlags flags
58-
programDb = withPrograms lbi
5971
(ccProg, ccFlags) <- configureCCompiler verbosity programDb
6072
ccProgShort <- getShortPathName ccProg
6173
-- The C compiler's compilation and linker flags (e.g.
@@ -64,8 +76,8 @@ runConfigureScript verbosity flags lbi = do
6476
-- to ccFlags
6577
-- We don't try and tell configure which ld to use, as we don't have
6678
-- a way to pass its flags too
67-
configureFile <-
68-
makeAbsolute $ packageRoot commonFlags </> "configure"
79+
80+
let configureFile' = toUnix configureFile
6981
-- autoconf is fussy about filenames, and has a set of forbidden
7082
-- characters that can't appear in the build directory, etc:
7183
-- https://www.gnu.org/software/autoconf/manual/autoconf.html#File-System-Conventions
@@ -79,7 +91,6 @@ runConfigureScript verbosity flags lbi = do
7991
-- TODO: We don't check for colons, tildes or leading dashes. We
8092
-- also should check the builddir's path, destdir, and all other
8193
-- paths as well.
82-
let configureFile' = toUnix configureFile
8394
for_ badAutoconfCharacters $ \(c, cname) ->
8495
when (c `elem` FilePath.dropDrive configureFile') $
8596
warn verbosity $
@@ -111,7 +122,7 @@ runConfigureScript verbosity flags lbi = do
111122
Map.fromListWith
112123
(<>)
113124
[ (flagEnvVar flag, (flag, bool) :| [])
114-
| (flag, bool) <- unFlagAssignment $ flagAssignment lbi
125+
| (flag, bool) <- unFlagAssignment flags
115126
]
116127
-- A map from env vars to flag names to the single flag we will go with
117128
cabalFlagMapDeconflicted :: Map String (FlagName, Bool) <-
@@ -143,10 +154,10 @@ runConfigureScript verbosity flags lbi = do
143154
]
144155
++ [
145156
( "CABAL_FLAGS"
146-
, Just $ unwords [showFlagValue fv | fv <- unFlagAssignment $ flagAssignment lbi]
157+
, Just $ unwords [showFlagValue fv | fv <- unFlagAssignment flags]
147158
)
148159
]
149-
let extraPath = fromNubList $ configProgramPathExtra flags
160+
let extraPath = fromNubList $ configProgramPathExtra cfg
150161
let cflagsEnv =
151162
maybe (unwords ccFlags) (++ (" " ++ unwords ccFlags)) $
152163
lookup "CFLAGS" env
@@ -160,7 +171,6 @@ runConfigureScript verbosity flags lbi = do
160171
("CFLAGS", Just cflagsEnv)
161172
: [("PATH", Just pathEnv) | not (null extraPath)]
162173
++ cabalFlagEnv
163-
hp = hostPlatform lbi
164174
maybeHostFlag = if hp == buildPlatform then [] else ["--host=" ++ show (pretty hp)]
165175
args' = configureFile' : args ++ ["CC=" ++ ccProgShort] ++ maybeHostFlag
166176
shProg = simpleProgram "sh"
@@ -169,14 +179,16 @@ runConfigureScript verbosity flags lbi = do
169179
lookupProgram shProg
170180
`fmap` configureProgram verbosity shProg progDb
171181
case shConfiguredProg of
172-
Just sh ->
182+
Just sh -> do
183+
let build_in = interpretSymbolicPath mbWorkDir build_dir
184+
createDirectoryIfMissing True build_in
173185
runProgramInvocation verbosity $
174186
(programInvocation (sh{programOverrideEnv = overEnv}) args')
175-
{ progInvokeCwd = Just (interpretSymbolicPathLBI lbi $ buildDir lbi)
187+
{ progInvokeCwd = Just build_in
176188
}
177189
Nothing -> dieWithException verbosity NotFoundMsg
178190
where
179-
args = configureArgs backwardsCompatHack flags
191+
args = configureArgs backwardsCompatHack cfg
180192
backwardsCompatHack = False
181193

182194
-- | Convert Windows path to Unix ones

Cabal/src/Distribution/Simple/Errors.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ data CabalException
114114
| CheckSemaphoreSupport
115115
| NoLibraryForPackage
116116
| SanityCheckHookedBuildInfo UnqualComponentName
117-
| ConfigureScriptNotFound
117+
| ConfigureScriptNotFound FilePath
118118
| NoValidComponent
119119
| ConfigureEitherSingleOrAll
120120
| ConfigCIDValidForPreComponent
@@ -512,7 +512,7 @@ exceptionMessage e = case e of
512512
++ prettyShow exe1
513513
++ "' but the package does not have a "
514514
++ "executable with that name."
515-
ConfigureScriptNotFound -> "configure script not found."
515+
ConfigureScriptNotFound fp -> "configure script not found at " ++ fp ++ "."
516516
NoValidComponent -> "No valid component targets found"
517517
ConfigureEitherSingleOrAll -> "Can only configure either single component or all of them"
518518
ConfigCIDValidForPreComponent -> "--cid is only supported for per-component configure"

cabal-install/src/Distribution/Client/Main.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1470,8 +1470,8 @@ actAsSetupAction actAsSetupFlags args _globalFlags =
14701470
in case bt of
14711471
Simple -> Simple.defaultMainArgs args
14721472
Configure ->
1473-
Simple.defaultMainWithHooksArgs
1474-
Simple.autoconfUserHooks
1473+
Simple.defaultMainWithSetupHooksArgs
1474+
Simple.autoconfSetupHooks
14751475
args
14761476
Make -> Make.defaultMainArgs args
14771477
Hooks -> error "actAsSetupAction Hooks"

cabal-install/src/Distribution/Client/SetupWrapper.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -555,8 +555,8 @@ internalSetupMethod verbosity options bt args = do
555555
buildTypeAction :: BuildType -> ([String] -> IO ())
556556
buildTypeAction Simple = Simple.defaultMainArgs
557557
buildTypeAction Configure =
558-
Simple.defaultMainWithHooksArgs
559-
Simple.autoconfUserHooks
558+
Simple.defaultMainWithSetupHooksArgs
559+
Simple.autoconfSetupHooks
560560
buildTypeAction Make = Make.defaultMainArgs
561561
buildTypeAction Hooks = error "buildTypeAction Hooks"
562562
buildTypeAction Custom = error "buildTypeAction Custom"
@@ -860,7 +860,7 @@ getExternalSetupMethod verbosity options pkg bt = do
860860
buildTypeScript cabalLibVersion = case bt of
861861
Simple -> "import Distribution.Simple; main = defaultMain\n"
862862
Configure
863-
| cabalLibVersion >= mkVersion [1, 3, 10] -> "import Distribution.Simple; main = defaultMainWithHooks autoconfUserHooks\n"
863+
| cabalLibVersion >= mkVersion [1, 3, 10] -> "import Distribution.Simple; main = defaultMainWithSetupHooks autoconfSetupHooks\n"
864864
| otherwise -> "import Distribution.Simple; main = defaultMainWithHooks defaultUserHooks\n"
865865
Make -> "import Distribution.Make; main = defaultMain\n"
866866
Hooks -> "import Distribution.Simple; import SetupHooks; main = defaultMainWithSetupHooks setupHooks\n"

0 commit comments

Comments
 (0)