Fix #8641, creating directories when we have stubs.
authorEdward Z. Yang <ezyang@cs.stanford.edu>
Fri, 11 Apr 2014 01:28:11 +0000 (18:28 -0700)
committerEdward Z. Yang <ezyang@cs.stanford.edu>
Fri, 11 Apr 2014 01:28:11 +0000 (18:28 -0700)
Signed-off-by: Edward Z. Yang <ezyang@cs.stanford.edu>
compiler/main/DriverPipeline.hs
testsuite/tests/driver/B042stub/C.hs [new file with mode: 0644]
testsuite/tests/driver/Makefile
testsuite/tests/driver/all.T

index 2c71967..2816c94 100644 (file)
@@ -1259,6 +1259,7 @@ runPhase (RealPhase SplitAs) _input_fn dflags
             osuf = objectSuf dflags
             split_odir  = base_o ++ "_" ++ osuf ++ "_split"
 
+        -- this also creates the hierarchy
         liftIO $ createDirectoryIfMissing True split_odir
 
         -- remove M_split/ *.o, because we're going to archive M_split/ *.o
@@ -1469,6 +1470,7 @@ runPhase (RealPhase MergeStub) input_fn dflags
  = do
      PipeState{maybe_stub_o} <- getPipeState
      output_fn <- phaseOutputFilename StopLn
+     liftIO $ createDirectoryIfMissing True (takeDirectory output_fn)
      case maybe_stub_o of
        Nothing ->
          panic "runPhase(MergeStub): no stub"
diff --git a/testsuite/tests/driver/B042stub/C.hs b/testsuite/tests/driver/B042stub/C.hs
new file mode 100644 (file)
index 0000000..73f069c
--- /dev/null
@@ -0,0 +1,6 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+module B042stub.C where
+
+foreign export ccall foo :: IO ()
+foo :: IO ()
+foo = return ()
index 7673713..3603bb6 100644 (file)
@@ -222,6 +222,14 @@ test042:
        "$(TEST_HC)" $(TEST_HC_OPTS_NO_RECOMP) -v0 --make B042/C.hs -odir obj042
        test -f obj042/B042/C$(OBJSUFFIX)
 
+# test -odir with stubs
+test042stub:
+       $(RM) -rf obj042stub
+       mkdir obj042stub
+       $(RM) B042stub/C.hi
+       "$(TEST_HC)" $(TEST_HC_OPTS_NO_RECOMP) -v0 --make B042stub/C.hs -odir obj042stub
+       test -f obj042stub/B042stub/C$(OBJSUFFIX)
+
 # test -hidir
 test043:
        $(RM) -f B043/C$(OBJSUFFIX)
index aa4bc9b..ed0ce0f 100644 (file)
@@ -142,6 +142,11 @@ test('driver042',
      run_command,
      ['$MAKE -s --no-print-directory test042'])
 
+test('driver042stub',
+     extra_clean(['B042stub/C.hi', 'obj042stub/B042stub/C.o', 'obj042stub/B042stub/', 'obj042stub/']),
+     run_command,
+     ['$MAKE -s --no-print-directory test042stub'])
+
 test('driver043',
      extra_clean(['B043/C.hi', 'B043/C.o',
                   'hi043/B043/C.hi', 'hi043/B043', 'hi043']),