95 lines
3.6 KiB
BQN
95 lines
3.6 KiB
BQN
⟨AtRoot⟩ ← •args
|
||
Esc←{
|
||
in ← (@+0‿9‿10‿13)∾"'""" # Null, Tab, LF, CR, and quotes
|
||
out ← "0tnr" # Whitespace characters changed to letters
|
||
i ← in⊐𝕩
|
||
𝕩 ↩ i ⊏⟜out⌾((i<≠out)⊸/) 𝕩 # Replace
|
||
∾(i<≠in) /⟜"\"⊸∾¨ 𝕩 # Insert \
|
||
}
|
||
n←@+10
|
||
JStr ← {∾⟨"""",Esc 𝕩,""""⟩}
|
||
JArr ← {'['∾']'∾˜2↓∾𝕨⊸∾¨ 𝕩}
|
||
JObj ← {∾⟨'{',n,¯2↓∾(JStr¨𝕨) {∾⟨" ",𝕨,": ",𝕩,',',n⟩}¨ 𝕩, n,'}'⟩}
|
||
|
||
|
||
|
||
|
||
Files ⇐ {
|
||
res ← ⟨⟩
|
||
{'d'=•file.Type AtRoot 𝕩? 𝕊¨ 𝕩⊸•file.At¨ •file.List AtRoot 𝕩; res∾↩ <𝕩} 𝕩
|
||
{⊑(<¯2↑𝕩)∊".c"‿".h"}¨⊸/ res
|
||
}
|
||
|
||
ModifyCBQNFlags ← {
|
||
filenames ← 4↓¨ ⊑¨ 𝕩
|
||
flagK←⟨⟩
|
||
flagV←⟨⟩
|
||
WantsFlags ← {
|
||
𝕨 •file.At↩ # ⋄ •Out 𝕨∾" wants flags "∾JArr JStr¨ 𝕩
|
||
flagK∾↩ <𝕨
|
||
flagV∾↩ <𝕩
|
||
}
|
||
WantsIncludes ← {
|
||
𝕨 WantsFlags ∾ ("-include"⋈"src"•file.At⊢)¨ 𝕩
|
||
}
|
||
|
||
FilterPrefix ← {𝕨⊸{𝕨≡(≠𝕨)↑𝕩}¨⊸/ 𝕩}
|
||
|
||
# main core.h sequence, assuming MM==1
|
||
coreIncludes ← ⟨"h.h","core/stuff.h","core/heap.h","opt/mm_buddy.h","core/gstack.h","core/harr.h","core/numarr.h","core/chrarr.h","core/fillarr.h","core/derv.h","core/arrFns.h"⟩
|
||
{(¯1⊑𝕩) WantsIncludes ¯1↓𝕩}¨ 2↓↑ coreIncludes
|
||
CoreTil ← {coreIncludes↑˜⊑coreIncludes⊐<𝕩}
|
||
|
||
# MM==0 and MM==2
|
||
coreTilMM ← CoreTil "opt/mm_buddy.h"
|
||
{𝕩 WantsIncludes coreTilMM}¨ "opt/mm_2buddy.h"‿"opt/mm_malloc.h"
|
||
|
||
# non-'utils/' headers & optional .c files
|
||
{𝕩 WantsIncludes ⟨"core.h"⟩}¨ ⟨
|
||
"ns.h", "vm.h", "builtins.h"
|
||
"opt/mm_malloc.c", "opt/mm_buddy.c", "opt/mm_2buddy.c", "opt/mm_buddyTemplate.c", "opt/mm_buddyTemplate.h", "opt/gc.c", "opt/gc.h"
|
||
"builtins/radix.h", "singeli/c/arithdDispatch.h"
|
||
"jit/nvm.h"
|
||
⟩
|
||
# and all the utils/ onces
|
||
{𝕩 WantsIncludes ⟨"core.h"⟩}¨ "utils/" FilterPrefix filenames
|
||
# and some other things
|
||
"core/tyarrTemplate.h" WantsIncludes CoreTil "core/chrarr.h"
|
||
"core/tyarrTemplate.c" WantsIncludes ⟨"core/tyarr.c"⟩
|
||
"builtins/grade.h" WantsIncludes ⟨"builtins/sort.c"⟩
|
||
"singeli/c/arithdDispatch.c" WantsIncludes ⟨"builtins/arithd.c"⟩
|
||
"singeli/c/cmp.c" WantsIncludes ⟨"builtins/cmp.c"⟩
|
||
"utils/hashmapTemplate.h" WantsIncludes ⟨"utils/hash.h"⟩
|
||
|
||
|
||
# give the expected environment for configuration-specific files
|
||
"opt/mm_2buddy.c" WantsFlags ⟨"-DMM=2"⟩
|
||
"opt/mm_malloc.c" WantsFlags ⟨"-DMM=0"⟩
|
||
"utils/valgrind.h" WantsFlags ⟨"-DUSE_VALGRIND"⟩
|
||
"core/heap.h" WantsFlags ⟨"-DHEAP_VERIFY"⟩
|
||
{𝕩 WantsFlags ⟨"-DSINGELI"⟩}¨ "singeli/c/" FilterPrefix filenames
|
||
|
||
# template files
|
||
"builtins/sortTemplate.h" WantsIncludes ⟨"core.h", "utils/talloc.h"⟩
|
||
"builtins/sortTemplate.h" WantsFlags ⟨"-DSORT_NAME=", "-DSORT_TYPE=B", "-DSORT_CMP=compare"⟩
|
||
|
||
# deduplicate flag files
|
||
gfk ← ⍷flagK
|
||
gfv ← ∾¨ (⊐flagK) ⊔ flagV
|
||
|
||
# resolve flags to actual files
|
||
𝕩 {n‿f 𝕊 f2: ⟨n, f∾⟨"-Wno-undefined-internal", "-DCLANGD"⟩∾f2⟩}¨ (gfk⊐•file.At¨ filenames)⊏gfv ∾ <⟨⟩
|
||
}
|
||
|
||
objects ← ⟨⟩
|
||
Finish ⇐ { 𝕊:
|
||
objects ModifyCBQNFlags⌾(({"src/"≡4↑⊑𝕩}¨ objects)⊸/)↩
|
||
FileObj ← { name‿flags:
|
||
"file"‿"directory"‿"arguments" JObj ⟨JStr name, JStr AtRoot "", ", " JArr JStr¨ flags⟩
|
||
}
|
||
res ← (","∾n) JArr FileObj¨ objects
|
||
resPath ← AtRoot "compile_commands.json"
|
||
resPath •FChars res
|
||
•Out "Wrote clangd compile commands to "∾•file.At resPath
|
||
}
|
||
_add ⇐ {objects∾↩ <⟨𝕩, (𝔽@)∾<𝕩⟩} |