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⟩ } _runImport_ ← { runArgs Process _𝕣_ dir runFile: # Process returns {deps‿o‿e⇐}, with e⇐@ for no error t0 ← •MonoTime@ o←@ ⋄ e←@ ⋄ deps←@ {𝕊: deps‿o‿e ↩ Process runArgs •Import runFile }⎊{𝕊: e↩•CurrentError@} @ t1 ← •MonoTime@ { e≢@? ⟨0, e⟩; Good ⟨dir,t0,t1,o,"",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: prefix ← "si_"∾ (∧`'.'⊸≠)⊸/ •file.Name src argsFinal ← args∾⟨"-oe", "bqn", "-os", "none", "-o" ⋄ dst ⋄ "-n" ⋄ prefix ⋄ src⟩ Process ← { 𝕊 res: deps ⇐ src<⊸∾ SimplifyPath¨ res.deplog o ⇐ ∾ ∾⟜(@+10)¨ res.show e ⇐ {⟨⟩: @; ⋈⁼𝕩} res.errout } argsFinal Process _runImport_ dir singeliDir •file.At "singeli" ; "runbqn"‿dir‿file‿args‿deps: args {deps⇐deps, o⇐"", e⇐@} _runImport_ dir file ; "dry"‿args: ⟨dir⟩ ← 1↑args Good ⟨dir, 1, 2, "", "", ⟨⟩⟩ ; 0⋈"unknown command" }