Skip to content

Commit c9d28d9

Browse files
committed
Use SetupHooks for Configure build-type
This commit implements the Configure build-type in terms of Hooks, when build-type: Hooks is available (for Cabal >= 3.13). This moves Configure away from an implementation in terms of UserHooks, i.e. away from the Custom build-type.
1 parent 352bfde commit c9d28d9

File tree

5 files changed

+114
-37
lines changed

5 files changed

+114
-37
lines changed

Cabal/src/Distribution/Simple.hs

Lines changed: 66 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,7 @@ import Distribution.Simple.SetupHooks.Internal
110111
)
111112
import Distribution.Simple.Test
112113
import Distribution.Simple.Utils
114+
import qualified Distribution.Types.LocalBuildConfig as LBC
113115
import Distribution.Utils.Path
114116
import Distribution.Verbosity
115117
import Distribution.Version
@@ -935,16 +937,11 @@ autoconfUserHooks =
935937
let common = configCommonFlags flags
936938
verbosity = fromFlag $ setupVerbosity common
937939
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-
940+
runConfigureScript
941+
flags
942+
(flagAssignment lbi)
943+
(withPrograms lbi)
944+
(hostPlatform lbi)
948945
pbi <- getHookedBuildInfo verbosity mbWorkDir (buildDir lbi)
949946
sanityCheckHookedBuildInfo verbosity pkg_descr pbi
950947
let pkg_descr' = updatePackageDescription pbi pkg_descr
@@ -991,6 +988,65 @@ getHookedBuildInfo verbosity mbWorkDir build_dir = do
991988
info verbosity $ "Reading parameters from " ++ getSymbolicPath infoFile
992989
readHookedBuildInfo verbosity mbWorkDir infoFile
993990

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

Cabal/src/Distribution/Simple/ConfigureScript.hs

Lines changed: 31 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,25 @@ 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
57+
-- ^ host platform
5458
-> IO ()
55-
runConfigureScript verbosity flags lbi = do
59+
runConfigureScript cfg flags programDb hp = do
60+
let commonCfg = configCommonFlags cfg
61+
verbosity = fromFlag $ setupVerbosity commonCfg
62+
dist_dir <- findDistPrefOrDefault $ setupDistPref commonCfg
63+
let build_dir = dist_dir </> makeRelativePathEx "build"
64+
mbWorkDir = flagToMaybe $ setupWorkingDir commonCfg
65+
configureScriptPath = packageRoot commonCfg </> "configure"
66+
confExists <- doesFileExist configureScriptPath
67+
unless confExists $
68+
dieWithException verbosity (ConfigureScriptNotFound configureScriptPath)
69+
configureFile <-
70+
makeAbsolute $ configureScriptPath
5671
env <- getEnvironment
57-
let commonFlags = configCommonFlags flags
58-
programDb = withPrograms lbi
5972
(ccProg, ccFlags) <- configureCCompiler verbosity programDb
6073
ccProgShort <- getShortPathName ccProg
6174
-- The C compiler's compilation and linker flags (e.g.
@@ -64,8 +77,8 @@ runConfigureScript verbosity flags lbi = do
6477
-- to ccFlags
6578
-- We don't try and tell configure which ld to use, as we don't have
6679
-- a way to pass its flags too
67-
configureFile <-
68-
makeAbsolute $ packageRoot commonFlags </> "configure"
80+
81+
let configureFile' = toUnix configureFile
6982
-- autoconf is fussy about filenames, and has a set of forbidden
7083
-- characters that can't appear in the build directory, etc:
7184
-- https://www.gnu.org/software/autoconf/manual/autoconf.html#File-System-Conventions
@@ -79,7 +92,6 @@ runConfigureScript verbosity flags lbi = do
7992
-- TODO: We don't check for colons, tildes or leading dashes. We
8093
-- also should check the builddir's path, destdir, and all other
8194
-- paths as well.
82-
let configureFile' = toUnix configureFile
8395
for_ badAutoconfCharacters $ \(c, cname) ->
8496
when (c `elem` FilePath.dropDrive configureFile') $
8597
warn verbosity $
@@ -111,7 +123,7 @@ runConfigureScript verbosity flags lbi = do
111123
Map.fromListWith
112124
(<>)
113125
[ (flagEnvVar flag, (flag, bool) :| [])
114-
| (flag, bool) <- unFlagAssignment $ flagAssignment lbi
126+
| (flag, bool) <- unFlagAssignment flags
115127
]
116128
-- A map from env vars to flag names to the single flag we will go with
117129
cabalFlagMapDeconflicted :: Map String (FlagName, Bool) <-
@@ -143,10 +155,10 @@ runConfigureScript verbosity flags lbi = do
143155
]
144156
++ [
145157
( "CABAL_FLAGS"
146-
, Just $ unwords [showFlagValue fv | fv <- unFlagAssignment $ flagAssignment lbi]
158+
, Just $ unwords [showFlagValue fv | fv <- unFlagAssignment flags]
147159
)
148160
]
149-
let extraPath = fromNubList $ configProgramPathExtra flags
161+
let extraPath = fromNubList $ configProgramPathExtra cfg
150162
let cflagsEnv =
151163
maybe (unwords ccFlags) (++ (" " ++ unwords ccFlags)) $
152164
lookup "CFLAGS" env
@@ -160,7 +172,6 @@ runConfigureScript verbosity flags lbi = do
160172
("CFLAGS", Just cflagsEnv)
161173
: [("PATH", Just pathEnv) | not (null extraPath)]
162174
++ cabalFlagEnv
163-
hp = hostPlatform lbi
164175
maybeHostFlag = if hp == buildPlatform then [] else ["--host=" ++ show (pretty hp)]
165176
args' = configureFile' : args ++ ["CC=" ++ ccProgShort] ++ maybeHostFlag
166177
shProg = simpleProgram "sh"
@@ -169,14 +180,16 @@ runConfigureScript verbosity flags lbi = do
169180
lookupProgram shProg
170181
`fmap` configureProgram verbosity shProg progDb
171182
case shConfiguredProg of
172-
Just sh ->
183+
Just sh -> do
184+
let build_in = interpretSymbolicPath mbWorkDir build_dir
185+
createDirectoryIfMissing True build_in
173186
runProgramInvocation verbosity $
174187
(programInvocation (sh{programOverrideEnv = overEnv}) args')
175-
{ progInvokeCwd = Just (interpretSymbolicPathLBI lbi $ buildDir lbi)
188+
{ progInvokeCwd = Just build_in
176189
}
177190
Nothing -> dieWithException verbosity NotFoundMsg
178191
where
179-
args = configureArgs backwardsCompatHack flags
192+
args = configureArgs backwardsCompatHack cfg
180193
backwardsCompatHack = False
181194

182195
-- | 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
@@ -115,7 +115,7 @@ data CabalException
115115
| CheckSemaphoreSupport
116116
| NoLibraryForPackage
117117
| SanityCheckHookedBuildInfo UnqualComponentName
118-
| ConfigureScriptNotFound
118+
| ConfigureScriptNotFound FilePath
119119
| NoValidComponent
120120
| ConfigureEitherSingleOrAll
121121
| ConfigCIDValidForPreComponent
@@ -513,7 +513,7 @@ exceptionMessage e = case e of
513513
++ prettyShow exe1
514514
++ "' but the package does not have a "
515515
++ "executable with that name."
516-
ConfigureScriptNotFound -> "configure script not found."
516+
ConfigureScriptNotFound fp -> "configure script not found at " ++ fp ++ "."
517517
NoValidComponent -> "No valid component targets found"
518518
ConfigureEitherSingleOrAll -> "Can only configure either single component or all of them"
519519
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: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -557,8 +557,8 @@ internalSetupMethod verbosity options bt args = do
557557
buildTypeAction :: BuildType -> ([String] -> IO ())
558558
buildTypeAction Simple = Simple.defaultMainArgs
559559
buildTypeAction Configure =
560-
Simple.defaultMainWithHooksArgs
561-
Simple.autoconfUserHooks
560+
Simple.defaultMainWithSetupHooksArgs
561+
Simple.autoconfSetupHooks
562562
buildTypeAction Make = Make.defaultMainArgs
563563
buildTypeAction Hooks = error "buildTypeAction Hooks"
564564
buildTypeAction Custom = error "buildTypeAction Custom"
@@ -862,10 +862,18 @@ getExternalSetupMethod verbosity options pkg bt = do
862862
buildTypeScript cabalLibVersion = case bt of
863863
Simple -> "import Distribution.Simple; main = defaultMain\n"
864864
Configure
865-
| cabalLibVersion >= mkVersion [1, 3, 10] -> "import Distribution.Simple; main = defaultMainWithHooks autoconfUserHooks\n"
866-
| otherwise -> "import Distribution.Simple; main = defaultMainWithHooks defaultUserHooks\n"
865+
| cabalLibVersion >= mkVersion [3, 13, 0]
866+
-> "import Distribution.Simple; main = defaultMainWithSetupHooks autoconfSetupHooks\n"
867+
| cabalLibVersion >= mkVersion [1, 3, 10]
868+
-> "import Distribution.Simple; main = defaultMainWithHooks autoconfUserHooks\n"
869+
| otherwise
870+
-> "import Distribution.Simple; main = defaultMainWithHooks defaultUserHooks\n"
867871
Make -> "import Distribution.Make; main = defaultMain\n"
868-
Hooks -> "import Distribution.Simple; import SetupHooks; main = defaultMainWithSetupHooks setupHooks\n"
872+
Hooks
873+
| cabalLibVersion >= mkVersion [3, 13, 0]
874+
-> "import Distribution.Simple; import SetupHooks; main = defaultMainWithSetupHooks setupHooks\n"
875+
| otherwise
876+
-> error "buildTypeScript Hooks with Cabal < 3.13"
869877
Custom -> error "buildTypeScript Custom"
870878

871879
installedCabalVersion

0 commit comments

Comments
 (0)