0 | module Compiler.RefC.CC
2 | import Core.Context.Log
4 | import Core.Directory
15 | = do Nothing <- idrisGetEnv "IDRIS2_CC"
16 | | Just cc => pure cc
17 | Nothing <- idrisGetEnv "CC"
18 | | Just cc => pure cc
21 | findCFLAGS : IO String
23 | = do Nothing <- idrisGetEnv "IDRIS2_CFLAGS"
24 | | Just cflags => pure cflags
25 | Nothing <- idrisGetEnv "CFLAGS"
26 | | Just cflags => pure cflags
29 | findCPPFLAGS : IO String
31 | = do Nothing <- idrisGetEnv "IDRIS2_CPPFLAGS"
32 | | Just cppflags => pure cppflags
33 | Nothing <- idrisGetEnv "CPPFLAGS"
34 | | Just cppflags => pure cppflags
37 | findLDFLAGS : IO String
39 | = do Nothing <- idrisGetEnv "IDRIS2_LDFLAGS"
40 | | Just ldflags => pure ldflags
41 | Nothing <- idrisGetEnv "LDFLAGS"
42 | | Just ldflags => pure ldflags
45 | findLDLIBS : IO String
47 | = do Nothing <- idrisGetEnv "IDRIS2_LDLIBS"
48 | | Just ldlibs => pure ldlibs
49 | Nothing <- idrisGetEnv "LDLIBS"
50 | | Just ldlibs => pure ldlibs
53 | clibdirs : List String -> List String
54 | clibdirs ds = map (\d => "-L" ++ d) ds
60 | compileCObjectFile : {auto c : Ref Ctxt Defs}
61 | -> {default False asLibrary : Bool}
62 | -> (sourceFile : String)
63 | -> (objectFile : String)
64 | -> Core (Maybe String)
65 | compileCObjectFile {asLibrary} sourceFile objectFile =
66 | do cc <- coreLift findCC
67 | cFlags <- coreLift findCFLAGS
68 | cppFlags <- coreLift findCPPFLAGS
70 | refcDir <- findDataFile "refc"
71 | cDir <- findDataFile "c"
73 | let libraryFlag = if asLibrary then ["-fpic"] else []
75 | let runccobj = (escapeCmd $
76 | [cc, "-Werror", "-c"] ++ libraryFlag ++ [sourceFile,
80 | ++ " " ++ cppFlags ++ " " ++ cFlags
83 | log "compiler.refc.cc" 10 runccobj
84 | 0 <- coreLift $
system runccobj
87 | pure (Just objectFile)
90 | compileCFile : {auto c : Ref Ctxt Defs}
91 | -> {default False asShared : Bool}
92 | -> (objectFile : String)
93 | -> (outFile : String)
94 | -> Core (Maybe String)
95 | compileCFile {asShared} objectFile outFile =
96 | do cc <- coreLift findCC
97 | cFlags <- coreLift findCFLAGS
98 | ldFlags <- coreLift findLDFLAGS
99 | ldLibs <- coreLift findLDLIBS
102 | refcDir <- findDataFile "refc"
103 | supportFile <- findLibraryFile "libidris2_support.a"
105 | let sharedFlag = if asShared then ["-shared"] else []
107 | let runcc = (escapeCmd $
108 | [cc, "-Werror"] ++ sharedFlag ++ [objectFile,
113 | ] ++ clibdirs (lib_dirs dirs) ++ [
115 | ++ " " ++ (unwords [cFlags, ldFlags, ldLibs])
117 | log "compiler.refc.cc" 10 runcc
118 | 0 <- coreLift $
system runcc
119 | | _ => pure Nothing
121 | pure (Just outFile)