on master help sign in
Merge pull request #1701 from Melvar/weed-system
e71676eEdwin Brady
main/Main.hs+2−2
@@ -81,7 +81,7 @@ showver = do putStrLn $ "Idris version " ++ ver
81
81
82showLibs :: IO b
82showLibs :: IO b
83showLibs = do libFlags <- getLibFlags
83showLibs = do libFlags <- getLibFlags
84− putStrLn libFlags
84+ putStrLn $ unwords libFlags
85 exitWith ExitSuccess
85 exitWith ExitSuccess
86
86
87showLibdir :: IO b
87showLibdir :: IO b
@@ -91,5 +91,5 @@ showLibdir = do dir <- getIdrisLibDir
91
91
92showIncs :: IO b
92showIncs :: IO b
93showIncs = do incFlags <- getIncFlags
93showIncs = do incFlags <- getIncFlags
94− putStrLn incFlags
94+ putStrLn $ unwords incFlags
95 exitWith ExitSuccess
95 exitWith ExitSuccess
src/IRTS/CodegenC.hs+24−27
@@ -24,24 +24,22 @@ codegenC ci = codegenC' (simpleDecls ci)
24 (outputFile ci)
24 (outputFile ci)
25 (outputType ci)
25 (outputType ci)
26 (includes ci)
26 (includes ci)
27− (concatMap mkObj (compileObjs ci))
27+ (compileObjs ci)
28− (concatMap mkLib (compileLibs ci) ++
28+ (map mkLib (compileLibs ci) ++
29− concatMap incdir (importDirs ci))
29+ map incdir (importDirs ci))
30− (concatMap mkFlag (compilerFlags ci))
30+ (compilerFlags ci)
31 (debugLevel ci)
31 (debugLevel ci)
32
32
33− where mkObj f = f ++ " "
34− mkLib l = "-l" ++ l ++ " "
33+ where mkLib l = "-l" ++ l
35− mkFlag l = l ++ " "
36− incdir i = "-I" ++ i ++ " "
34+ incdir i = "-I" ++ i
37
35
38codegenC' :: [(Name, SDecl)] ->
36codegenC' :: [(Name, SDecl)] ->
39 String -> -- output file name
37 String -> -- output file name
40 OutputType -> -- generate executable if True, only .o if False
38 OutputType -> -- generate executable if True, only .o if False
41 [FilePath] -> -- include files
39 [FilePath] -> -- include files
42− String -> -- extra object files
40+ [String] -> -- extra object files
43− String -> -- extra compiler flags (libraries)
41+ [String] -> -- extra compiler flags (libraries)
44− String -> -- extra compiler flags (anything)
42+ [String] -> -- extra compiler flags (anything)
45 DbgLevel ->
43 DbgLevel ->
46 IO ()
44 IO ()
47codegenC' defs out exec incs objs libs flags dbg
45codegenC' defs out exec incs objs libs flags dbg
@@ -64,23 +62,22 @@ codegenC' defs out exec incs objs libs flags dbg
64 comp <- getCC
62 comp <- getCC
65 libFlags <- getLibFlags
63 libFlags <- getLibFlags
66 incFlags <- getIncFlags
64 incFlags <- getIncFlags
67− let gcc = comp ++ " " ++
68− gccDbg dbg ++ " " ++
65+ let args = [gccDbg dbg] ++
69− gccFlags ++
66+ gccFlags ++
70− -- # Any flags defined here which alter the RTS API must also be added to config.mk
67+ -- # Any flags defined here which alter the RTS API must also be added to config.mk
71− " -DHAS_PTHREAD -DIDRIS_ENABLE_STATS" ++
68+ ["-DHAS_PTHREAD", "-DIDRIS_ENABLE_STATS",
72− " -I. " ++ objs ++ " -x c " ++
69+ "-I."] ++ objs ++ ["-x", "c"] ++
73− (if (exec == Executable) then "" else " -c ") ++
70+ (if (exec == Executable) then [] else ["-c"]) ++
74− " " ++ tmpn ++
71+ [tmpn] ++
75− " " ++ libFlags ++
72+ libFlags ++
76− " " ++ incFlags ++
73+ incFlags ++
77− " " ++ libs ++
74+ libs ++
78− " " ++ flags ++
75+ flags ++
79− " -o " ++ out
76+ ["-o", out]
80-- putStrLn gcc
77-- putStrLn gcc
81− exit <- system gcc
78+ exit <- rawSystem comp args
82 when (exit /= ExitSuccess) $
79 when (exit /= ExitSuccess) $
83− putStrLn ("FAILURE: " ++ gcc)
80+ putStrLn ("FAILURE: " ++ show comp ++ " " ++ show args)
84
81
85headers xs =
82headers xs =
86 concatMap
83 concatMap
@@ -92,7 +89,7 @@ debug _ = ""
92
89
93-- We're using signed integers now. Make sure we get consistent semantics
90-- We're using signed integers now. Make sure we get consistent semantics
94-- out of them from gcc. See e.g. http://thiemonagel.de/2010/01/signed-integer-overflow/
91-- out of them from gcc. See e.g. http://thiemonagel.de/2010/01/signed-integer-overflow/
95−gccFlags = " -fwrapv -fno-strict-overflow"
92+gccFlags = ["-fwrapv", "-fno-strict-overflow"]
96
93
97gccDbg DEBUG = "-g"
94gccDbg DEBUG = "-g"
98gccDbg TRACE = "-O2"
95gccDbg TRACE = "-O2"
src/IRTS/Compiler.hs+4−4
@@ -121,11 +121,11 @@ generate codegen mainmod ir
121 -- Built-in code generators (FIXME: lift these out!)
121 -- Built-in code generators (FIXME: lift these out!)
122 Via "c" -> codegenC ir
122 Via "c" -> codegenC ir
123 -- Any external code generator
123 -- Any external code generator
124− Via cg -> do let cmd = "idris-" ++ cg ++ " " ++ mainmod ++
124+ Via cg -> do let cmd = "idris-" ++ cg
125− " -o " ++ outputFile ir
125+ args = [mainmod, "-o", outputFile ir]
126− exit <- system cmd
126+ exit <- rawSystem cmd args
127 when (exit /= ExitSuccess) $
127 when (exit /= ExitSuccess) $
128− putStrLn ("FAILURE: " ++ show cmd)
128+ putStrLn ("FAILURE: " ++ show cmd ++ " " ++ show args)
129 Bytecode -> dumpBC (simpleDecls ir) (outputFile ir)
129 Bytecode -> dumpBC (simpleDecls ir) (outputFile ir)
130
130
131irMain :: TT Name -> Idris LDecl
131irMain :: TT Name -> Idris LDecl
src/IRTS/System.hs+9−9
@@ -38,31 +38,31 @@ getTargetDir :: IO String
38getTargetDir = environment "TARGET" >>= maybe getDataDir return
38getTargetDir = environment "TARGET" >>= maybe getDataDir return
39
39
40#if defined(FREEBSD) || defined(DRAGONFLY)
40#if defined(FREEBSD) || defined(DRAGONFLY)
41−extraLib = " -L/usr/local/lib"
41+extraLib = ["-L/usr/local/lib"]
42#else
42#else
43−extraLib = ""
43+extraLib = []
44#endif
44#endif
45
45
46#ifdef IDRIS_GMP
46#ifdef IDRIS_GMP
47−gmpLib = " -lgmp"
47+gmpLib = ["-lgmp"]
48#else
48#else
49−gmpLib = ""
49+gmpLib = []
50#endif
50#endif
51
51
52getLibFlags = do dir <- getDataDir
52getLibFlags = do dir <- getDataDir
53− return $ "-L" ++ (dir </> "rts") ++
53+ return $ ["-L" ++ (dir </> "rts"),
54− " -lidris_rts" ++ extraLib ++ gmpLib ++ " -lpthread"
54+ "-lidris_rts"] ++ extraLib ++ gmpLib ++ ["-lpthread"]
55
55
56getIdrisLibDir = do dir <- getDataDir
56getIdrisLibDir = do dir <- getDataDir
57 return $ addTrailingPathSeparator dir
57 return $ addTrailingPathSeparator dir
58
58
59#if defined(FREEBSD) || defined(DRAGONFLY)
59#if defined(FREEBSD) || defined(DRAGONFLY)
60−extraInclude = " -I/usr/local/include"
60+extraInclude = ["-I/usr/local/include"]
61#else
61#else
62−extraInclude = ""
62+extraInclude = []
63#endif
63#endif
64getIncFlags = do dir <- getDataDir
64getIncFlags = do dir <- getDataDir
65− return $ "-I" ++ dir </> "rts" ++ extraInclude
65+ return $ ("-I" ++ dir </> "rts") : extraInclude
66
66
67getExecutablePom = do dir <- getDataDir
67getExecutablePom = do dir <- getDataDir
68 return $ dir </> "java" </> "executable_pom.xml"
68 return $ dir </> "java" </> "executable_pom.xml"
src/Idris/REPL.hs+5−5
@@ -669,10 +669,10 @@ edit f orig
669 env <- runIO $ getEnvironment
669 env <- runIO $ getEnvironment
670 let editor = getEditor env
670 let editor = getEditor env
671 let line = case errSpan i of
671 let line = case errSpan i of
672− Just l -> " +" ++ show (fst (fc_start l)) ++ " "
672+ Just l -> ['+' : show (fst (fc_start l))]
673− Nothing -> " "
673+ Nothing -> []
674− let cmd = editor ++ line ++ fixName f
674+ let args = line ++ [fixName f]
675− runIO $ system cmd
675+ runIO $ rawSystem editor args
676 clearErr
676 clearErr
677 putIState $ orig { idris_options = idris_options i
677 putIState $ orig { idris_options = idris_options i
678 , idris_colourTheme = idris_colourTheme i
678 , idris_colourTheme = idris_colourTheme i
@@ -1069,7 +1069,7 @@ process fn Execute
1069 ir <- compile t tmpn m
1069 ir <- compile t tmpn m
1070 runIO $ generate t (head (idris_imported ist)) ir
1070 runIO $ generate t (head (idris_imported ist)) ir
1071 case idris_outputmode ist of
1071 case idris_outputmode ist of
1072− RawOutput h -> do runIO $ system tmpn
1072+ RawOutput h -> do runIO $ rawSystem tmpn []
1073 return ()
1073 return ()
1074 IdeSlave n h -> runIO . hPutStrLn h $
1074 IdeSlave n h -> runIO . hPutStrLn h $
1075 IdeSlave.convSExp "run-program" tmpn n)
1075 IdeSlave.convSExp "run-program" tmpn n)
src/Pkg/Package.hs+4−4
@@ -184,7 +184,7 @@ testPkg fp
184 (tmpn', tmph') <- tempfile
184 (tmpn', tmph') <- tempfile
185 hClose tmph'
185 hClose tmph'
186 m_ist <- idris (Filename tmpn : NoREPL : Verbose : Output tmpn' : idris_opts pkgdesc)
186 m_ist <- idris (Filename tmpn : NoREPL : Verbose : Output tmpn' : idris_opts pkgdesc)
187− system tmpn'
187+ rawSystem tmpn' []
188 setCurrentDirectory dir
188 setCurrentDirectory dir
189 case m_ist of
189 case m_ist of
190 Nothing -> exitWith (ExitFailure 1)
190 Nothing -> exitWith (ExitFailure 1)
@@ -224,7 +224,7 @@ testLib warn p f
224 (tmpf, tmph) <- tempfile
224 (tmpf, tmph) <- tempfile
225 hClose tmph
225 hClose tmph
226 let libtest = d </> "rts" </> "libtest.c"
226 let libtest = d </> "rts" </> "libtest.c"
227− e <- system $ gcc ++ " " ++ libtest ++ " -l" ++ f ++ " -o " ++ tmpf
227+ e <- rawSystem gcc [libtest, "-l" ++ f, "-o", tmpf]
228 case e of
228 case e of
229 ExitSuccess -> return True
229 ExitSuccess -> return True
230 _ -> do if warn
230 _ -> do if warn
@@ -269,13 +269,13 @@ mkDirCmd = "mkdir -p "
269-- | Invoke a Makefile's default target.
269-- | Invoke a Makefile's default target.
270make :: Maybe String -> IO ()
270make :: Maybe String -> IO ()
271make Nothing = return ()
271make Nothing = return ()
272−make (Just s) = do system $ "make -f " ++ s
272+make (Just s) = do rawSystem "make" ["-f", s]
273 return ()
273 return ()
274
274
275-- | Invoke a Makefile's clean target.
275-- | Invoke a Makefile's clean target.
276clean :: Maybe String -> IO ()
276clean :: Maybe String -> IO ()
277clean Nothing = return ()
277clean Nothing = return ()
278−clean (Just s) = do system $ "make -f " ++ s ++ " clean"
278+clean (Just s) = do rawSystem "make" ["-f", s, "clean"]
279 return ()
279 return ()
280
280
281-- --------------------------------------------------------------------- [ EOF ]
281-- --------------------------------------------------------------------- [ EOF ]
test/basic001/reg005.idr+3−1
@@ -1,6 +1,8 @@
1module Main
1module Main
2
2
3−%flag C "-g3 -ggdb -O0"
3+%flag C "-g3"
4+%flag C "-ggdb"
5+%flag C "-O0"
4
6
5rep : (n : Nat) -> Char -> Vect n Char
7rep : (n : Nat) -> Char -> Vect n Char
6rep Z x = []
8rep Z x = []