@echo '#error Unknown target arch' >> $@
@echo '#endif' >> $@
@echo >> $@
+# Sync this with checkOS in configure.ac
+ @echo 'cTargetOS :: OS' >> $@
+ @echo '#if linux_TARGET_OS' >> $@
+ @echo 'cTargetOS = Linux' >> $@
+ @echo '#elif freebsd_TARGET_OS' >> $@
+ @echo 'cTargetOS = FreeBSD' >> $@
+ @echo '#elif netbsd_TARGET_OS' >> $@
+ @echo 'cTargetOS = NetBSD' >> $@
+ @echo '#elif openbsd_TARGET_OS' >> $@
+ @echo 'cTargetOS = OpenBSD' >> $@
+ @echo '#elif dragonfly_TARGET_OS' >> $@
+ @echo 'cTargetOS = OtherOS "dragonfly"' >> $@
+ @echo '#elif osf1_TARGET_OS' >> $@
+ @echo 'cTargetOS = OtherOS "osf"' >> $@
+ @echo '#elif osf3_TARGET_OS' >> $@
+ @echo 'cTargetOS = OtherOS "osf"' >> $@
+ @echo '#elif hpux_TARGET_OS' >> $@
+ @echo 'cTargetOS = HPUX' >> $@
+ @echo '#elif linuxaout_TARGET_OS' >> $@
+ @echo 'cTargetOS = Linux' >> $@
+ @echo '#elif kfreebsdgnu_TARGET_OS' >> $@
+ @echo 'cTargetOS = OtherOS "kfreebsdgnu"' >> $@
+ @echo '#elif freebsd2_TARGET_OS' >> $@
+ @echo 'cTargetOS = FreeBSD' >> $@
+ @echo '#elif solaris2_TARGET_OS' >> $@
+ @echo 'cTargetOS = Solaris' >> $@
+ @echo '#elif cygwin32_TARGET_OS' >> $@
+ @echo 'cTargetOS = Windows' >> $@
+ @echo '#elif mingw32_TARGET_OS' >> $@
+ @echo 'cTargetOS = Windows' >> $@
+ @echo '#elif darwin_TARGET_OS' >> $@
+ @echo 'cTargetOS = OSX' >> $@
+ @echo '#elif gnu_TARGET_OS' >> $@
+ @echo 'cTargetOS = OtherOS "gnu"' >> $@
+ @echo '#elif nextstep2_TARGET_OS' >> $@
+ @echo 'cTargetOS = OtherOS "nextstep"' >> $@
+ @echo '#elif nextstep3_TARGET_OS' >> $@
+ @echo 'cTargetOS = OtherOS "nextstep"' >> $@
+ @echo '#elif sunos4_TARGET_OS' >> $@
+ @echo 'cTargetOS = Solaris' >> $@
+ @echo '#elif ultrix_TARGET_OS' >> $@
+ @echo 'cTargetOS = OtherOS "ultrix"' >> $@
+ @echo '#elif irix_TARGET_OS' >> $@
+ @echo 'cTargetOS = IRIX' >> $@
+ @echo '#elif aix_TARGET_OS' >> $@
+ @echo 'cTargetOS = AIX' >> $@
+ @echo '#elif haiku_TARGET_OS' >> $@
+ @echo 'cTargetOS = OtherOS "haiku"' >> $@
+ @echo '#else' >> $@
+ @echo '#error Unknown target OS' >> $@
+ @echo '#endif' >> $@
+ @echo >> $@
@echo 'cProjectName :: String' >> $@
@echo 'cProjectName = "$(ProjectName)"' >> $@
@echo 'cProjectVersion :: String' >> $@
import Data.Map (Map)
import qualified Data.Map as Map
-- import Data.Maybe
+import Distribution.System
import System.FilePath
import System.IO ( stderr, hPutChar )
-- See CoreMonad.FloatOutSwitches
#ifndef OMIT_NATIVE_CODEGEN
- targetPlatform :: Platform, -- ^ The platform we're compiling for. Used by the NCG.
+ targetPlatform :: Platform.Platform, -- ^ The platform we're compiling for. Used by the NCG.
#endif
cmdlineHcIncludes :: [String], -- ^ @\-\#includes@
importPaths :: [FilePath],
| HscNothing -- ^ Don't generate any code. See notes above.
deriving (Eq, Show)
+showHscTargetFlag :: HscTarget -> String
+showHscTargetFlag HscC = "-fvia-c"
+showHscTargetFlag HscAsm = "-fasm"
+showHscTargetFlag HscLlvm = "-fllvm"
+showHscTargetFlag HscJava = panic "No flag for HscJava"
+showHscTargetFlag HscInterpreted = "-fbyte-code"
+showHscTargetFlag HscNothing = "-fno-code"
+
-- | Will this target result in an object file on the disk?
isObjectTarget :: HscTarget -> Bool
isObjectTarget HscC = True
when (not (null errs)) $ ghcError $ errorsToGhcException errs
let (pic_warns, dflags2)
-#if !(x86_64_TARGET_ARCH && linux_TARGET_OS)
- | (not opt_Static || opt_PIC) && hscTarget dflags1 == HscLlvm
+ | not (cTargetArch == X86_64 && cTargetOS == Linux) &&
+ (not opt_Static || opt_PIC) &&
+ hscTarget dflags1 == HscLlvm
= ([L noSrcSpan $ "Warning: -fllvm is incompatible with -fPIC and -"
- ++ "dynamic on this platform;\n ignoring -fllvm"],
- dflags1{ hscTarget = HscAsm })
-#endif
+ ++ "dynamic on this platform;\n"
+ ++ " using " ++ showHscTargetFlag defaultObjectTarget ++ " instead"],
+ dflags1{ hscTarget = defaultObjectTarget })
| otherwise = ([], dflags1)
return (dflags2, leftover, pic_warns ++ warns)