1
1
{-# LANGUAGE MultiWayIf #-}
2
2
module Build
3
- ( buildLibrary
3
+ ( CompilerSettings (.. )
4
+ , buildLibrary
4
5
, buildProgram
5
6
, buildWithScript
6
7
)
@@ -50,22 +51,28 @@ import System.Directory ( createDirectoryIfMissing
50
51
, withCurrentDirectory
51
52
)
52
53
54
+ data CompilerSettings = CompilerSettings {
55
+ compilerSettingsCompiler :: FilePath
56
+ , compilerSettingsFlags :: [String ]
57
+ , compilerSettingsModuleFlag :: String
58
+ , compilerSettingsIncludeFlag :: String
59
+ }
60
+
53
61
buildProgram
54
62
:: FilePath
55
63
-> [FilePath ]
56
64
-> [FilePattern ]
57
65
-> FilePath
58
- -> FilePath
59
- -> [String ]
66
+ -> CompilerSettings
60
67
-> String
61
68
-> FilePath
62
69
-> [FilePath ]
63
70
-> IO ()
64
- buildProgram programDirectory' libraryDirectories sourceExtensions buildDirectory' compiler flags programName programSource archives
71
+ buildProgram programDirectory' libraryDirectories sourceExtensions buildDirectory' ( CompilerSettings { compilerSettingsCompiler = compiler, compilerSettingsFlags = flags, compilerSettingsModuleFlag = moduleFlag, compilerSettingsIncludeFlag = includeFlag }) programName programSource archives
65
72
= do
66
73
let programDirectory = foldl1 (</>) (splitDirectories programDirectory')
67
- let buildDirectory = foldl1 (</>) (splitDirectories buildDirectory')
68
- let includeFlags = map (" -I " ++ ) libraryDirectories
74
+ let buildDirectory = foldl1 (</>) (splitDirectories buildDirectory')
75
+ let includeFlags = map (includeFlag ++ ) libraryDirectories
69
76
sourceFiles <- getDirectoriesFiles [programDirectory] sourceExtensions
70
77
rawSources <- mapM sourceFileToRawSource sourceFiles
71
78
let sources' = map processRawSource rawSources
@@ -98,28 +105,28 @@ buildProgram programDirectory' libraryDirectories sourceExtensions buildDirector
98
105
in fileMatcher &?> \ (objectFile : _) -> do
99
106
need (sourceFile : directDependencies)
100
107
cmd compiler
101
- [" -c" , " -J " ++ buildDirectory]
108
+ [" -c" , moduleFlag ++ buildDirectory]
102
109
includeFlags
103
110
flags
104
111
[" -o" , objectFile, sourceFile]
105
112
want [buildDirectory </> programName <.> exe]
106
113
buildDirectory </> programName <.> exe %> \ executable -> do
107
114
need objectFiles
115
+ need archives
108
116
cmd compiler objectFiles archives [" -o" , executable] flags
109
117
mapM_ infoToRule compileTimeInfo
110
118
111
119
buildLibrary
112
120
:: FilePath
113
121
-> [FilePattern ]
114
122
-> FilePath
115
- -> FilePath
116
- -> [String ]
123
+ -> CompilerSettings
117
124
-> String
118
125
-> [FilePath ]
119
126
-> IO (FilePath )
120
- buildLibrary libraryDirectory sourceExtensions buildDirectory compiler flags libraryName otherLibraryDirectories
127
+ buildLibrary libraryDirectory sourceExtensions buildDirectory ( CompilerSettings { compilerSettingsCompiler = compiler, compilerSettingsFlags = flags, compilerSettingsModuleFlag = moduleFlag, compilerSettingsIncludeFlag = includeFlag }) libraryName otherLibraryDirectories
121
128
= do
122
- let includeFlags = map (" -I " ++ ) otherLibraryDirectories
129
+ let includeFlags = map (includeFlag ++ ) otherLibraryDirectories
123
130
sourceFiles <- getDirectoriesFiles [libraryDirectory] sourceExtensions
124
131
rawSources <- mapM sourceFileToRawSource sourceFiles
125
132
let sources = map processRawSource rawSources
@@ -149,7 +156,7 @@ buildLibrary libraryDirectory sourceExtensions buildDirectory compiler flags lib
149
156
in fileMatcher &?> \ (objectFile : _) -> do
150
157
need (sourceFile : directDependencies)
151
158
cmd compiler
152
- [" -c" , " -J " ++ buildDirectory]
159
+ [" -c" , moduleFlag ++ buildDirectory]
153
160
includeFlags
154
161
flags
155
162
[" -o" , objectFile, sourceFile]
@@ -164,18 +171,19 @@ buildWithScript
164
171
:: String
165
172
-> FilePath
166
173
-> FilePath
167
- -> FilePath
168
- -> [String ]
174
+ -> CompilerSettings
169
175
-> String
170
176
-> [FilePath ]
171
177
-> IO (FilePath )
172
- buildWithScript script projectDirectory buildDirectory compiler flags libraryName otherLibraryDirectories
178
+ buildWithScript script projectDirectory buildDirectory ( CompilerSettings { compilerSettingsCompiler = compiler, compilerSettingsFlags = flags, compilerSettingsModuleFlag = moduleFlag, compilerSettingsIncludeFlag = includeFlag }) libraryName otherLibraryDirectories
173
179
= do
174
180
absoluteBuildDirectory <- makeAbsolute buildDirectory
175
181
createDirectoryIfMissing True absoluteBuildDirectory
176
182
absoluteLibraryDirectories <- mapM makeAbsolute otherLibraryDirectories
177
- setEnv " FC" compiler
178
- setEnv " FFLAGS" (intercalate " " flags)
183
+ setEnv " FC" compiler
184
+ setEnv " FFLAGS" (intercalate " " flags)
185
+ setEnv " FINCLUDEFLAG" includeFlag
186
+ setEnv " FMODUELFLAG" moduleFlag
179
187
setEnv " BUILD_DIR" $ unWindowsPath absoluteBuildDirectory
180
188
setEnv " INCLUDE_DIRS"
181
189
(intercalate " " (map unWindowsPath absoluteLibraryDirectories))
0 commit comments