This document describes how to build Kiren from source.
Kiren requires Zig 0.14.0 or later.
macOS (Homebrew):
brew install zigLinux:
# Download from ziglang.org
wget https://ziglang.org/download/0.14.0/zig-linux-x86_64-0.14.0.tar.xz
tar -xf zig-linux-x86_64-0.14.0.tar.xz
export PATH=$PATH:$PWD/zig-linux-x86_64-0.14.0Windows:
# Download from ziglang.org or use scoop
scoop install zigVerify installation:
zig version
# Output: 0.14.0Zig includes a C compiler, but system headers may be required on some platforms.
macOS:
xcode-select --installLinux (Debian/Ubuntu):
sudo apt install build-essentialLinux (Fedora):
sudo dnf install gcc glibc-develgit clone https://github.com/user/kiren.git
cd kirenThe repository includes QuickJS as a submodule in deps/quickjs/.
For development with debug symbols and runtime checks:
zig buildOutput: zig-out/bin/kiren
For production use with optimizations:
zig build -Doptimize=ReleaseFastThis produces a smaller, faster binary.
For minimal binary size:
zig build -Doptimize=ReleaseSmall| Option | Description |
|---|---|
-Doptimize=Debug |
Debug build (default) |
-Doptimize=ReleaseFast |
Optimized for speed |
-Doptimize=ReleaseSmall |
Optimized for size |
-Doptimize=ReleaseSafe |
Release with safety checks |
zig build run -- script.js./zig-out/bin/kiren script.js./zig-out/bin/kiren server.js --port 3000Arguments after the script name are available via process.argv.
zig build test# Run individual test
./zig-out/bin/kiren tests/api/buffer.test.js
# Run all API tests
for f in tests/api/*.test.js; do
echo "Running $f"
./zig-out/bin/kiren "$f"
done
# Run HTTP tests (starts servers)
./zig-out/bin/kiren tests/http/simple.test.jsZig supports cross-compilation out of the box.
zig build -Dtarget=x86_64-linux-gnu -Doptimize=ReleaseFastzig build -Dtarget=x86_64-windows-gnu -Doptimize=ReleaseFastzig build -Dtarget=aarch64-linux-gnu -Doptimize=ReleaseFastList all available targets:
zig targets | jq '.native'Common targets:
x86_64-linux-gnuaarch64-linux-gnux86_64-macosaarch64-macosx86_64-windows-gnu
# Build release version
zig build -Doptimize=ReleaseFast
# Copy to local bin
cp zig-out/bin/kiren ~/.local/bin/
# Or system-wide (requires sudo)
sudo cp zig-out/bin/kiren /usr/local/bin/kiren --versionInstall system development headers:
# macOS
xcode-select --install
# Ubuntu/Debian
sudo apt install libc6-dev
# Fedora
sudo dnf install glibc-develQuickJS requires specific C compiler flags. These are configured in build.zig:
const c_flags = [_][]const u8{
"-DCONFIG_VERSION=\"2024-01-13\"",
"-DCONFIG_BIGNUM",
"-D_GNU_SOURCE",
"-fno-sanitize=undefined",
"-fwrapv",
};Clear the build cache:
rm -rf .zig-cache zig-out
zig buildLarge projects may require more memory. If build fails with memory errors:
# Reduce parallel jobs
zig build -j1Zig automatically performs incremental builds. After initial compilation, subsequent builds only recompile changed files.
For continuous development, use a file watcher:
# Using entr (install via package manager)
find src -name "*.zig" | entr -c zig build run -- examples/server.js
# Using watchexec
watchexec -e zig "zig build run -- examples/server.js"Build with debug symbols:
zig buildUse lldb or gdb:
lldb ./zig-out/bin/kiren -- script.jsTypical binary sizes:
| Build Type | Size |
|---|---|
| Debug | ~8 MB |
| ReleaseFast | ~2 MB |
| ReleaseSmall | ~1.5 MB |
To further reduce size:
# Build small
zig build -Doptimize=ReleaseSmall
# Strip debug symbols (if any remain)
strip zig-out/bin/kirenExample GitHub Actions workflow:
name: Build
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Zig
uses: goto-bus-stop/setup-zig@v2
with:
version: 0.14.0
- name: Build
run: zig build -Doptimize=ReleaseFast
- name: Test
run: zig build test