65 lines
2.4 KiB
BQN
65 lines
2.4 KiB
BQN
chdir ← @•FFI"i32"‿"chdir"‿">*u8:c8"
|
||
Split ← {𝕩⊔˜(⊢-˜+`׬)𝕩=𝕨}
|
||
SimplifyPath ← {
|
||
1↓∾'/'⊸∾¨ {(∊××) ⌊`⌾⌽ +` ¬⊸- ".."⊸≡¨𝕩}⊸/ "."⊸≢¨⊸/ '/'Split𝕩
|
||
}
|
||
Good ← { 𝕊 dir‿t0‿t1‿o‿e‿deps:
|
||
⟨1, o∾e, t1-t0, deps ⋈¨ (•file.Modified dir•file.At⊢)¨ deps⟩
|
||
}
|
||
|
||
_runSingeli_ ← { runArgs GetDeps _𝕣_ dir runFile:
|
||
t0 ← •MonoTime@
|
||
e←@ ⋄ deps←@
|
||
{𝕊:
|
||
runArgs •Import runFile
|
||
deps ↩ GetDeps@
|
||
}⎊{𝕊: e↩•CurrentError@} @
|
||
t1 ← •MonoTime@
|
||
{
|
||
e≢@? ⟨0, e⟩;
|
||
Good ⟨dir,t0,t1,"","",deps⟩
|
||
}
|
||
}
|
||
|
||
{
|
||
"sh"‿dir‿cmd‿depf:
|
||
t0 ← •MonoTime@
|
||
Chdir @∾˜ •ToUTF8 dir
|
||
c‿o‿e ← •SH⎊{𝕊: ⟨'e',"",∾⟨"Failed to spawn '", ⊑cmd, "': ", •CurrentError@, {"c++"≡⊑cmd? "; install a C++ compiler as 'c++', or add an argument of CXX=c++-compiler"; ""}⟩⟩} cmd
|
||
t1 ← •MonoTime@
|
||
{
|
||
0: @≡depf?
|
||
Good ⟨dir,t0,t1,o,e,⟨⟩⟩;
|
||
0:
|
||
deps ← •FLines depf
|
||
deps {𝕩/˜1»∧`'\'=¯1⊑∘↑¨𝕩}↩ # remove all but the initial rule
|
||
deps {𝕩↓˜1+⊑𝕩⊐':'}⌾⊑↩ # remove rule name
|
||
deps ¯1⊸↓¨⌾(¯1↓⊢)↩ # remove trailing backslashes
|
||
deps ({𝕩/˜¬∧`𝕩=' '}⌽)⍟2¨↩ # trim whitespace from both sides
|
||
deps (∾' 'Split¨⊢)↩ # split each on spaces
|
||
deps {¬∨´"/build/obj2/"⍷𝕩}¨⊸/↩ # remove autogenerated dependencies, those are handled manually
|
||
deps SimplifyPath¨↩ # remove "."s & ".."s
|
||
deps {dir<○≠𝕩? dir≡(≠dir)↑𝕩? (≠dir)↓𝕩; 𝕩}¨↩ # relativize
|
||
Good ⟨dir,t0,t1,o,e,deps⟩;
|
||
# c≠0:
|
||
⟨0, o∾e⟩
|
||
} c
|
||
;
|
||
"staticlib"‿dst‿cmd:
|
||
•file.Remove⍟•file.Exists dst
|
||
𝕊 cmd
|
||
;
|
||
"singeli"‿dir‿dst‿singeliDir‿args‿src‿dep:
|
||
prefix ← "si_"∾ (∧`'.'⊸≠)⊸/ •file.Name src
|
||
argsFinal ← args∾⟨"-d" ⋄ dep ⋄ "-o" ⋄ dst ⋄ "-n" ⋄ prefix ⋄ src⟩
|
||
argsFinal {𝕊: src<⊸∾ SimplifyPath¨ singeliDir⊸•file.At¨ •FLines dep}_runSingeli_ dir singeliDir •file.At "singeli"
|
||
;
|
||
"runbqn"‿dir‿file‿args‿deps:
|
||
args deps _runSingeli_ dir file
|
||
;
|
||
"dry"‿args:
|
||
⟨dir⟩ ← 1↑args
|
||
Good ⟨dir, 1, 2, "", "", ⟨⟩⟩
|
||
;
|
||
0⋈"unknown command"
|
||
} |