summaryrefslogtreecommitdiff
path: root/compiler/main
diff options
context:
space:
mode:
authorZejun Wu <watashi@fb.com>2019-06-04 15:25:10 -0700
committerMarge Bot <ben+marge-bot@smart-cactus.org>2019-06-07 10:27:34 -0400
commitcfd3e0f1cfd16c8f35cae139d2a871a32eb4d2e1 (patch)
treec77e9244a3d894d72277f7d0c65f85b861b2390a /compiler/main
parent13b3d45d308108da2d92b3c06b5489f41703e623 (diff)
downloadhaskell-cfd3e0f1cfd16c8f35cae139d2a871a32eb4d2e1.tar.gz
Pass preprocessor options to C compiler when building foreign C files (#16737)
Diffstat (limited to 'compiler/main')
-rw-r--r--compiler/main/DriverPipeline.hs16
1 files changed, 12 insertions, 4 deletions
diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs
index 59eb10ffd0..ffc11980e2 100644
--- a/compiler/main/DriverPipeline.hs
+++ b/compiler/main/DriverPipeline.hs
@@ -1190,9 +1190,6 @@ runPhase (RealPhase Cmm) input_fn dflags
-----------------------------------------------------------------------------
-- Cc phase
--- we don't support preprocessing .c files (with -E) now. Doing so introduces
--- way too many hacks, and I can't say I've ever used it anyway.
-
runPhase (RealPhase cc_phase) input_fn dflags
| any (cc_phase `eqPhase`) [Cc, Ccxx, HCc, Cobjc, Cobjcxx]
= do
@@ -1214,6 +1211,16 @@ runPhase (RealPhase cc_phase) input_fn dflags
(includePathsQuote cmdline_include_paths)
let include_paths = include_paths_quote ++ include_paths_global
+ -- pass -D or -optP to preprocessor when compiling foreign C files
+ -- (#16737). Doing it in this way is simpler and also enable the C
+ -- compiler to performs preprocessing and parsing in a single pass,
+ -- but it may introduce inconsistency if a different pgm_P is specified.
+ let more_preprocessor_opts = concat
+ [ ["-Xpreprocessor", i]
+ | not hcc
+ , i <- getOpts dflags opt_P
+ ]
+
let gcc_extra_viac_flags = extraGccViaCFlags dflags
let pic_c_flags = picCCOpts dflags
@@ -1223,7 +1230,7 @@ runPhase (RealPhase cc_phase) input_fn dflags
-- hc code doesn't not #include any header files anyway, so these
-- options aren't necessary.
pkg_extra_cc_opts <- liftIO $
- if cc_phase `eqPhase` HCc
+ if hcc
then return []
else getPackageExtraCcOpts dflags pkgs
@@ -1305,6 +1312,7 @@ runPhase (RealPhase cc_phase) input_fn dflags
++ [ "-include", ghcVersionH ]
++ framework_paths
++ include_paths
+ ++ more_preprocessor_opts
++ pkg_extra_cc_opts
))