compileStub :: GhcMonad m => HscEnv -> Module -> ModLocation
-> m FilePath
compileStub hsc_env mod location = do
- let (o_base, o_ext) = splitExtension (ml_obj_file location)
- stub_o = (o_base ++ "_stub") <.> o_ext
-
-- compile the _stub.c file w/ gcc
- let (stub_c,_,_) = mkStubPaths (hsc_dflags hsc_env) (moduleName mod) location
+ let (stub_c,_,stub_o) = mkStubPaths (hsc_dflags hsc_env)
+ (moduleName mod) location
+
runPipeline StopLn hsc_env (stub_c,Nothing) Nothing
(SpecificFile stub_o) Nothing{-no ModLocation-}
stub_basename = stub_basename0 ++ "_stub"
- -- this is the filename we're going to use when
- -- \#including the stub_h file from the .hc file.
- -- Without -stubdir, we just #include the basename
- -- (eg. for a module A.B, we #include "B_stub.h"),
- -- relying on the fact that we add an implicit -I flag
- -- for the directory in which the source file resides
- -- (see DriverPipeline.hs). With -stubdir, we
- -- \#include "A/B.h", assuming that the user has added
- -- -I<dir> along with -stubdir <dir>.
- include_basename
- | Just _ <- stubdir = mod_basename
- | otherwise = takeFileName src_basename
+ obj = ml_obj_file location
+ osuf = objectSuf dflags
+ stub_obj_base = dropTail (length osuf + 1) obj ++ "_stub"
+ -- NB. not takeFileName, see #3093
in
(stub_basename <.> "c",
stub_basename <.> "h",
- (include_basename ++ "_stub") <.> "h")
- -- the _stub.o filename is derived from the ml_obj_file.
+ stub_obj_base <.> objectSuf dflags)
-- -----------------------------------------------------------------------------
-- findLinkable isn't related to the other stuff in here,