aboutsummaryrefslogtreecommitdiff
path: root/src/Build.hs
diff options
context:
space:
mode:
authorBrad Richardson <brichardson@structint.com>2020-03-28 13:28:29 -0500
committerBrad Richardson <brichardson@structint.com>2020-03-28 13:28:29 -0500
commitf12dbc32b463f4c54737bbd56bdccb30115a7658 (patch)
treec0989d831c14b502cbb9a72751f0d6b9999d8d79 /src/Build.hs
parentdb8ee601cdb4fe967105a73929cbbd288a41ce1a (diff)
downloadfpm-f12dbc32b463f4c54737bbd56bdccb30115a7658.tar.gz
fpm-f12dbc32b463f4c54737bbd56bdccb30115a7658.zip
Switch to building one program at a time per definitions from fpm.toml
Diffstat (limited to 'src/Build.hs')
-rw-r--r--src/Build.hs76
1 files changed, 52 insertions, 24 deletions
diff --git a/src/Build.hs b/src/Build.hs
index e7a43f6..0c692cb 100644
--- a/src/Build.hs
+++ b/src/Build.hs
@@ -1,6 +1,6 @@
module Build
( buildLibrary
- , buildPrograms
+ , buildProgram
)
where
@@ -58,26 +58,35 @@ type ModuleName = String
data LineContents = ModuleUsed ModuleName | Other
-buildPrograms
+buildProgram
:: FilePath
-> [FilePath]
-> [FilePattern]
-> FilePath
-> FilePath
-> [String]
+ -> String
+ -> FilePath
-> IO ()
-buildPrograms programDirectory libraryDirectories sourceExtensions buildDirectory compiler flags
+buildProgram programDirectory libraryDirectories sourceExtensions buildDirectory compiler flags programName programSource
= do
sourceFiles <- getDirectoriesFiles [programDirectory] sourceExtensions
- let sourceFileLookupMap =
- createSourceFileLookupMap buildDirectory programDirectory sourceFiles
- libraryModuleMaps <- mapM getLibraryModuleMap libraryDirectories
- let libraryModuleMap = foldl Map.union Map.empty libraryModuleMaps
- let includeFlags = map ("-I" ++) libraryDirectories
+ let moduleSourceFiles =
+ filter (/= programDirectory </> programSource) sourceFiles
+ let moduleObjectFiles = map
+ (sourceFileToObjectFile buildDirectory programDirectory)
+ moduleSourceFiles
+ let sourceFileLookupMap = createSourceFileLookupMap buildDirectory
+ programDirectory
+ moduleSourceFiles
+ let moduleLookupMap = createModuleLookupMap buildDirectory
+ programDirectory
+ moduleSourceFiles
+ otherModuleMaps <- mapM getLibraryModuleMap libraryDirectories
+ let allModuleMaps =
+ moduleLookupMap `Map.union` foldl Map.union Map.empty otherModuleMaps
+ let includeFlags = map ("-I" ++) libraryDirectories
archives <- getDirectoriesFiles libraryDirectories [".a"]
- let executables = map
- (sourceFileToExecutable buildDirectory programDirectory)
- sourceFiles
shake shakeOptions { shakeFiles = buildDirectory
, shakeChange = ChangeModtimeAndDigest
, shakeColor = True
@@ -85,28 +94,47 @@ buildPrograms programDirectory libraryDirectories sourceExtensions buildDirector
, shakeProgress = progressSimple
}
$ do
- buildDirectory </> "*" <.> "o" %> \objectFile -> do
+ want [buildDirectory </> programName <.> exe]
+ buildDirectory </> programName <.> exe %> \executable -> do
+ let objectFile = sourceFileToObjectFile buildDirectory
+ programDirectory
+ programSource
+ let allObjectFiles = objectFile : moduleObjectFiles
+ need allObjectFiles
+ need archives
+ cmd compiler allObjectFiles archives ["-o", executable] flags
+ buildDirectory </> programSource -<.> "o" %> \objectFile -> do
let realObjectFile = foldl (</>) "" $ splitDirectories objectFile
- let sourceFile = fromMaybe
- undefined
- (Map.lookup realObjectFile sourceFileLookupMap)
+ let sourceFile = programDirectory </> programSource
need [sourceFile]
modulesUsed <- liftIO $ getModulesUsed sourceFile
let moduleFilesNeeded =
- mapMaybe (`Map.lookup` libraryModuleMap) modulesUsed
+ mapMaybe (`Map.lookup` allModuleMaps) modulesUsed
+ let includeFlags = map ("-I" ++) libraryDirectories
need moduleFilesNeeded
cmd compiler
- ["-c"]
+ ["-c", "-J" ++ buildDirectory]
includeFlags
flags
["-o", objectFile, sourceFile]
- (\file -> foldl (</>) "" (splitDirectories file) `elem` executables)
- ?> \exe -> do
- let objectFile = map toLower exe -<.> "o"
- need [objectFile]
- need archives
- cmd compiler objectFile archives ["-o", exe] flags
- want executables
+ map (\ext -> buildDirectory </> "*" <.> ext) ["o", "mod"]
+ &%> \[objectFile, moduleFile] -> do
+ let realObjectFile =
+ foldl (</>) "" $ splitDirectories objectFile
+ let sourceFile = fromMaybe
+ undefined
+ (Map.lookup realObjectFile sourceFileLookupMap)
+ need [sourceFile]
+ modulesUsed <- liftIO $ getModulesUsed sourceFile
+ let moduleFilesNeeded =
+ mapMaybe (`Map.lookup` allModuleMaps) modulesUsed
+ let includeFlags = map ("-I" ++) libraryDirectories
+ need moduleFilesNeeded
+ cmd compiler
+ ["-c", "-J" ++ buildDirectory]
+ includeFlags
+ flags
+ ["-o", objectFile, sourceFile]
buildLibrary
:: FilePath