From d24031a1251ed431079d3efa4949ddad1b3282bd Mon Sep 17 00:00:00 2001 From: dzaima Date: Tue, 1 Oct 2024 21:04:48 +0300 Subject: [PATCH] add target_from_cc=1 option --- README.md | 62 ++++++++--------- build/singeliSubmodule | 2 +- build/src/build.bqn | 149 ++++++++++++++++++++++++++--------------- makefile | 2 +- 4 files changed, 128 insertions(+), 87 deletions(-) diff --git a/README.md b/README.md index b15292d4..a0c475de 100644 --- a/README.md +++ b/README.md @@ -37,31 +37,32 @@ For native builds, targeted extensions are determined by `/proc/cpuinfo` (or `sy ### Build flags -`notui=1` - display build progress in a plain-text format -`version=...` - specify the version to report in `--version` (default is commit hash) -`nogit=1` - error if something attempts to use `git` -`CC=...` - choose a different C compiler (default is `clang`, or `cc` if unavailable; CBQN is more tuned for clang, but gcc also works) -`CXX=...` - choose a different C++ compiler; needed only for REPLXX (default is `c++`) -`OUTPUT=path/to/somewhere` - change output location; for `emcc-o3` it will be the destination folder for `BQN.js` and `BQN.wasm`, for everything else - the filename -`target_arch=(x86-64|aarch64|generic)` - target architecture. Inferred from `uname` by default. Used for deciding target optimizations. -`target_os=(linux|bsd|macos|windows)` - target OS. Inferred from `uname` by default. Used for determining default output names and slight configuration changes. -`j=8` - override the default parallel job count (default is the output of `nproc`) -`has=...` - assume specified architecture extensions/properties (x86-64-only). Takes a comma-separated list which, beyond what is architecturally guaranteed, infer additional extensions as noted which hold on existing hardware (at least as of the time of writing): -- `pclmul` (implies SSE4.2) -- `avx2` (implies `pclmul`, POPCNT, BMI1) -- `bmi2` (implies `pclmul`, AVX1) -- `slow-pdep` (specifies Zen 1 & Zen 2's slow `pdep`/`pext`) - -`REPLXX=0` - disable REPLXX -`singeli=0` - disable usage of Singeli -`FFI=0` - disable `•FFI`, thus not depending on libffi -`usz=64` - support arrays with length over 232 - -`f=...` - add extra C compiler flags for CBQN file compilation -`lf=...` - add extra linking flags (`LDFLAGS` is a synonym) -`CCFLAGS=...` - add flags for all CC/CXX/linking invocations -`REPLXX_FLAGS=...` - override replxx build flags (default is `-std=c++11 -Os`) -`CXXFLAGS=...` - add additional CXX flags +- `notui=1` - display build progress in a plain-text format +- `version=...` - specify the version to report in `--version` (default is commit hash) +- `nogit=1` - error if something attempts to use `git` +- `CC=...` - choose a different C compiler (default is `clang`, or `cc` if unavailable; CBQN is more tuned for clang, but gcc also works) +- `CXX=...` - choose a different C++ compiler; needed only for REPLXX (default is `c++`) +- `j=8` - override the default parallel job count (default is the output of `nproc`) +- `OUTPUT=path/to/somewhere` - change output location; for `emcc-o3` it will be the destination folder for `BQN.js` and `BQN.wasm`, for everything else - the filename +- `target_arch=(x86-64|aarch64|generic)` - target architecture; if abscent, inferred from `uname`, or `CC` if `target_from_cc=1`; used for enabling architecture-specific optimizations +- `target_os=(linux|bsd|macos|windows)` - target OS; if abscent, inferred from `uname`, or `CC` if `target_from_cc=1`; used for determining default output names and slight configuration changes +- `target_from_cc=1` - infer the target architecture and OS from C macros that `CC` defines via `-dM -E`; additionally infers available extensions, allowing e.g. `make f=-march=x86-64-v3 - target_from_cc=1` to optimize assuming AVX2, which would otherwise need `has=avx2` +- `has=...` - assume specified architecture extensions/properties (x86-64-only); takes a comma-separated list which, beyond what is architecturally guaranteed, infer additional extensions as noted which hold on existing hardware (at least as of the time of writing): + - `pclmul` (implies SSE4.2) + - `avx2` (implies `pclmul`, POPCNT, BMI1) + - `bmi2` (implies `avx2`) + - `slow-pdep` (implies `bmi2`; specifies Zen 1 & Zen 2's slow `pdep`/`pext`) + +- `REPLXX=0` - disable REPLXX +- `singeli=0` - disable usage of Singeli +- `FFI=0` - disable `•FFI`, thus not depending on libffi +- `usz=64` - support arrays with length over 232 + +- `f=...` - add extra C compiler flags for CBQN file compilation +- `lf=...` - add extra linking flags (`LDFLAGS` is a synonym) +- `CCFLAGS=...` - add flags for all CC/CXX/linking invocations +- `REPLXX_FLAGS=...` - override replxx build flags (default is `-std=c++11 -Os`) +- `CXXFLAGS=...` - add additional CXX flags Alternatively, `build/build` (aka build.bqn) can be invoked manually, though note that it has slightly different argument naming (see `build/build --help`) and doesn't have predefined build types (i.e. `make o3ng` is done as `build/build replxx singeli native g`) @@ -113,12 +114,11 @@ AArch64 ARMv8-A (within Termux on Android 8): ``` Additionally, CBQN is known to compile as-is on macOS. Windows builds can be made by cross-compilation ([Docker setup](https://github.com/vylsaz/cbqn-win-docker-build)). -The build will attempt to use `pkg-config` to find libffi, `uname` to determine `target_arch` & `target_os`, and `nproc` for parallel job count, with defaults if unavailable (`-lffi` for linking libffi (+ `-ldl` on non-BSD), `target_arch=generic`, `target_os=linux`, `j=4`; these can of course also be specified manually). +The build will attempt to use `pkg-config` to find libffi, `uname` to determine `target_arch` & `target_os` if not using `target_from_cc`, and `nproc` for parallel job count, with defaults if unavailable (`-lffi` for linking libffi (+ `-ldl` on non-BSD), `target_arch=generic`, `target_os=linux`, `j=4`; these can of course also be specified manually). -Furthermore, `git` is used to determine the version to present for `--version` (override with `version=...`), and to update submodules. - -Submodules are used for Singeli, replxx, and precompiled bytecode. To avoid automatic usage of `git`, link local copies to `build/singeliLocal`, `build/replxxLocal`, and `build/bytecodeLocal`. +Git submodules are used for Singeli, replxx, and precompiled bytecode. To avoid automatic usage of `git` here, link local copies to `build/singeliLocal`, `build/replxxLocal`, and `build/bytecodeLocal`. +Furthermore, `git` is used to determine the version that `--version` should display (override with `version=...`). Use `nogit=1` to disallow automatic `git` usage. ### Precompiled bytecode @@ -145,7 +145,9 @@ Note that, after either of those, the compiled bytecode may become desynchronize You must manually set up a cross-compilation environment. It's possible to pass flags to all CC/CXX/linking invocations via `CCFLAGS=...`, and `LDFLAGS=...` to pass ones to the linking step specifically (more configuration options [above](#build-flags)). -A `target_arch=(x86-64|aarch64|generic)` make argument must be present (`generic` will work always, but a more specific argument will enable significant optimizations), as otherwise it'll choose based on `uname`. Similarly, `target_os=(linux|bsd|macos|windows)` should be present if the target OS differs from the host. +A `target_arch=(x86-64|aarch64|generic)` make argument should be added (`generic` will work always, but a more specific argument will enable significant optimizations), as otherwise it'll choose based on `uname`. Similarly, `target_os=(linux|bsd|macos|windows)` should be present if the target OS differs from the host. + +Alternatively, the `target_from_cc=1` make argument can be used, replacing the need of `target_arch` and `target_os` (although they can be still set, overriding the values inferred from CC). Furthermore, all build targets (except `-makeonly` ones) will need a non-cross-compiled version of CBQN at build time to run build.bqn and Singeli. For those, a `make for-build` will need to be ran before the primary build, configured to not cross-compile. (this step only needs a C compiler (default is `CC=cc` here), and doesn't need libffi, nor a C++ compiler). diff --git a/build/singeliSubmodule b/build/singeliSubmodule index 5ae2e77d..b43f3999 160000 --- a/build/singeliSubmodule +++ b/build/singeliSubmodule @@ -1 +1 @@ -Subproject commit 5ae2e77d7d4704bf7440eabc9146dedf7c8a902d +Subproject commit b43f3999b0c5a40b43ceee258fbe6bb8245d06af diff --git a/build/src/build.bqn b/build/src/build.bqn index 115c4da6..3d89525f 100755 --- a/build/src/build.bqn +++ b/build/src/build.bqn @@ -34,6 +34,7 @@ opts ← ⟨ ⟨1, "color", @, "Whether to enable colored diagnostics; default based on notui"⟩ ⟨0, "os", @, "Target OS (linux, bsd, macos)"⟩ # used for .so vs .dylib, and changing linker flags for bsd ⟨0, "arch", @, "Target architecture (x86-64, aarch64, generic)"⟩ # used for selecting Singeli target + ⟨1, "target-from-cc",0, "Detect arch, OS, and target-supported extensions from CC"⟩ ⟨1, "pie", @, "Position-independent executable; default based on OS & arch"∾@+10⟩ ⟨0, "OUTPUT", "", "Output location; defaults to ./BQN for regular builds"⟩ @@ -51,14 +52,14 @@ opts ← ⟨ ⟨1, "static-bin", 0, "Statically link the executable"⟩ ⟨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, "clangd", 0, "Generate a compile_commands.json for clangd"∾@+10⟩ - ⟨1, "FFI", @, "Enable FFI through libffi; On by default for linux, BSD, macos"⟩ + ⟨1, "FFI", @, "Enable FFI through libffi; off by default for Windows"⟩ ⟨1, "pkgconfig", 1, "Whether to attempt to use pkg-config to find libffi flags"⟩ - ⟨1, "singeli", 0, "Enable compilation with Singeli"⟩ + ⟨1, "singeli", 0, "Enable Singeli usage"⟩ ⟨1, "replxx", 0, "Enable REPLXX"∾@+10⟩ - ⟨0, "usz", "32", "Size of array length fields in bits; default 32, can be 32 or 64"⟩ + ⟨0, "usz", "32", "Size of array length fields in bits; 32 or 64 (default: 32)"⟩ ⟨1, "c", 0, "Disable some default flags"⟩ ⟨1, "O3", @, "Use '-O3'; On by default unless 'c=1'"⟩ ⟨1, "native", @, "Use '-march=native'"⟩ @@ -182,10 +183,12 @@ po ← { # parsed options emcc, wasm, replxx, singeli, staticLib, usz, ffi, o3, debug, rtverify, heapverify, bytecodeDir, replxxDir, singeliDir, - CBQNc, ccColor, singeliFlags, siCFlags, singeliArch, REPLXXc, Linker + CBQNc, ccColor, singeliFlags, singeliCFlags, singeliArch, REPLXXc, Linker ⟩⇐ compat ← GetOpt "from-makefile" + compatTgt ← compat/"target_" + custom ← GetOpt "c" clangd ← GetOpt "clangd" DOpt ← {@⊸≡◶⟨⊢,𝕨⟩ GetOpt 𝕩} @@ -194,6 +197,7 @@ po ← { # parsed options warnStored ⇐ GetOpt "stored-warn" loud ⇐ ¬GetOpt "quiet" nogit ↩ GetOpt "nogit" + truecc ⇐ GetOpt "target-from-cc" dry ⇐ GetOpt "dry-run" CacheList ← { @@ -234,12 +238,10 @@ po ← { # parsed options cc ← {emcc? "emcc"; "clang"} DOpt "CC" ccClang ← { clangd? 1; - TryVersion ← {𝕩 SH cc‿"--version"} - vs ← TryVersion {@≡GetOpt"CC"? ¯1; @} - {𝕊: cc↩"cc" ⋄ Log "Note: default CC 'clang' wasn't found; building with 'cc'; add a `CC=cc` argument to hide" ⋄ vs↩TryVersion@}⍟⊢ vs≡¯1 + {𝕊: Log⍟loud "Note: default CC '"∾cc∾"' wasn't found; using 'cc'; add 'CC=cc' to hide" ⋄ cc↩"cc" ⋄ vs↩TryVersion@}⍟⊢ vs≡¯1 ∨´"clang"⍷vs } @@ -250,31 +252,83 @@ po ← { # parsed options ubsan ⇐ GetOpt "ubsan" o3 ⇐ (¬custom) DOpt "O3" - uname ← ⊢◶""‿{𝕊: Lowercase "" TrySH "uname"‿"-sm"} ∨´ (@≡GetOpt)¨ "os"‿"arch" - InUname ← {𝕊: ∨´ 𝕩⍷uname} + allFlags ← GetOpt "CCFLAGS" + minCCFlags ← allFlags ∾ GetOpt "f" - os ⇐ Lowercase {InUname"linux"? "linux"; InUname"darwin"? "macos"; InUname"bsd"? "bsd"; "linux"} DOpt "os" - linux‿bsd‿macos‿windows ← os⊸≡¨ {𝕊: "Error: Unsupported OS; options:"∾1↓∾", "⊸∾¨𝕩}_assert_(⊑os<⊸∊⊢) "linux"‿"bsd"‿"macos"‿"windows" + CDefines ← {𝕊: cDefines ↩ (@+10) Split SH ⟨cc⟩ ∾ minCCFlags ∾ ⟨"-dM", "-E", "-"⟩} - arch ⇐ {'-'¨⌾(('_'=𝕩)⊸/)𝕩} Lowercase {InUname"x86_64"? "x86-64"; ∨´InUname¨"aarch64"‿"arm64"? "aarch64"; "generic"} DOpt "arch" - {𝕊: arch ↩ "generic"}⍟⊢ wasm - {𝕊: "Error: Unsupported arch; options:"∾1↓∾", "⊸∾¨𝕩}_assert_(⊑arch<⊸∊⊢) "x86-64"‿"aarch64"‿"generic" + Uname ← {𝕊: uname ↩ Lowercase "" TrySH "uname"‿"-sm"} + InUname ← {𝕊: ∨´ 𝕩⍷Uname@} - ffi ⇐ ((¬windows)∧¬wasm) DOpt "FFI" singeli ⇐ GetOpt "singeli" replxx ⇐ GetOpt "REPLXX" + SubmoduleDir ← "build"⊸•file.At⍟(@≢⊢) {𝕨≡0?@; •file.Exists r←AtRoot "build"•file.At 𝕩∾"Local"? r; 𝕩∾"Submodule"} + LogDir ← {𝕩≡@? 𝕨∾": not used"; 𝕨∾" directory: "∾AtRoot 𝕩}_verboseLog + bytecodeDir ⇐ 1 SubmoduleDir "bytecode" ⋄ "Bytecode" LogDir bytecodeDir + replxxDir ⇐ replxx SubmoduleDir "replxx" ⋄ "REPLXX" LogDir replxxDir + singeliDir ⇐ singeli SubmoduleDir "singeli" ⋄ "Singeli" LogDir singeliDir + + arch ⇐ {'-'¨⌾(('_'=𝕩)⊸/)𝕩} Lowercase {truecc∨wasm? "generic"; InUname"x86_64"? "x86-64"; ∨´InUname¨"aarch64"‿"arm64"? "aarch64"; "generic"} DOpt "arch" + {𝕊: "Error: Unsupported arch; options:"∾1↓∾", "⊸∾¨𝕩}_assert_(⊑arch<⊸∊⊢) "x86-64"‿"aarch64"‿"riscv64"‿"generic" + arch {"riscv64": "RV64"; "generic": "NONE"; Uppercase {'_'¨⌾(('-'=𝕩)⊸/)𝕩} 𝕩}↩ # translate to Singeli + has ⇐ ∾ ','Split¨Lowercase GetOpt "has" - has ↩ ∧⍷has ∾ (⊑"slow-pdep"<⊸∊has)/⋈"bmi2" - {𝕊: "Error: Unsupported 'has' options; options:"∾1↓∾", "⊸∾¨𝕩}_assert_(∧´has∊⊢) "ssse3"‿"sse4.1"‿"sse4.2"‿"avx2"‿"bmi2"‿"pclmul"‿"slow-pdep" - {𝕊: "Error: Cannot have 'has' options on architecture '"∾arch∾"'; remove 'has=...' or add an argument of "∾compat⊑"arch=x86-64"‿"target_arch=x86-64"}_assert_¬ (arch≢"x86-64") ∧ 0≠≠has + has ↩ ∧⍷has ∾ (⊑"slow-pdep"<⊸∊ has) / ⟨"bmi2"⟩ + {𝕊: "Error: Invalid 'has' value; options:"∾1↓∾", "⊸∾¨𝕩}_assert_(∧´has∊⊢) "ssse3"‿"sse4.1"‿"sse4.2"‿"avx2"‿"bmi2"‿"pclmul"‿"slow-pdep" + "Error: Cannot use 'has=...' if Singeli isn't enabled"_assert_⊢ singeli ∨ ⟨⟩≡has - singeliArch ⇐ ({"x86-64":"X86_64"; "aarch64":"AARCH64"; "none"} arch) <⊸∾ Uppercase ∊⟜"ssse3"‿"sse4.1"‿"sse4.2"‿"avx2"‿"bmi2"‿"pclmul"⊸/ has + {𝕊: has∾↩ (∨´(("#define __tune_znver"⊸∾∾⟜"__ 1")¨ "12")∊CDefines@) / ⟨"slow-pdep"⟩}⍟⊢ truecc - {𝕊: "Target: "∾os∾" "∾arch∾ 1↓ ∾", "⊸∾¨ has∾native/⋈"native"} _verboseLog@ + singeliArch ⇐ @ + singeliCFlags ⇐ ⟨⟩ - pie ⇐ {(¬sharedLib∨staticLib)∧linux∧arch≡"x86-64"? 0; 1} DOpt "pie" - {𝕊: pie ↩ 0}⍟⊢ wasm + { + ¬singeli? @; + UpdateSubmodule singeliDir + SingeliUtil ← {𝕨 •Import AtRoot singeliDir •file.At 𝕩} + singeliArch ↩ { + truecc ∧ @≡GetOpt"arch"? + archutil ← SingeliUtil "archutil.bqn" + foundArch ← archutil.ParseCDefines CDefines@ + arch ↩ ⊑foundArch + foundArch + ; + Uppercase ⟨arch⟩ + } + { + arch≡"X86_64"? + singeliArch∾↩ Uppercase ∊⟜"ssse3"‿"sse4.1"‿"sse4.2"‿"avx2"‿"bmi2"‿"pclmul"⊸/ has + ArchInfo ← {(⟨{native? ⟨⟩; singeliArch}, 𝕩⟩ SingeliUtil "arch.bqn").GetCFlags @} + singeliCFlags ↩ ArchInfo 1 + {𝕊: Log "Note: inferred the following C flags:"∾∾' '⊸∾¨𝕩}⍟(loud ∧ ×∘≠) singeliCFlags (¬∘∊/⊣) ArchInfo 0 + ;@ + } + } + + {𝕊: "Error: Cannot have 'has' options on architecture '"∾arch∾"'; remove 'has=...' or use '"∾compatTgt∾"arch=x86-64'"}_assert_¬ (arch≢"X86_64") ∧ 0≠≠has + + os ⇐ GetOpt "os" + { + os≢@? + os Lowercase ↩; + ¬truecc? + os ↩ {InUname"linux"? "linux"; InUname"darwin"? "macos"; InUname"bsd"? "bsd"; "linux"}; + osKeys‿osVals ← <˘⍉>⟨ + ⟨"_WIN32", "windows"⟩ + ⟨"__FreeBSD__", "bsd"⟩ + ⟨"__OpenBSD__", "bsd"⟩ + ⟨"__APPLE__", "macos"⟩ + ⟨"__MACH__", "macos"⟩ + ⟨"__linux", "linux"⟩ + ⟩ + osOpts ← ⍷ osVals /˜ osKeys∊{𝕩↑˜⊑𝕩⊐' '}¨ 8↓¨ ("#define "≡8↑⊢)¨⊸/ CDefines@ + {𝕊: "Error: Couldn't detect OS from C-defined macros; add explicit '"∾compatTgt∾"os=...'"} _assert_⊢ 1=≠osOpts + os ↩ ⋈⁼ osOpts + } + linux‿bsd‿macos‿windows ← os⊸≡¨ {𝕊: "Error: Unsupported OS; options:"∾1↓∾", "⊸∾¨𝕩}_assert_(⊑os<⊸∊⊢) "linux"‿"bsd"‿"macos"‿"windows" + + {𝕊: ∾⟨"Target: ", os, " ", Lowercase arch, 1↓ ∾", "⊸∾¨ has∾native/⋈"native"⟩} _verboseLog@ output ⇐ GetOpt "OUTPUT" output ↩ •wdpath•file.At {𝕊: @@ -285,6 +339,12 @@ po ← { # parsed options windows? "BQN.exe"; "BQN" }⍟(""≡⊢) output + {𝕊: "Output location: "∾𝕩}_verboseLog output + + pie ⇐ {(¬sharedLib∨staticLib)∧linux∧arch≡"X86_64"? 0; 1} DOpt "pie" + {𝕊: pie ↩ 0}⍟⊢ wasm + + ffi ⇐ ((¬windows)∧¬wasm) DOpt "FFI" exportSymbols ← ffi∨lib @@ -298,21 +358,6 @@ po ← { # parsed options } } - SubmoduleDir ← "build"⊸•file.At⍟(@≢⊢) {𝕨≡0?@; •file.Exists r←AtRoot "build"•file.At 𝕩∾"Local"? r; 𝕩∾"Submodule"} - LogDir ← {𝕩≡@? 𝕨∾": not used"; 𝕨∾" directory: "∾AtRoot 𝕩}_verboseLog - bytecodeDir ⇐ 1 SubmoduleDir "bytecode" ⋄ "Bytecode" LogDir bytecodeDir - replxxDir ⇐ replxx SubmoduleDir "replxx" ⋄ "REPLXX" LogDir replxxDir - singeliDir ⇐ singeli SubmoduleDir "singeli" ⋄ "Singeli" LogDir singeliDir - {𝕊: "Output location: "∾𝕩}_verboseLog output - - siCFlags ⇐ { - ¬singeli? @; - UpdateSubmodule singeliDir - (⟨{native? ⟨⟩; singeliArch}, 1⟩ •Import AtRoot singeliDir •file.At "arch.bqn").GetCFlags@ - } - allFlags ← GetOpt "CCFLAGS" - allFlags∾↩ ubsan/⟨"-fsanitize=undefined", "-fno-sanitize=float-cast-overflow", "-fno-sanitize=vla-bound"⟩ - ccColor ⇐ ((¬clangd) ∧ tui DOpt "color") / ⟨ccClang⊑"-fdiagnostics-color=always"‿"-fcolor-diagnostics"⟩ cbqnc ← { @@ -334,12 +379,11 @@ po ← { # parsed options ⟩ args∾↩ 0⊑GetLibs@ - - args∾↩ GetOpt "f" - args∾↩ allFlags - args∾↩ (singeli ∧ arch≡ "x86-64") / ⟨"-DSINGELI_X86_64"⟩ ∾ {singeli? "-mssse3"‿"-mavx2" ∊ siCFlags; 0} / "-DSINGELI_SSSE3"‿"-DSINGELI_AVX2" - args∾↩ (singeli ∧ arch≡"aarch64") / ⟨"-DSINGELI_NEON"⟩ - args∾↩ (singeli ∧ ⊑arch<⊸∊"x86-64"‿"aarch64") / ⟨"-DSINGELI_SIMD"⟩ + args∾↩ minCCFlags + args∾↩ ubsan / ⟨"-fsanitize=undefined", "-fno-sanitize=float-cast-overflow", "-fno-sanitize=vla-bound"⟩ + args∾↩ (singeli ∧ arch≡ "X86_64") / ⟨"-DSINGELI_X86_64"⟩ ∾ {singeli? ⟨"-mavx2"⟩ ∊ singeliCFlags; 0} / ⋈"-DSINGELI_AVX2" + args∾↩ (singeli ∧ arch≡"AARCH64") / ⟨"-DSINGELI_NEON"⟩ + args∾↩ (singeli ∧ ⊑arch<⊸∊"X86_64"‿"AARCH64") / ⟨"-DSINGELI_SIMD"⟩ args∾↩ ( wasm) / ⟨"-DWASM"⟩ args∾↩ ( wasi) / ⟨"-DWASI", "-DNO_MMAP", "-DUSE_SETJMP=0", "-D_WASI_EMULATED_MMAN", "--target=wasm32-wasi"⟩ args∾↩ ( emcc) / ⟨"-DEMCC", "-O3"⟩ @@ -358,13 +402,8 @@ po ← { # parsed options args∾↩ (replxx ∧ windows) / ⟨"-DUSE_REPLXX_IO"⟩ args∾↩ ( @≢versionName) / ⟨"-DHAS_VERSION"⟩ args∾↩ ( usz≡64) / ⟨"-DUSZ_64"⟩ - args∾↩ (∨´"slow-pdep"⊸≡¨ has) / ⟨"-DSLOW_PDEP"⟩ - args∾↩ { - native? ⟨"-march=native"⟩; - ⟨⟩: ⟨⟩; - "Error: Cannot use has=... if Singeli isn't enabled"_assert_⊢ singeli - siCFlags - } has + args∾↩ (⊑"slow-pdep"<⊸∊ has) / ⟨"-DSLOW_PDEP"⟩ + args∾↩ {native? ⟨"-march=native"⟩; singeliCFlags} args ↩ args (¬∘∊/⊣) GetOpt "rm_f" {"CBQN C compiler: "∾•Repr 𝕩} _verboseLog args args @@ -694,7 +733,7 @@ cachedBin‿linkerCache ← { ⟨"src/utils/", "ryu.c", "utf.c", "hash.c", "file.c", "mut.c", "each.c", "bits.c"⟩ ⟩ cbqnSrc ↩ cbqnSrc clangd.Files "src" - singeliMap ← 1↓¨ ({∨´ (⥊⊑po.arch) ∊ 𝕩}¨ ⊑¨)⊸/ ⟨ + singeliMap ← 1↓¨ ({⊑ ({"X86_64":'x'; "AARCH64":'a'; "RV64":'g'; "NONE":'g'} po.arch) ∊ 𝕩}¨ ⊑¨)⊸/ ⟨ "xa."‿"src/builtins/arithm.c"‿"monarith", "xa."‿"src/builtins/compare.c"‿"equal", "xa."‿"src/builtins/arithd.c"‿"dyarith", "xa."‿"src/builtins/cmp.c"‿"cmp", "xa."‿"src/builtins/squeeze.c"‿"squeeze", "xa."‿"src/utils/mut.c"‿"copy", @@ -722,7 +761,7 @@ cachedBin‿linkerCache ← { singeliObjs ← @ singeliCache ← { ¬po.singeli? @; - singeliCache ← GetCache ⟨"singeli", "Singeli generated code location", ⟨po.native, po.arch, po.usz, po.has, po.singeliFlags, po.singeliDir⟩⟩ + singeliCache ← GetCache ⟨"singeli", "Singeli generated code location", ⟨po.native, po.singeliArch, po.arch, po.usz, po.has, po.singeliFlags, po.singeliDir⟩⟩ # genArithTables ga ← "src/singeli/src/genArithTables.bqn" @@ -738,11 +777,11 @@ cachedBin‿linkerCache ← { singeliArgs ← ∾⟨ po.singeliFlags ⟨"-l", "gen="∾AtRoot singeliCache.folder, "-c", "usz=u"∾•Repr po.usz⟩ - (⊑"slow-pdep"<⊸∊po.has)/⟨"-c", "SLOW_PDEP=1"⟩ + (⊑"slow-pdep"<⊸∊ po.has) / ⟨"-c", "SLOW_PDEP=1"⟩ {po.native? ⟨⟩; "-a" ⋈ 1↓∾ ','⊸∾¨ po.singeliArch} ⟩ {𝕊: "Singeli args: "∾•Repr singeliArgs} _verboseLog @ - {𝕊: "Singeli-required C args: "∾•Repr po.siCFlags; @} _verboseLog @ + {𝕊: "Singeli-determined C arch: "∾•Repr po.singeliCFlags; @} _verboseLog @ singeliObjs ↩ {MakeSingeliInv ⟨singeliArgs, {𝕊:UpdateSubmodule po.singeliDir}, singeliCache, 𝕩, "src/singeli/src/"•file.At 𝕩∾".singeli", (𝕩≡"dyarith")/⟨gaRule⟩⟩}¨ 1⊑¨singeliMap singeliCache diff --git a/makefile b/makefile index 4da6b7f4..4c33448f 100644 --- a/makefile +++ b/makefile @@ -86,7 +86,7 @@ endif @build/build from-makefile CC="$(CC)" CXX="$(CXX)" PIE="$(ENABLE_PIE)" OUTPUT="$(OUTPUT)" j="$(j)" \ verbose="$(verbose)" notui="$(notui)" v="$(version)" stored-warn="$(stored-warn)" \ f="$(f)" lf="$(lf)" CCFLAGS="$(CCFLAGS)" LDFLAGS="$(LDFLAGS)" REPLXX_FLAGS="$(REPLXX_FLAGS)" CXXFLAGS="$(CXXFLAGS)" \ - LD_LIBS="$(LD_LIBS)" NO_LDL="$(NO_LDL)" no_fPIC="$(no_fPIC)" \ + LD_LIBS="$(LD_LIBS)" NO_LDL="$(NO_LDL)" no_fPIC="$(no_fPIC)" target-from-cc="$(target_from_cc)" \ c="$(build_c)" debug="$(debug)" $(i_build_opts) $(build_opts) \ os="$(target_os)" arch="$(target_arch)" has="$(has)" usz="$(usz)" nogit="$(nogit)" \ shared="$(i_SHARED)" singeli="$(i_singeli_1)" replxx="$(i_REPLXX_1)" FFI="$(FFI)"