From 0aada6163a5f1f1d68f1ceac28935fb2a02c1526 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 17 Feb 2023 18:39:27 +0200 Subject: [PATCH] move src/clangdCommands.bqn to `build/build clangd` --- build/src/build.bqn | 47 +++++++++++++-------- build/src/clangd.bqn | 95 ++++++++++++++++++++++++++++++++++++++++++ src/README.md | 5 +++ src/clangdCommands.bqn | 91 ---------------------------------------- 4 files changed, 129 insertions(+), 109 deletions(-) create mode 100644 build/src/clangd.bqn delete mode 100644 src/clangdCommands.bqn diff --git a/build/src/build.bqn b/build/src/build.bqn index c77706dd..0b592c0d 100755 --- a/build/src/build.bqn +++ b/build/src/build.bqn @@ -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 \ No newline at end of file +{ + 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 +} diff --git a/build/src/clangd.bqn b/build/src/clangd.bqn new file mode 100644 index 00000000..57f0b6d3 --- /dev/null +++ b/build/src/clangd.bqn @@ -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∾↩ <⟨𝕩, (𝔽@)∾<𝕩⟩} \ No newline at end of file diff --git a/src/README.md b/src/README.md index 4fb13e94..5bb3f3a7 100644 --- a/src/README.md +++ b/src/README.md @@ -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). diff --git a/src/clangdCommands.bqn b/src/clangdCommands.bqn deleted file mode 100644 index 1c7fa46e..00000000 --- a/src/clangdCommands.bqn +++ /dev/null @@ -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 \ No newline at end of file