summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHerbert Valerio Riedel <hvr@gnu.org>2015-11-19 12:54:54 +0100
committerBen Gamari <ben@smart-cactus.org>2015-11-19 13:24:33 +0100
commit65d7ff06573f8c55ec98b43059f7abffae79d8c3 (patch)
tree03081a264ec491d1127845186193515554a87195
parent3e2a4eefbed7002437c3f3ee340832a42f0b37f8 (diff)
downloadhaskell-65d7ff06573f8c55ec98b43059f7abffae79d8c3.tar.gz
Make `derivedConstants` more crosscompile-friendly
`derivedConstants` currently uses `System.Info.os` for decisions (which doesn't necessarily reflect the build-target), as well as hardcoding "/usr/bin/objdump" for openbsd. This patch auto-detects `objdump` similiar to how `nm` is detected via Autoconf as well as passing the target-os into `derivedConstants` via commandline. Reviewers: austin, kgardas, erikd, bgamari Reviewed By: kgardas, erikd, bgamari Subscribers: kgardas, thomie, erikd Differential Revision: https://phabricator.haskell.org/D1499
-rw-r--r--configure.ac8
-rw-r--r--includes/ghc.mk4
-rw-r--r--utils/deriveConstants/Main.hs40
3 files changed, 39 insertions, 13 deletions
diff --git a/configure.ac b/configure.ac
index 1e43896727..99fd892d89 100644
--- a/configure.ac
+++ b/configure.ac
@@ -478,6 +478,12 @@ FP_ARG_WITH_PATH_GNU_PROG([NM], [nm], [nm])
NmCmd="$NM"
AC_SUBST([NmCmd])
+dnl ** Which objdump to use?
+dnl --------------------------------------------------------------
+FP_ARG_WITH_PATH_GNU_PROG_OPTIONAL([OBJDUMP], [objdump], [objdump])
+ObjdumpCmd="$OBJDUMP"
+AC_SUBST([ObjdumpCmd])
+
dnl ** Which ar to use?
dnl --------------------------------------------------------------
FP_ARG_WITH_PATH_GNU_PROG([AR], [ar], [ar])
@@ -1152,6 +1158,8 @@ echo ["\
hs-cpp : $HaskellCPPCmd
hs-cpp-flags : $HaskellCPPArgs
ld : $LdCmd
+ nm : $NmCmd
+ objdump : $ObjdumpCmd
Happy : $HappyCmd ($HappyVersion)
Alex : $AlexCmd ($AlexVersion)
Perl : $PerlCmd
diff --git a/includes/ghc.mk b/includes/ghc.mk
index 06f4912cf4..e87a4874cf 100644
--- a/includes/ghc.mk
+++ b/includes/ghc.mk
@@ -187,6 +187,10 @@ INSTALL_LIBS += $(includes_GHCCONSTANTS_HASKELL_VALUE)
DERIVE_CONSTANTS_FLAGS += --gcc-program "$(WhatGccIsCalled)"
DERIVE_CONSTANTS_FLAGS += $(addprefix --gcc-flag$(space),$(includes_CC_OPTS) -fcommon)
DERIVE_CONSTANTS_FLAGS += --nm-program "$(NM)"
+ifneq "$(OBJDUMP)" ""
+DERIVE_CONSTANTS_FLAGS += --objdump-program "$(OBJDUMP)"
+endif
+DERIVE_CONSTANTS_FLAGS += --target-os "$(TargetOS_CPP)"
ifneq "$(BINDIST)" "YES"
$(includes_DERIVEDCONSTANTS): $$(includes_H_CONFIG) $$(includes_H_PLATFORM) $$(includes_H_VERSION) $$(includes_H_FILES) $$(rts_H_FILES)
diff --git a/utils/deriveConstants/Main.hs b/utils/deriveConstants/Main.hs
index 00a9c1a4ed..832d4bcab0 100644
--- a/utils/deriveConstants/Main.hs
+++ b/utils/deriveConstants/Main.hs
@@ -37,7 +37,6 @@ import System.Environment (getArgs)
import System.Exit (ExitCode(ExitSuccess), exitFailure)
import System.FilePath ((</>))
import System.IO (stderr, hPutStrLn)
-import System.Info (os)
import System.Process (showCommandForUser, readProcess, rawSystem)
main :: IO ()
@@ -47,6 +46,11 @@ main = do opts <- parseArgs
Nothing -> die ("No " ++ descr ++ " given")
mode <- getOption "mode" o_mode
fn <- getOption "output filename" o_outputFilename
+ os <- getOption "target os" o_targetOS
+
+ let haskellWanteds = [ what | (wh, what) <- wanteds os
+ , wh `elem` [Haskell, Both] ]
+
case mode of
Gen_Haskell_Type -> writeHaskellType fn haskellWanteds
Gen_Haskell_Wrappers -> writeHaskellWrappers fn haskellWanteds
@@ -57,7 +61,8 @@ main = do opts <- parseArgs
nmProg <- getOption "nm program" o_nmProg
let verbose = o_verbose opts
gccFlags = o_gccFlags opts
- rs <- getWanted verbose tmpdir gccProg gccFlags nmProg
+ rs <- getWanted verbose os tmpdir gccProg gccFlags nmProg
+ (o_objdumpProg opts)
let haskellRs = [ what
| (wh, what) <- rs
, wh `elem` [Haskell, Both] ]
@@ -67,8 +72,6 @@ main = do opts <- parseArgs
case cm of
ComputeHaskell -> writeHaskellValue fn haskellRs
ComputeHeader -> writeHeader fn cRs
- where haskellWanteds = [ what | (wh, what) <- wanteds,
- wh `elem` [Haskell, Both] ]
data Options = Options {
o_verbose :: Bool,
@@ -77,7 +80,9 @@ data Options = Options {
o_outputFilename :: Maybe FilePath,
o_gccProg :: Maybe FilePath,
o_gccFlags :: [String],
- o_nmProg :: Maybe FilePath
+ o_nmProg :: Maybe FilePath,
+ o_objdumpProg :: Maybe FilePath,
+ o_targetOS :: Maybe String
}
parseArgs :: IO Options
@@ -91,7 +96,9 @@ parseArgs = do args <- getArgs
o_outputFilename = Nothing,
o_gccProg = Nothing,
o_gccFlags = [],
- o_nmProg = Nothing
+ o_nmProg = Nothing,
+ o_objdumpProg = Nothing,
+ o_targetOS = Nothing
}
f opts [] = return opts
f opts ("-v" : args')
@@ -116,6 +123,10 @@ parseArgs = do args <- getArgs
= f (opts {o_gccFlags = flag : o_gccFlags opts}) args'
f opts ("--nm-program" : prog : args')
= f (opts {o_nmProg = Just prog}) args'
+ f opts ("--objdump-program" : prog : args')
+ = f (opts {o_objdumpProg = Just prog}) args'
+ f opts ("--target-os" : os : args')
+ = f (opts {o_targetOS = Just os}) args'
f _ (flag : _) = die ("Unrecognised flag: " ++ show flag)
data Mode = Gen_Haskell_Type
@@ -283,8 +294,8 @@ haskellise :: Name -> Name
haskellise (c : cs) = toLower c : cs
haskellise "" = ""
-wanteds :: Wanteds
-wanteds = concat
+wanteds :: String -> Wanteds
+wanteds os = concat
[-- Closure header sizes.
constantWord Both "STD_HDR_SIZE"
-- grrr.. PROFILING is on so we need to
@@ -654,21 +665,22 @@ wanteds = concat
,constantNatural Haskell "ILDV_STATE_USE" "LDV_STATE_USE"
]
-getWanted :: Bool -> FilePath -> FilePath -> [String] -> FilePath -> IO Results
-getWanted verbose tmpdir gccProgram gccFlags nmProgram
- = do let cStuff = unlines (headers ++ concatMap (doWanted . snd) wanteds)
+getWanted :: Bool -> String -> FilePath -> FilePath -> [String] -> FilePath -> Maybe FilePath
+ -> IO Results
+getWanted verbose os tmpdir gccProgram gccFlags nmProgram mobjdumpProgram
+ = do let cStuff = unlines (headers ++ concatMap (doWanted . snd) (wanteds os))
cFile = tmpdir </> "tmp.c"
oFile = tmpdir </> "tmp.o"
writeFile cFile cStuff
execute verbose gccProgram (gccFlags ++ ["-c", cFile, "-o", oFile])
xs <- case os of
- "openbsd" -> readProcess "/usr/bin/objdump" ["--syms", oFile] ""
+ "openbsd" -> readProcess objdumpProgam ["--syms", oFile] ""
_ -> readProcess nmProgram ["-P", oFile] ""
let ls = lines xs
ms = map parseNmLine ls
m = Map.fromList $ catMaybes ms
- rs <- mapM (lookupResult m) wanteds
+ rs <- mapM (lookupResult m) (wanteds os)
return rs
where headers = ["#define IN_STG_CODE 0",
"",
@@ -698,6 +710,8 @@ getWanted verbose tmpdir gccProgram gccFlags nmProgram
"#pragma GCC poison sizeof"
]
+ objdumpProgam = maybe (error "no objdump program given") id mobjdumpProgram
+
prefix = "derivedConstant"
mkFullName name = prefix ++ name