summaryrefslogtreecommitdiff
path: root/Biz/Bild.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Biz/Bild.hs')
-rw-r--r--Biz/Bild.hs81
1 files changed, 49 insertions, 32 deletions
diff --git a/Biz/Bild.hs b/Biz/Bild.hs
index 2526395..81ab44f 100644
--- a/Biz/Bild.hs
+++ b/Biz/Bild.hs
@@ -133,13 +133,17 @@ main =
Nothing -> Exit.die "usage: bild <target>"
Just target -> analyze target >>= build
-type Namespace = String
+data Ext = Hs | Scm | Nix
+ deriving (Show)
+
+data Namespace = Namespace [String] Ext
+ deriving (Show)
type Dep = String
type Out = String
-data Compiler = Ghc | Ghcjs | Guile | Nix
+data Compiler = Ghc | Ghcjs | Guile | NixBuild
deriving (Show)
data Target = Target
@@ -164,6 +168,12 @@ analyze s = do
root <- Env.getEnv "BIZ_ROOT"
cwd <- Dir.getCurrentDirectory
let path = cwd </> s
+ namespace =
+ require "namespace"
+ <| path
+ |> reps root ""
+ |> List.stripPrefix "/"
+ >>= Regex.match metaNamespace
case File.takeExtension path of
".hs" -> do
content <- String.lines </ Prelude.readFile path
@@ -171,25 +181,15 @@ analyze s = do
let compiler = if ".js" `List.isSuffixOf` out then Ghcjs else Ghc
return
Target
- { namespace =
- require "namespace"
- <| path
- |> reps root ""
- |> File.dropExtension
- |> reps "/" "."
- |> List.stripPrefix "."
- >>= Regex.match metaNamespace,
- deps = content /> Regex.match metaDep |> catMaybes,
+ { deps = content /> Regex.match metaDep |> catMaybes,
builder = user <> "@localhost",
..
}
".nix" ->
return
Target
- { namespace = reps root "" path |> List.stripPrefix "/" |> require "namespace",
- path = path,
- deps = [],
- compiler = Nix,
+ { deps = [],
+ compiler = NixBuild,
out = "",
builder =
join
@@ -198,17 +198,17 @@ analyze s = do
"@dev.simatime.com?ssh-key=/home/",
user,
"/.ssh/id_rsa"
- ]
+ ],
+ ..
}
".scm" ->
return
Target
- { namespace = reps root "" path |> List.stripPrefix "/" |> require "namespace",
- path = path,
- deps = [],
+ { deps = [],
compiler = Guile,
out = "",
- builder = user <> "@localhost"
+ builder = user <> "@localhost",
+ ..
}
e -> panic <| "bild does not know this extension: " <> Text.pack e
@@ -217,7 +217,7 @@ build target@Target {..} = do
root <- Env.getEnv "BIZ_ROOT"
case compiler of
Ghc -> do
- putText <| "bild: dev: ghc: " <> Text.pack namespace
+ putText <| "bild: dev: ghc: " <> nsToPath namespace
let outDir = root </> "_/bild/dev/bin"
Dir.createDirectoryIfMissing True outDir
putText <| "bild: dev: local: " <> Text.pack builder
@@ -232,12 +232,12 @@ build target@Target {..} = do
"--make",
path,
"-main-is",
- namespace,
+ nsToHaskellModule namespace,
"-o",
outDir </> out
]
Ghcjs -> do
- putText <| "bild: dev: ghcjs: " <> Text.pack namespace
+ putText <| "bild: dev: ghcjs: " <> nsToPath namespace
let outDir = root </> "_/bild/dev/static"
Dir.createDirectoryIfMissing True outDir
putText <| "bild: dev: local: " <> Text.pack builder
@@ -252,19 +252,17 @@ build target@Target {..} = do
"--make",
path,
"-main-is",
- namespace,
+ nsToHaskellModule namespace,
"-o",
outDir </> out
]
Guile -> do
- putText <| "bild: dev: guile: " <> Text.pack namespace
- let outDir = root </> "_/bild/dev/bin"
- Dir.createDirectoryIfMissing True outDir
+ putText <| "bild: dev: guile: " <> nsToPath namespace
putText <| "bild: dev: local: " <> Text.pack builder
putText "bild: guile TODO"
putText <| show target
- Nix -> do
- putText <| "bild: nix: " <> Text.pack namespace
+ NixBuild -> do
+ putText <| "bild: nix: " <> nsToPath namespace
let outDir = root </> "_/bild/nix"
Dir.createDirectoryIfMissing True outDir
putText <| "bild: nix: remote: " <> Text.pack builder
@@ -272,7 +270,7 @@ build target@Target {..} = do
"nix-build"
[ path,
"-o",
- outDir </> namespace,
+ outDir </> (Text.unpack <| nsToPath namespace),
-- Set default arguments to nix functions
"--arg",
"bild",
@@ -290,10 +288,29 @@ build target@Target {..} = do
builder
]
+nsToHaskellModule :: Namespace -> String
+nsToHaskellModule (Namespace parts Hs) = joinWith "." parts
+nsToHaskellModule (Namespace _ ext) =
+ panic <| "can't convert " <> show ext <> " to a Haskell module"
+
+nsToPath :: Namespace -> Text
+nsToPath (Namespace parts ext) =
+ Text.pack
+ <| joinWith "/" parts
+ <> "."
+ <> lowercase (show ext)
+
metaNamespace :: Regex.RE Char Namespace
-metaNamespace = name <> Regex.many (Regex.sym '.') <> name
+metaNamespace = Namespace </ path <* Regex.sym '.' <*> ext
where
- name = Regex.many (Regex.psym Char.isUpper) <> Regex.many (Regex.psym Char.isLower)
+ name =
+ Regex.many (Regex.psym Char.isUpper)
+ <> Regex.many (Regex.psym Char.isLower)
+ path = Regex.many (name <* Regex.string "/" <|> name)
+ ext =
+ Nix <$ Regex.string "nix"
+ <|> Hs <$ Regex.string "hs"
+ <|> Scm <$ Regex.string "scm"
metaDep :: Regex.RE Char Dep
metaDep = Regex.string "-- : dep " *> Regex.many (Regex.psym Char.isAlpha)