summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Ericson <git@JohnEricson.me>2019-04-03 09:32:05 -0400
committerMarge Bot <ben+marge-bot@smart-cactus.org>2019-04-30 20:29:31 -0400
commitd37d91e9a444a7822eef1558198d21511558515e (patch)
tree478d7a0bf63e91ac8901f0c277dbe29136b1665b
parent014ed644eea9037427c1ebeaac16189b00f9dbc7 (diff)
downloadhaskell-d37d91e9a444a7822eef1558198d21511558515e.tar.gz
Generate settings by make/hadrian instead of configure
This allows it to eventually become stage-specific
-rw-r--r--aclocal.m420
-rw-r--r--configure.ac4
-rw-r--r--distrib/configure.ac.in2
-rw-r--r--ghc.mk5
-rw-r--r--ghc/ghc.mk3
-rw-r--r--hadrian/cfg/system.config.in40
-rw-r--r--hadrian/doc/make.md11
-rw-r--r--hadrian/src/Oracles/Setting.hs51
-rw-r--r--hadrian/src/Rules/BinaryDist.hs2
-rw-r--r--hadrian/src/Rules/Configure.hs2
-rw-r--r--hadrian/src/Rules/Generate.hs53
-rw-r--r--hadrian/src/Rules/SourceDist.hs2
-rw-r--r--includes/ghc.mk46
-rw-r--r--mk/config.mk.in37
14 files changed, 257 insertions, 21 deletions
diff --git a/aclocal.m4 b/aclocal.m4
index d2d42f243b..5004a05ec6 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -497,16 +497,16 @@ AC_DEFUN([FP_SETTINGS],
[
if test "$windows" = YES -a "$EnableDistroToolchain" = "NO"
then
- mingw_bin_prefix=mingw/bin/
- SettingsCCompilerCommand="\$tooldir/${mingw_bin_prefix}gcc.exe"
- SettingsHaskellCPPCommand="\$tooldir/${mingw_bin_prefix}gcc.exe"
+ mingw_bin_prefix='$$tooldir/mingw/bin/'
+ SettingsCCompilerCommand="${mingw_bin_prefix}gcc.exe"
+ SettingsHaskellCPPCommand="${mingw_bin_prefix}gcc.exe"
SettingsHaskellCPPFlags="$HaskellCPPArgs"
- SettingsLdCommand="\$tooldir/${mingw_bin_prefix}ld.exe"
- SettingsArCommand="\$tooldir/${mingw_bin_prefix}ar.exe"
- SettingsRanlibCommand="\$tooldir/${mingw_bin_prefix}ranlib.exe"
- SettingsDllWrapCommand="\$tooldir/${mingw_bin_prefix}dllwrap.exe"
- SettingsWindresCommand="\$tooldir/${mingw_bin_prefix}windres.exe"
- SettingsTouchCommand='$topdir/bin/touchy.exe'
+ SettingsLdCommand="${mingw_bin_prefix}ld.exe"
+ SettingsArCommand="${mingw_bin_prefix}ar.exe"
+ SettingsRanlibCommand="${mingw_bin_prefix}ranlib.exe"
+ SettingsDllWrapCommand="${mingw_bin_prefix}dllwrap.exe"
+ SettingsWindresCommand="${mingw_bin_prefix}windres.exe"
+ SettingsTouchCommand='$$topdir/bin/touchy.exe'
elif test "$EnableDistroToolchain" = "YES"
then
SettingsCCompilerCommand="$(basename $CC)"
@@ -517,7 +517,7 @@ AC_DEFUN([FP_SETTINGS],
SettingsArCommand="$(basename $ArCmd)"
SettingsDllWrapCommand="$(basename $DllWrapCmd)"
SettingsWindresCommand="$(basename $WindresCmd)"
- SettingsTouchCommand='$topdir/bin/touchy.exe'
+ SettingsTouchCommand='$$topdir/bin/touchy.exe'
else
SettingsCCompilerCommand="$CC"
SettingsHaskellCPPCommand="$HaskellCPPCmd"
diff --git a/configure.ac b/configure.ac
index 7772bd43b6..e1b2342d75 100644
--- a/configure.ac
+++ b/configure.ac
@@ -897,7 +897,7 @@ FP_CHECK_SIZEOF_AND_ALIGNMENT(int64_t)
FP_CHECK_SIZEOF_AND_ALIGNMENT(uint64_t)
-dnl for use in settings.in
+dnl for use in settings file
TargetWordSize=$ac_cv_sizeof_void_p
if test "x$TargetWordSize" == 8; then
AC_SUBST([Cabal64bit],[True])
@@ -1292,7 +1292,7 @@ checkMake380() {
checkMake380 make
checkMake380 gmake
-AC_CONFIG_FILES([mk/config.mk mk/install.mk mk/project.mk rts/rts.cabal compiler/ghc.cabal ghc/ghc-bin.cabal utils/iserv/iserv.cabal utils/iserv-proxy/iserv-proxy.cabal utils/remote-iserv/remote-iserv.cabal utils/runghc/runghc.cabal utils/gen-dll/gen-dll.cabal libraries/ghc-boot/ghc-boot.cabal libraries/ghc-boot-th/ghc-boot-th.cabal libraries/ghci/ghci.cabal libraries/ghc-heap/ghc-heap.cabal libraries/libiserv/libiserv.cabal libraries/template-haskell/template-haskell.cabal settings docs/users_guide/ghc_config.py docs/index.html libraries/prologue.txt distrib/configure.ac])
+AC_CONFIG_FILES([mk/config.mk mk/install.mk mk/project.mk rts/rts.cabal compiler/ghc.cabal ghc/ghc-bin.cabal utils/iserv/iserv.cabal utils/iserv-proxy/iserv-proxy.cabal utils/remote-iserv/remote-iserv.cabal utils/runghc/runghc.cabal utils/gen-dll/gen-dll.cabal libraries/ghc-boot/ghc-boot.cabal libraries/ghc-boot-th/ghc-boot-th.cabal libraries/ghci/ghci.cabal libraries/ghc-heap/ghc-heap.cabal libraries/libiserv/libiserv.cabal libraries/template-haskell/template-haskell.cabal docs/users_guide/ghc_config.py docs/index.html libraries/prologue.txt distrib/configure.ac])
AC_OUTPUT
[
if test "$print_make_warning" = "true"; then
diff --git a/distrib/configure.ac.in b/distrib/configure.ac.in
index f9f14d1f6b..9cdb635ed3 100644
--- a/distrib/configure.ac.in
+++ b/distrib/configure.ac.in
@@ -159,7 +159,7 @@ dnl May need to use gcc to find platform details.
dnl --------------------------------------------------------------
FPTOOLS_SET_HASKELL_PLATFORM_VARS
-dnl TargetWordSize for settings.in
+dnl TargetWordSize for settings file
AC_CHECK_SIZEOF(void *, 4)
if test "x$ac_cv_sizeof_void_p" = "x0"; then
AC_MSG_ERROR([Failed to determine machine word size. Does your toolchain actually work?])
diff --git a/ghc.mk b/ghc.mk
index 984dfc61bb..5f1d856ee5 100644
--- a/ghc.mk
+++ b/ghc.mk
@@ -1010,7 +1010,6 @@ $(eval $(call bindist-list,.,\
README \
INSTALL \
configure config.sub config.guess install-sh \
- settings.in \
llvm-targets \
llvm-passes \
packages \
@@ -1067,7 +1066,7 @@ BIN_DIST_MK = $(BIN_DIST_PREP_DIR)/bindist.mk
unix-binary-dist-prep:
$(call removeTrees,bindistprep/)
"$(MKDIRHIER)" $(BIN_DIST_PREP_DIR)
- set -e; for i in packages LICENSE compiler ghc rts libraries utils docs libffi includes driver mk rules Makefile aclocal.m4 config.sub config.guess install-sh settings.in llvm-targets llvm-passes ghc.mk inplace distrib/configure.ac distrib/README distrib/INSTALL; do ln -s ../../$$i $(BIN_DIST_PREP_DIR)/; done
+ set -e; for i in packages LICENSE compiler ghc rts libraries utils docs libffi includes driver mk rules Makefile aclocal.m4 config.sub config.guess install-sh llvm-targets llvm-passes ghc.mk inplace distrib/configure.ac distrib/README distrib/INSTALL; do ln -s ../../$$i $(BIN_DIST_PREP_DIR)/; done
echo "HADDOCK_DOCS = $(HADDOCK_DOCS)" >> $(BIN_DIST_MK)
echo "BUILD_SPHINX_HTML = $(BUILD_SPHINX_HTML)" >> $(BIN_DIST_MK)
echo "BUILD_SPHINX_PDF = $(BUILD_SPHINX_PDF)" >> $(BIN_DIST_MK)
@@ -1165,7 +1164,7 @@ SRC_DIST_GHC_DIRS = mk rules docs distrib bindisttest libffi includes \
SRC_DIST_GHC_FILES += \
configure.ac config.guess config.sub configure \
aclocal.m4 README.md ANNOUNCE HACKING.md INSTALL.md LICENSE Makefile \
- install-sh settings.in llvm-targets llvm-passes VERSION GIT_COMMIT_ID \
+ install-sh llvm-targets llvm-passes VERSION GIT_COMMIT_ID \
boot packages ghc.mk MAKEHELP.md
.PHONY: VERSION
diff --git a/ghc/ghc.mk b/ghc/ghc.mk
index 4c3fbdfd88..9747e34dcc 100644
--- a/ghc/ghc.mk
+++ b/ghc/ghc.mk
@@ -129,6 +129,9 @@ all_ghc_stage1 : $(GHC_STAGE1)
all_ghc_stage2 : $(GHC_STAGE2)
all_ghc_stage3 : $(GHC_STAGE3)
+settings : $(includes_SETTINGS)
+ "$(CP)" $< $@
+
$(INPLACE_LIB)/settings : settings
"$(CP)" $< $@
diff --git a/hadrian/cfg/system.config.in b/hadrian/cfg/system.config.in
index e3c612e0e2..fbb1f54854 100644
--- a/hadrian/cfg/system.config.in
+++ b/hadrian/cfg/system.config.in
@@ -108,6 +108,46 @@ conf-ld-linker-args-stage1 = @CONF_LD_LINKER_OPTS_STAGE1@
conf-ld-linker-args-stage2 = @CONF_LD_LINKER_OPTS_STAGE2@
conf-ld-linker-args-stage3 = @CONF_LD_LINKER_OPTS_STAGE3@
+# Settings:
+#==========
+
+# We are in the process of moving the settings file from being entirely
+# generated by configure, to generated being by the build system. Many of these
+# might become redundant.
+
+gcc-extra-via-c-opts = @GccExtraViaCOpts@
+ld-has-no-compact-unwind = @LdHasNoCompactUnwind@
+ld-has-build-id = @LdHasBuildId@
+ld-has-filelist = @LdHasFilelist@
+ld-is-gnu-ld = @LdIsGNULd@
+ar-args = @ArArgs@
+
+settings-c-compiler-command = @SettingsCCompilerCommand@
+settings-haskell-cpp-command = @SettingsHaskellCPPCommand@
+settings-haskell-cpp-flags = @SettingsHaskellCPPFlags@
+settings-c-compiler-flags = @SettingsCCompilerFlags@
+settings-c-compiler-link-flags = @SettingsCCompilerLinkFlags@
+settings-c-compiler-supports-no-pie = @SettingsCCompilerSupportsNoPie@
+settings-ld-command = @SettingsLdCommand@
+settings-ld-flags = @SettingsLdFlags@
+settings-ar-command = @SettingsArCommand@
+settings-ranlib-command = @SettingsRanlibCommand@
+settings-dll-wrap-command = @SettingsDllWrapCommand@
+settings-windres-command = @SettingsWindresCommand@
+settings-libtool-command = @SettingsLibtoolCommand@
+settings-touch-command = @SettingsTouchCommand@
+settings-clang-command = @SettingsClangCommand@
+settings-llc-command = @SettingsLlcCommand@
+settings-opt-command = @SettingsOptCommand@
+
+haskell-target-os = @HaskellTargetOs@
+haskell-target-arch = @HaskellTargetArch@
+target-word-size = @TargetWordSize@
+haskell-have-gnu-nonexec-stack = @HaskellHaveGnuNonexecStack@
+haskell-have-ident-directive = @HaskellHaveIdentDirective@
+haskell-have-subsections-via-symbols = @HaskellHaveSubsectionsViaSymbols@
+haskell-have-rts-linker = @HaskellHaveRTSLinker@
+
# Include and library directories:
#=================================
diff --git a/hadrian/doc/make.md b/hadrian/doc/make.md
index c163317a18..ff51f6d7ba 100644
--- a/hadrian/doc/make.md
+++ b/hadrian/doc/make.md
@@ -163,6 +163,17 @@ time you fire up a build. This is not possible with the Make build system.
build _build/stage1/lib/platformConstants
```
+- Generate the `settings` file to be used for stage 1/2 GHC
+
+ ``` sh
+ # Make
+ make inplace/lib/settings
+
+ # Hadrian
+ build _build/stage0/lib/settings
+ build _build/stage1/lib/settings
+ ```
+
- Build a static library for base with the stage 1 compiler
``` sh
diff --git a/hadrian/src/Oracles/Setting.hs b/hadrian/src/Oracles/Setting.hs
index 46ae5b5bd0..4c87d53404 100644
--- a/hadrian/src/Oracles/Setting.hs
+++ b/hadrian/src/Oracles/Setting.hs
@@ -3,7 +3,9 @@ module Oracles.Setting (
getSettingList, anyTargetPlatform, anyTargetOs, anyTargetArch, anyHostOs,
ghcWithInterpreter, ghcEnableTablesNextToCode, useLibFFIForAdjustors,
ghcCanonVersion, cmdLineLengthLimit, iosHost, osxHost, windowsHost,
- hostSupportsRPaths, topDirectory, libsuf, ghcVersionStage
+ hostSupportsRPaths, topDirectory, libsuf, ghcVersionStage,
+ SettingsFileSetting (..),
+ settingsFileSetting
) where
import Hadrian.Expression
@@ -75,6 +77,31 @@ data SettingList = ConfCcArgs Stage
| ConfLdLinkerArgs Stage
| HsCppArgs
+-- TODO compute solely in Hadrian, removing these variables' definitions
+-- from aclocal.m4 whenever they can be calculated from other variables
+-- already fed into Hadrian.
+
+-- | Each 'SettingsFileSetting' is defined by 'FP_SETTINGS' in aclocal.m4.
+-- Eventually much of that local can probably be computed just in Hadrian.
+data SettingsFileSetting
+ = SettingsFileSetting_CCompilerCommand
+ | SettingsFileSetting_HaskellCPPCommand
+ | SettingsFileSetting_HaskellCPPFlags
+ | SettingsFileSetting_CCompilerFlags
+ | SettingsFileSetting_CCompilerLinkFlags
+ | SettingsFileSetting_CCompilerSupportsNoPie
+ | SettingsFileSetting_LdCommand
+ | SettingsFileSetting_LdFlags
+ | SettingsFileSetting_ArCommand
+ | SettingsFileSetting_RanlibCommand
+ | SettingsFileSetting_DllWrapCommand
+ | SettingsFileSetting_WindresCommand
+ | SettingsFileSetting_LibtoolCommand
+ | SettingsFileSetting_TouchCommand
+ | SettingsFileSetting_ClangCommand
+ | SettingsFileSetting_LlcCommand
+ | SettingsFileSetting_OptCommand
+
-- | Look up the value of a 'Setting' in @cfg/system.config@, tracking the
-- result.
setting :: Setting -> Action String
@@ -127,6 +154,28 @@ settingList key = fmap words $ lookupValueOrError configFile $ case key of
ConfLdLinkerArgs stage -> "conf-ld-linker-args-" ++ stageString stage
HsCppArgs -> "hs-cpp-args"
+-- | Look up the value of a 'SettingList' in @cfg/system.config@, tracking the
+-- result.
+settingsFileSetting :: SettingsFileSetting -> Action String
+settingsFileSetting key = lookupValueOrError configFile $ case key of
+ SettingsFileSetting_CCompilerCommand -> "settings-c-compiler-command"
+ SettingsFileSetting_HaskellCPPCommand -> "settings-haskell-cpp-command"
+ SettingsFileSetting_HaskellCPPFlags -> "settings-haskell-cpp-flags"
+ SettingsFileSetting_CCompilerFlags -> "settings-c-compiler-flags"
+ SettingsFileSetting_CCompilerLinkFlags -> "settings-c-compiler-link-flags"
+ SettingsFileSetting_CCompilerSupportsNoPie -> "settings-c-compiler-supports-no-pie"
+ SettingsFileSetting_LdCommand -> "settings-ld-command"
+ SettingsFileSetting_LdFlags -> "settings-ld-flags"
+ SettingsFileSetting_ArCommand -> "settings-ar-command"
+ SettingsFileSetting_RanlibCommand -> "settings-ranlib-command"
+ SettingsFileSetting_DllWrapCommand -> "settings-dll-wrap-command"
+ SettingsFileSetting_WindresCommand -> "settings-windres-command"
+ SettingsFileSetting_LibtoolCommand -> "settings-libtool-command"
+ SettingsFileSetting_TouchCommand -> "settings-touch-command"
+ SettingsFileSetting_ClangCommand -> "settings-clang-command"
+ SettingsFileSetting_LlcCommand -> "settings-llc-command"
+ SettingsFileSetting_OptCommand -> "settings-opt-command"
+
-- | An expression that looks up the value of a 'Setting' in @cfg/system.config@,
-- tracking the result.
getSetting :: Setting -> Expr c b String
diff --git a/hadrian/src/Rules/BinaryDist.hs b/hadrian/src/Rules/BinaryDist.hs
index 3db64ee648..c02d9787f9 100644
--- a/hadrian/src/Rules/BinaryDist.hs
+++ b/hadrian/src/Rules/BinaryDist.hs
@@ -204,7 +204,7 @@ bindistRules = do
bindistInstallFiles :: [FilePath]
bindistInstallFiles =
[ "config.sub", "config.guess", "install-sh", "mk" -/- "config.mk.in"
- , "mk" -/- "install.mk.in", "mk" -/- "project.mk", "settings.in", "README"
+ , "mk" -/- "install.mk.in", "mk" -/- "project.mk", "README"
, "INSTALL" ]
-- | This auxiliary function gives us a top-level 'Filepath' that we can 'need'
diff --git a/hadrian/src/Rules/Configure.hs b/hadrian/src/Rules/Configure.hs
index 8395472a4b..ba67df20a6 100644
--- a/hadrian/src/Rules/Configure.hs
+++ b/hadrian/src/Rules/Configure.hs
@@ -14,7 +14,7 @@ import qualified System.Info.Extra as System
-- | Files generated by running the @configure@ script.
configureResults :: [FilePath]
configureResults =
- [ configFile, "settings", configH, "compiler/ghc.cabal", "rts/rts.cabal"]
+ [ configFile, configH, "compiler/ghc.cabal", "rts/rts.cabal"]
configureRules :: Rules ()
configureRules = do
diff --git a/hadrian/src/Rules/Generate.hs b/hadrian/src/Rules/Generate.hs
index ba35e03d9d..b167cd1a00 100644
--- a/hadrian/src/Rules/Generate.hs
+++ b/hadrian/src/Rules/Generate.hs
@@ -7,6 +7,7 @@ module Rules.Generate (
import Base
import Expression
import Flavour
+import Hadrian.Oracles.TextFile (lookupValueOrError)
import Oracles.Flag
import Oracles.ModuleFiles
import Oracles.Setting
@@ -161,7 +162,7 @@ copyRules = do
prefix -/- "llvm-targets" <~ return "."
prefix -/- "llvm-passes" <~ return "."
prefix -/- "platformConstants" <~ (buildRoot <&> (-/- generatedDir))
- prefix -/- "settings" <~ return "."
+ prefix -/- "settings" <~ (buildRoot <&> (-/- generatedDir))
prefix -/- "template-hsc.h" <~ return (pkgPath hsc2hs)
prefix -/- "html//*" <~ return "utils/haddock/haddock-api/resources"
@@ -177,6 +178,7 @@ generateRules = do
priority 2.0 $ (root -/- generatedDir -/- "ghcautoconf.h") <~ generateGhcAutoconfH
priority 2.0 $ (root -/- generatedDir -/- "ghcplatform.h") <~ generateGhcPlatformH
priority 2.0 $ (root -/- generatedDir -/- "ghcversion.h") <~ generateGhcVersionH
+ priority 2.0 $ (root -/- generatedDir -/- "settings") <~ generateSettings
-- TODO: simplify, get rid of fake rts context
root -/- generatedDir ++ "//*" %> \file -> do
@@ -261,6 +263,55 @@ generateGhcPlatformH = do
++
[ "\n#endif /* __GHCPLATFORM_H__ */" ]
+generateSettings :: Expr String
+generateSettings = do
+ let flag' = flag >=> \case
+ True -> pure "YES"
+ False -> pure "NO"
+ settings <- (traverse . traverse) expr $
+ [ ("GCC extra via C opts", lookupValueOrError configFile "gcc-extra-via-c-opts")
+ , ("C compiler command", settingsFileSetting SettingsFileSetting_CCompilerCommand)
+ , ("C compiler flags", settingsFileSetting SettingsFileSetting_CCompilerFlags)
+ , ("C compiler link flags", settingsFileSetting SettingsFileSetting_CCompilerLinkFlags)
+ , ("C compiler supports -no-pie", settingsFileSetting SettingsFileSetting_CCompilerSupportsNoPie)
+ , ("Haskell CPP command", settingsFileSetting SettingsFileSetting_HaskellCPPCommand)
+ , ("Haskell CPP flags", settingsFileSetting SettingsFileSetting_HaskellCPPFlags)
+ , ("ld command", settingsFileSetting SettingsFileSetting_LdCommand)
+ , ("ld flags", settingsFileSetting SettingsFileSetting_LdFlags)
+ , ("ld supports compact unwind", lookupValueOrError configFile "ld-has-no-compact-unwind")
+ , ("ld supports build-id", lookupValueOrError configFile "ld-has-build-id")
+ , ("ld supports filelist", lookupValueOrError configFile "ld-has-filelist")
+ , ("ld is GNU ld", lookupValueOrError configFile "ld-is-gnu-ld")
+ , ("ar command", settingsFileSetting SettingsFileSetting_ArCommand)
+ , ("ar flags", lookupValueOrError configFile "ar-args")
+ , ("ar supports at file", flag' ArSupportsAtFile)
+ , ("ranlib command", settingsFileSetting SettingsFileSetting_RanlibCommand)
+ , ("touch command", settingsFileSetting SettingsFileSetting_TouchCommand)
+ , ("dllwrap command", settingsFileSetting SettingsFileSetting_DllWrapCommand)
+ , ("windres command", settingsFileSetting SettingsFileSetting_WindresCommand)
+ , ("libtool command", settingsFileSetting SettingsFileSetting_LibtoolCommand)
+ , ("cross compiling", flag' CrossCompiling)
+ , ("target os", lookupValueOrError configFile "haskell-target-os")
+ , ("target arch", lookupValueOrError configFile "haskell-target-arch")
+ , ("target word size", lookupValueOrError configFile "target-word-size")
+ , ("target has GNU nonexec stack", lookupValueOrError configFile "haskell-have-gnu-nonexec-stack")
+ , ("target has .ident directive", lookupValueOrError configFile "haskell-have-ident-directive")
+ , ("target has subsections via symbols", lookupValueOrError configFile "haskell-have-subsections-via-symbols")
+ , ("target has RTS linker", lookupValueOrError configFile "haskell-have-rts-linker")
+ , ("Unregisterised", flag' GhcUnregisterised)
+ , ("LLVM llc command", settingsFileSetting SettingsFileSetting_LlcCommand)
+ , ("LLVM opt command", settingsFileSetting SettingsFileSetting_OptCommand)
+ , ("LLVM clang command", settingsFileSetting SettingsFileSetting_ClangCommand)
+ ]
+ let showTuple (k, v) = "(" ++ show k ++ ", " ++ show v ++ ")"
+ pure $ case settings of
+ [] -> "[]"
+ s : ss -> unlines $
+ ("[" ++ showTuple s)
+ : ((\s' -> "," ++ showTuple s') <$> ss)
+ ++ ["]"]
+
+
-- | Generate @Config.hs@ files.
generateConfigHs :: Expr String
generateConfigHs = do
diff --git a/hadrian/src/Rules/SourceDist.hs b/hadrian/src/Rules/SourceDist.hs
index 6e56c666b6..e70dc5cd7b 100644
--- a/hadrian/src/Rules/SourceDist.hs
+++ b/hadrian/src/Rules/SourceDist.hs
@@ -110,4 +110,4 @@ prepareTree dest = do
, "ghc.mk"
, "install-sh"
, "packages"
- , "settings.in" ]
+ ]
diff --git a/includes/ghc.mk b/includes/ghc.mk
index 939bf19933..27b704d140 100644
--- a/includes/ghc.mk
+++ b/includes/ghc.mk
@@ -166,6 +166,52 @@ endif
endif
+# -----------------------------------------------------------------------------
+# Settings
+
+# These settings are read by GHC at runtime, so as to not cause spurious
+# rebuilds.
+
+includes_SETTINGS = includes/dist/build/settings
+
+$(includes_SETTINGS) : includes/Makefile | $$(dir $$@)/.
+ $(call removeFiles,$@)
+ @echo '[("GCC extra via C opts", "$(GccExtraViaCOpts)")' >> $@
+ @echo ',("C compiler command", "$(SettingsCCompilerCommand)")' >> $@
+ @echo ',("C compiler flags", "$(SettingsCCompilerFlags)")' >> $@
+ @echo ',("C compiler link flags", "$(SettingsCCompilerLinkFlags)")' >> $@
+ @echo ',("C compiler supports -no-pie", "$(SettingsCCompilerSupportsNoPie)")' >> $@
+ @echo ',("Haskell CPP command", "$(SettingsHaskellCPPCommand)")' >> $@
+ @echo ',("Haskell CPP flags", "$(SettingsHaskellCPPFlags)")' >> $@
+ @echo ',("ld command", "$(SettingsLdCommand)")' >> $@
+ @echo ',("ld flags", "$(SettingsLdFlags)")' >> $@
+ @echo ',("ld supports compact unwind", "$(LdHasNoCompactUnwind)")' >> $@
+ @echo ',("ld supports build-id", "$(LdHasBuildId)")' >> $@
+ @echo ',("ld supports filelist", "$(LdHasFilelist)")' >> $@
+ @echo ',("ld is GNU ld", "$(LdIsGNULd)")' >> $@
+ @echo ',("ar command", "$(SettingsArCommand)")' >> $@
+ @echo ',("ar flags", "$(ArArgs)")' >> $@
+ @echo ',("ar supports at file", "$(ArSupportsAtFile)")' >> $@
+ @echo ',("ranlib command", "$(SettingsRanlibCommand)")' >> $@
+ @echo ',("touch command", "$(SettingsTouchCommand)")' >> $@
+ @echo ',("dllwrap command", "$(SettingsDllWrapCommand)")' >> $@
+ @echo ',("windres command", "$(SettingsWindresCommand)")' >> $@
+ @echo ',("libtool command", "$(SettingsLibtoolCommand)")' >> $@
+ @echo ',("cross compiling", "$(CrossCompiling)")' >> $@
+ @echo ',("target os", "$(HaskellTargetOs)")' >> $@
+ @echo ',("target arch", "$(HaskellTargetArch)")' >> $@
+ @echo ',("target word size", "$(TargetWordSize)")' >> $@
+ @echo ',("target has GNU nonexec stack", "$(HaskellHaveGnuNonexecStack)")' >> $@
+ @echo ',("target has .ident directive", "$(HaskellHaveIdentDirective)")' >> $@
+ @echo ',("target has subsections via symbols", "$(HaskellHaveSubsectionsViaSymbols)")' >> $@
+ @echo ',("target has RTS linker", "$(HaskellHaveRTSLinker)")' >> $@
+ @echo ',("Unregisterised", "$(Unregisterised)")' >> $@
+ @echo ',("LLVM llc command", "$(SettingsLlcCommand)")' >> $@
+ @echo ',("LLVM opt command", "$(SettingsOptCommand)")' >> $@
+ @echo ',("LLVM clang command", "$(SettingsClangCommand)")' >> $@
+ @echo ']' >> $@
+
+
# ---------------------------------------------------------------------------
# Make DerivedConstants.h for the compiler
diff --git a/mk/config.mk.in b/mk/config.mk.in
index 79191af52e..6abf01816f 100644
--- a/mk/config.mk.in
+++ b/mk/config.mk.in
@@ -488,6 +488,43 @@ endif
GHC_PACKAGE_DB_FLAG = @GHC_PACKAGE_DB_FLAG@
#-----------------------------------------------------------------------------
+# Settings
+
+# We are in the process of moving the settings file from being entirely
+# generated by configure, to generated being by the build system. Many of these
+# might become redundant.
+
+GccExtraViaCOpts = @GccExtraViaCOpts@
+LdHasFilelist = @LdHasFilelist@
+ArArgs = @ArArgs@
+HaskellTargetOs = @HaskellTargetOs@
+HaskellTargetArch = @HaskellTargetArch@
+TargetWordSize = @TargetWordSize@
+HaskellHaveGnuNonexecStack = @HaskellHaveGnuNonexecStack@
+HaskellHaveIdentDirective = @HaskellHaveIdentDirective@
+HaskellHaveSubsectionsViaSymbols = @HaskellHaveSubsectionsViaSymbols@
+HaskellHaveRTSLinker = @HaskellHaveRTSLinker@
+Unregisterised = @Unregisterised@
+
+SettingsCCompilerCommand = @SettingsCCompilerCommand@
+SettingsHaskellCPPCommand = @SettingsHaskellCPPCommand@
+SettingsHaskellCPPFlags = @SettingsHaskellCPPFlags@
+SettingsCCompilerFlags = @SettingsCCompilerFlags@
+SettingsCCompilerLinkFlags = @SettingsCCompilerLinkFlags@
+SettingsCCompilerSupportsNoPie = @SettingsCCompilerSupportsNoPie@
+SettingsLdCommand = @SettingsLdCommand@
+SettingsLdFlags = @SettingsLdFlags@
+SettingsArCommand = @SettingsArCommand@
+SettingsRanlibCommand = @SettingsRanlibCommand@
+SettingsDllWrapCommand = @SettingsDllWrapCommand@
+SettingsWindresCommand = @SettingsWindresCommand@
+SettingsLibtoolCommand = @SettingsLibtoolCommand@
+SettingsTouchCommand = @SettingsTouchCommand@
+SettingsClangCommand = @SettingsClangCommand@
+SettingsLlcCommand = @SettingsLlcCommand@
+SettingsOptCommand = @SettingsOptCommand@
+
+#-----------------------------------------------------------------------------
# C compiler
#
# NB. Don't override $(CC) using build.mk, re-configure using