move src/clangdCommands.bqn to build/build clangd
This commit is contained in:
parent
f76836aedd
commit
0aada6163a
@ -37,9 +37,10 @@ opts ← ⟨
|
||||
⟨2, "rm_lf", ⟨⟩, "forcibly remove linker flag(s)"⟩
|
||||
⟨0, "v", @, "Version to report by --version; 'v=' to use git commit"∾@+10⟩
|
||||
|
||||
⟨1, "shared", 0, "build a shared library; default output is libcbqn.[so|dylib]"⟩
|
||||
⟨1, "wasi", 0, "build with WASI; default output name is BQN.wasm"⟩
|
||||
⟨1, "emcc", 0, "build with emscripten; outputs BQN.wasm & BQN.js in a folder"⟩
|
||||
⟨1, "shared", 0, "Build a shared library; default output is libcbqn.[so|dylib]"⟩
|
||||
⟨1, "wasi", 0, "Build with WASI; default output name is BQN.wasm"⟩
|
||||
⟨1, "emcc", 0, "Build with emscripten; outputs two files - BQN.wasm and BQN.js"⟩
|
||||
⟨1, "clangd", 0, "Don't build, instead generate a compile_commands.json for clangd"∾@+10⟩
|
||||
|
||||
⟨1, "FFI", @, "Enable FFI through libffi; On by default, except for WASM builds"⟩
|
||||
⟨1, "pkgconfig", 1, "Attempt to use pkg-config to find libffi flags"⟩
|
||||
@ -132,7 +133,7 @@ AtRoot ← rootDir⊸•file.At
|
||||
|
||||
po ← { # parsed options
|
||||
⟨
|
||||
verbose, J, rebuildAll, tui, output, versionName,
|
||||
verbose, J, rebuildAll, tui, output, clangd, versionName,
|
||||
os, arch, native,
|
||||
emcc, wasm, replxx, singeli,
|
||||
ffi, o3,
|
||||
@ -141,6 +142,7 @@ po ← { # parsed options
|
||||
⟩⇐
|
||||
|
||||
custom ← GetOpt "c"
|
||||
clangd ← GetOpt "clangd"
|
||||
DOpt ← {@⊸≡◶⟨⊢,𝕨⟩ GetOpt 𝕩}
|
||||
J ⇐ {𝕊: v←GetOpt "j" ⋄ v≢@? •BQN v; •BQN⎊4 "4" TrySH ⟨"nproc"⟩}
|
||||
rebuildAll ⇐ GetOpt "rebuild"
|
||||
@ -210,7 +212,7 @@ po ← { # parsed options
|
||||
{𝕊: "Output location: "∾𝕩}_verboseLog output
|
||||
|
||||
CBQNc ⇐ { 𝕊:
|
||||
isClang ← ∨´"clang"⍷SH cc‿"--version" # TODO exclude from hash?
|
||||
isClang ← {clangd? 1; ∨´"clang"⍷SH cc‿"--version"} # TODO exclude from hash?
|
||||
args ← ⟨
|
||||
cc,
|
||||
"-std=gnu11",
|
||||
@ -226,6 +228,8 @@ po ← { # parsed options
|
||||
⟩
|
||||
args∾↩ 0⊑GetLibs@
|
||||
|
||||
color ← (GetOpt "color") ∧ ¬clangd
|
||||
|
||||
args∾↩ GetOpt "f"
|
||||
args∾↩ GetOpt "CCFLAGS"
|
||||
args∾↩ (singeli∧arch≡ "x86-64") / ⟨"-DSINGELI_X86_64"⟩
|
||||
@ -238,7 +242,7 @@ po ← { # parsed options
|
||||
args∾↩ ( o3) / ⟨"-O3"⟩
|
||||
args∾↩ ( native) / ⟨"-march=native"⟩
|
||||
args∾↩ ( debug) / ⟨"-DDEBUG"⟩
|
||||
args∾↩ ( GetOpt "color") / ⟨isClang⊑"-fdiagnostics-color=always"‿"-fcolor-diagnostics"⟩ # TODO exclude from hash?
|
||||
args∾↩ ( color) / ⟨isClang⊑"-fdiagnostics-color=always"‿"-fcolor-diagnostics"⟩ # TODO exclude from hash?
|
||||
args∾↩ ( GetOpt "rtverify") / ⟨"-DRT_VERIFY", "-DEEQUAL_NEGZERO"⟩
|
||||
args∾↩ (GetOpt"heapverify") / ⟨"-DHEAP_VERIFY"⟩
|
||||
args∾↩ ( exportSymbols) / ⟨"-DCBQN_EXPORT"⟩
|
||||
@ -505,7 +509,10 @@ AddRule ← { 𝕊 cache‿cacheKey‿dst‿GetCMD‿disp‿deps:
|
||||
res
|
||||
}
|
||||
|
||||
clangd ← {¬po.clangd? {_add⇐{𝕨𝔽_𝕣𝕩:@} ⋄ Files⇐⊣}; ⟨AtRoot⟩ •Import "clangd.bqn"}
|
||||
|
||||
MakeCCInv ← { 𝕊 GetArgs‿Init‿cache‿id‿src‿customDeps: # src should be CBQN-base-dir-relative, so that cache doesn't store full paths
|
||||
GetArgs clangd._add src
|
||||
dst ← cache.File id∾".o"
|
||||
GetCMD ← { 𝕊:
|
||||
Init @
|
||||
@ -538,7 +545,7 @@ MakeLinkerInv ← { 𝕊 GetArgs‿cache‿name‿srcs:
|
||||
|
||||
# actual CBQN/Singeli/REPLXX definitions
|
||||
cachedBin‿linkerCache ← {
|
||||
Shorten ← {r ← {𝕩↓˜¯1-⊑'.'⊐˜⌽𝕩}¨ •file.Name¨ 𝕩 ⋄ ! ∧´ ∊r ⋄ r}
|
||||
Shorten ← {po.clangd? 𝕩; r ← {𝕩↓˜¯1-⊑'.'⊐˜⌽𝕩}¨ •file.Name¨ 𝕩 ⋄ ! ∧´ ∊r ⋄ r}
|
||||
cbqnSrc ← ∾{⌽(⊑𝕩)⊸•file.At¨ 1↓𝕩}¨ ⌽⟨
|
||||
⟨"src/builtins/", "arithd.c", "arithm.c", "cmp.c", "sfns.c", "squeeze.c", "select.c", "slash.c", "group.c", "sort.c", "search.c", "selfsearch.c", "fold.c", "scan.c", "md1.c", "md2.c", "fns.c", "sysfn.c", "internal.c", "inverse.c"⟩
|
||||
⟨"src/core/", "tyarr.c", "harr.c", "fillarr.c", "stuff.c", "derv.c", "mm.c", "heap.c"⟩
|
||||
@ -546,6 +553,7 @@ cachedBin‿linkerCache ← {
|
||||
⟨"src/jit/", "nvm.c"⟩
|
||||
⟨"src/utils/", "ryu.c", "utf.c", "hash.c", "file.c", "mut.c", "each.c", "bits.c"⟩
|
||||
⟩
|
||||
cbqnSrc ↩ cbqnSrc clangd.Files "src"
|
||||
singeliMap ← {po.arch≡"aarch64"? 𝕩/˜(1⊑¨𝕩)∊"cmp"‿"bits"‿"equal"‿"dyarith"‿"monarith"‿"squeeze"; 𝕩} ⟨
|
||||
"src/builtins/arithm.c"‿"monarith",
|
||||
"src/core/stuff.c"‿"equal", "src/utils/mut.c"‿"copy", "src/utils/bits.c"‿"bits"
|
||||
@ -628,14 +636,17 @@ cachedBin‿linkerCache ← {
|
||||
}
|
||||
|
||||
outPath ← •wdpath •file.At po.output
|
||||
success ← Run cachedBin
|
||||
{ 𝕊:
|
||||
po.emcc?
|
||||
SH ⟨"cp", AtRoot cachedBin, outPath •file.At •file.Name cachedBin⟩
|
||||
SH ⟨"cp", AtRoot linkerCache.File "BQN.wasm", outPath •file.At "BQN.wasm"⟩
|
||||
;
|
||||
SH ⟨"cp", "-f", AtRoot cachedBin, outPath⟩
|
||||
}⍟⊢ success
|
||||
|
||||
OnExit@
|
||||
•Exit ¬success
|
||||
{
|
||||
po.clangd? clangd.Finish@;
|
||||
# else, regular build
|
||||
success ← Run cachedBin
|
||||
{ 𝕊:
|
||||
po.emcc?
|
||||
SH ⟨"cp", AtRoot cachedBin, outPath •file.At •file.Name cachedBin⟩
|
||||
SH ⟨"cp", AtRoot linkerCache.File "BQN.wasm", outPath •file.At "BQN.wasm"⟩
|
||||
;
|
||||
SH ⟨"cp", "-f", AtRoot cachedBin, outPath⟩
|
||||
}⍟⊢ success
|
||||
OnExit@
|
||||
•Exit ¬success
|
||||
}
|
||||
|
||||
95
build/src/clangd.bqn
Normal file
95
build/src/clangd.bqn
Normal file
@ -0,0 +1,95 @@
|
||||
⟨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"
|
||||
"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∾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∾↩ <⟨𝕩, (𝔽@)∾<𝕩⟩}
|
||||
@ -1,5 +1,10 @@
|
||||
# Overview of the CBQN source
|
||||
|
||||
## clangd
|
||||
|
||||
Run `build/build clangd` to generate a `compile_commands.json` file which clangd will use to resolve the flags CBQN expects. Other `build/build` flags will also be respected, e.g. `build/build replxx singeli native clangd` will result in clangd assuming the `SINGELI` and `USE_REPLXX` macros are defined, and will resolve generated Singeli sources to ones `build/build replxx singeli native` generates (along with everything else the configurations change).
|
||||
(depending on the LSP in use, you may need to restart the LSP/clangd/editor after a modified `compile_commands.json`)
|
||||
|
||||
## Conventions
|
||||
|
||||
Functions starting with `m_` create a new object (some NaN-boxed, some heap-allocated).
|
||||
|
||||
@ -1,91 +0,0 @@
|
||||
# list all .c & .h files
|
||||
enableSingeli ← 1
|
||||
additionalFlags ← ⟨⟩
|
||||
|
||||
allFiles ← ⟨⟩
|
||||
{'d'=•file.Type𝕩? 𝕊¨ 𝕩⊸•file.At¨ •file.List𝕩; allFiles∾↩ <𝕩} ""
|
||||
allFiles {⊑(<¯2↑𝕩)∊".c"‿".h"}¨⊸/↩
|
||||
|
||||
initialFlags ← ⟨
|
||||
"/usr/bin/clang","-std=gnu11","-Wall","-DCLANGD","-DFFI=2","-DCBQN_EXPORT","-fms-extensions"
|
||||
"-Wno-microsoft-anon-tag","-Wno-unused-function","-Wno-undefined-internal","-Wno-bitwise-instead-of-logical","-Wno-unknown-warning-option"
|
||||
⟩ ∾ additionalFlags ∾ enableSingeli/⟨"-DSINGELI","-DSINGELI_X86_64","-DSINGELI_NEON","-march=native"⟩
|
||||
|
||||
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,'}'⟩}
|
||||
|
||||
flagK←⟨⟩
|
||||
flagV←⟨⟩
|
||||
WantsFlags ← {
|
||||
𝕨 •file.At↩
|
||||
# •Out 𝕨∾" wants flags "∾JArr JStr¨ 𝕩
|
||||
flagK∾↩ <𝕨
|
||||
flagV∾↩ <𝕩
|
||||
}
|
||||
WantsIncludes ← {
|
||||
𝕨 WantsFlags ∾ ("-include"⋈•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"
|
||||
"jit/nvm.h"
|
||||
⟩
|
||||
# and all the utils/ onces
|
||||
{𝕩 WantsIncludes ⟨"core.h"⟩}¨ "utils/" FilterPrefix allFiles
|
||||
# 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 allFiles
|
||||
|
||||
# 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
|
||||
allFlags ← (gfk⊐•file.At¨ allFiles)⊏gfv ∾ <⟨⟩
|
||||
|
||||
FileObj ← {
|
||||
"file"‿"directory"‿"arguments" JObj ⟨JStr 𝕨, JStr •path, ", " JArr JStr¨ initialFlags∾𝕩⟩
|
||||
}
|
||||
|
||||
resPath ← ≠◶⟨"../compile_commands.json", •wdpath•file.At⊑⟩ •args
|
||||
resPath •FChars (","∾n) JArr allFiles FileObj¨ allFlags
|
||||
•Out "Wrote clangd compile commands to "∾•file.At resPath
|
||||
Loading…
Reference in New Issue
Block a user