syntax trees for Schematika parser
  • C++ 95.6%
  • CMake 4.4%
Find a file
2025-11-10 18:17:20 -05:00
.github/workflows github: + libbsd-dev dep 2025-09-04 00:09:28 -04:00
_static/img xo-umbrella: + docs support files 2025-06-22 16:19:21 -05:00
cmake + LinearAlloc + utest 2025-07-29 07:17:35 -05:00
docs xo-object: generative GC utest + reinstate coverage build 2025-08-06 09:30:37 -05:00
etc xo-imgui: + example ex4a. resize working on ubuntu (ex4 broken tho) 2025-11-10 16:50:26 -05:00
pkgs nix build: xo-jit: build+install docs+examples: xo-jit.nix ++ 2025-09-22 12:55:49 -04:00
xo-alloc xo-imgui: clang compiler nits 2025-08-29 19:33:09 -04:00
xo-callback xo-callback xo-alloc: + GC copy callbacks + unique_ptr cbset support 2025-08-12 12:53:06 -05:00
xo-cmake xo-build: add with-vulkan arg 2025-09-23 00:53:05 -04:00
xo-distribution Add 'xo-distribution/' from commit '036ca5d817' 2025-05-11 15:52:36 -05:00
xo-expression xo-expression: build: install examples 2025-09-22 12:29:05 -04:00
xo-flatstring xo-flatstring: build: install examples if XO_ENABLE_EXAMPLES 2025-09-22 12:29:29 -04:00
xo-imgui xo-imgui: refactor: separate VulkanApp TU for ex4a 2025-11-10 18:17:20 -05:00
xo-indentlog xo-indentlog: build: cosmetic 2025-09-22 12:53:12 -04:00
xo-jit xo-jit: build: ignore llvm-owned maybe-uninitialized 2025-09-22 12:53:48 -04:00
xo-kalmanfilter Add 'xo-kalmanfilter/' from commit '2ced8429c0' 2025-05-11 16:22:42 -05:00
xo-object bugfix: missed #pragma once 2025-08-12 00:15:03 -05:00
xo-ordinaltree xo-ordinaltree: drop legacy lcov build 2025-08-06 09:31:28 -05:00
xo-printjson Add 'xo-printjson/' from commit '6743b9ef18' 2025-05-11 14:58:48 -05:00
xo-process xo-process: prefer xo::bp spelling to xo::ref::brw 2025-07-05 13:53:46 -05:00
xo-pydistribution Add 'xo-pydistribution/' from commit 'a142a0044c' 2025-05-11 15:57:32 -05:00
xo-pyexpression refactor xo::ast -> xo::scm + restore nodef ppdetail_atomic build 2025-07-28 10:13:25 -04:00
xo-pyjit refactor xo::ast -> xo::scm + restore nodef ppdetail_atomic build 2025-07-28 10:13:25 -04:00
xo-pykalmanfilter Add 'xo-pykalmanfilter/' from commit 'a9daaa3278' 2025-05-11 16:27:01 -05:00
xo-pyprintjson Add 'xo-pyprintjson/' from commit '36797a419a' 2025-05-11 15:05:03 -05:00
xo-pyprocess Add 'xo-pyprocess/' from commit 'c4af12c625' 2025-05-11 16:19:35 -05:00
xo-pyreactor Add 'xo-pyreactor/' from commit '50b8d529a7' 2025-05-11 15:14:43 -05:00
xo-pyreflect Add 'xo-pyreflect/' from commit '54d11b31a5' 2025-05-10 21:04:13 -05:00
xo-pyrprintjson Add 'xo-pyrprintjson/' from commit '36797a419a' 2025-05-11 15:02:26 -05:00
xo-pysimulator Add 'xo-pysimulator/' from commit 'f940051411' 2025-05-11 16:06:48 -05:00
xo-pyunit Add 'xo-pyunit/' from commit '4d0e708ea4' 2025-05-11 00:58:27 -05:00
xo-pyutil Add 'xo-pyutil/' from commit 'a2cb8ae60f' 2025-05-10 19:38:21 -05:00
xo-pywebsock + xo-pywebsock 2025-05-11 15:27:53 -05:00
xo-pywebutil Add 'xo-pywebutil/' from commit '578b3d724a' 2025-05-11 14:55:44 -05:00
xo-randomgen xo-randomgen: build: install examples with XO_ENABLE_EXAMPLES 2025-09-22 12:30:00 -04:00
xo-ratio xo-ratio: build fix for indentlog dep + install examples 2025-09-22 12:30:23 -04:00
xo-reactor pretty printing -- copmlete for xo::ast::GeneralizedExpression 2025-07-19 11:47:03 -05:00
xo-reader nix build: xo-reader: build + install docs+examples + build fix 2025-09-22 12:47:00 -04:00
xo-refcnt pretty printing -- copmlete for xo::ast::GeneralizedExpression 2025-07-19 11:47:03 -05:00
xo-reflect xo-reflect: bugfix is_i64 on linux (gcc / wsl2) 2025-07-27 14:31:39 -04:00
xo-reflectutil Add 'xo-reflectutil/' from commit '37ff6c2b01' 2025-05-10 20:12:01 -05:00
xo-simulator pretty printing -- copmlete for xo::ast::GeneralizedExpression 2025-07-19 11:47:03 -05:00
xo-statistics Add 'xo-statistics/' from commit 'ae49d8896a' 2025-05-11 15:42:06 -05:00
xo-subsys Add 'xo-subsys/' from commit '57eee82fa5' 2025-05-10 18:38:12 -05:00
xo-tokenizer xo-tokenizer: build + install docs + examples + build fixes 2025-09-22 12:45:30 -04:00
xo-unit xo-unit: bugfix: need ppdetail_atomic guard 2025-09-22 21:12:13 -04:00
xo-websock use xo::bp instead of xo::ref::brw 2025-07-05 13:55:00 -05:00
xo-webutil Add 'xo-webutil/' from commit '8e75838950' 2025-05-11 14:48:17 -05:00
.gitignore + .gitignore 2025-05-10 12:17:19 -05:00
CMakeLists.txt xo-build: + xo_indentlog docs in umbrella doxygen list 2025-09-23 00:48:10 -04:00
conf.py xo-tokenizer: docs + error-handling improvement 2025-06-23 23:08:12 -05:00
default.nix build + xo-imgui: now working (except ex4) on ubuntu 2025-11-10 14:36:43 -05:00
Doxyfile.in xo-umbrella: + docs support files 2025-06-22 16:19:21 -05:00
index.rst + xo-alloc + xo-object + xo-alloc docs + GC utests 2025-08-03 15:59:38 -05:00
README.md build + xo-imgui: now working (except ex4) on ubuntu 2025-11-10 14:36:43 -05:00

Introduction

Local nix build for xo libraries. Intended for local development work, with source in immediate subdirectories.

Features

  • native c++
  • deterministic simulation
  • reflection
  • python bindings

Getting Started

Nix shell (reproducible development environment)

If nix is available, can get several reproducible build environments.

Pick one for a session:

$ cd xo-umbrella2
$ nix-shell -A shell0  # just nix stdenv: make,gcc,bash etc.
$ nix-shell -A shell1  # stable environment
$ nix-shell -A shell2  # stable environment + emacs + lsp
$ nix-shell -A shell3  # stable environment + emacs + lsp + xorg/opengl/vulkan/imgui stack (wsl2-only)
$ nix-shell -A shell4  # wsl2-specific. like shell3, vkcube works (at least on WSL)
$ nix-shell -A shell5  # wsl2-specific. uses dxg driver for "hardware acceleration"
$ nix-shell -A shell   # (deprecated) bleeding edge environment

Run emacs (for example) from within chosen seesion. We need this ordering because nix-shell determines vital details like location of shared libraries, including libraries used by running IDE.

$ emacs

Cmake build

If nix is available, you probably prefer the nix build. Otherwise continue reading..

The cmake build has two phases, because it needs to bootstrap generated xo-cmake-config, xo-build helpers.

$ cd xo
$ PREFIX=/path/to/say/usr/local
# phase 1
$ cmake -B .build0 -S xo-cmake -DCMAKE_INSTALL_PREFIX=${PREFIX}
$ cmake --build .build0
$ cmake --install .build0
# phase 2
$ cmake -B .build -S . -DCMAKE_INSTALL_PREFIX=${PREFIX} -DXO_ENABLE_EXAMPLES=1
$ cmake --build .build --verbose
$ cmake --install .build

or with Vulkan examples

# at start of phase 2
$ cmake -B .build -S . -DCMAKE_INSTALL_PREFIX=${PREFIX} -DXO_ENABLE_EXAMPLES=1 -DXO_ENABLE_VULKAN=1

Nix Build

Nix build uses toplevel default.nix, along with top-level pkgs/xo-foo.nix for each subproject foo. It doesn't interact with toplevel CMakeLists.txt.

$ nix-build -A xo-userenv

This builds all xo subprojects, assembles sandbox under ./result.

$ tree -L 1 ./result
./result
├── bin
│   ├── xo-build
│   ├── xo-cmake-config
│   └── xo-cmake-lcov-harness
└── share
    ├── cmake
    │   └── xo_macros
    │       ├── code-coverage.cmake
    │       ├── xo-project-macros.cmake
    │       └── xo_cxx.cmake
    ├── etc
    │   └── xo
    │       └── subsystem-list
    └── xo-macros
        ├── Doxyfile.in
        ├── gen-ccov.in
        └── xo-bootstrap-macros.cmake

For completeness' sake: can also use

$ nix-build -A xo-userenv-slow

Same result as $nix-build -A xo-userenv, but builds each package serially using xo-build.

Nix + Vulkan

Currently (Nov 2025) only affects xo-umbrella2/xo-imgui.

Non-trivial, because:

  1. must use host OS for gpu drivers. nixpkgs has drivers, but they're setup to work from nixos.
  2. want to use nixpkgs for the GPU-independent portion of graphics stack.

Complication because host gpu drivers in a "big swimming pool" such as /usr/lib/x86_64-linux-gnu/ that contains both libraries that must come from host OS (e.g. libGLX_nvidia) and libraries that must come from nixpkgs (e.g. libc)

Finesse by introducing a directory-of-symlinks, see xo-umbrella2/etc/{hostegl, hostubuntu}. These currently setup by hand, so likely to need manual attention on another host.

An ordinary cmake build may cheerfully use the host-provided graphics stack, in return for higher risk of DLL hell.

Coverage Build

Prepare build

# phase 2
$ cmake -B .build -S . -DCMAKE_INSTALL_PREFIX=${PREFIX} -DCMAKE_BUILD_TYPE=coverage

Run coverage-enabled unit tests

$ (cd .build && ctest)

Generate coverage report

$ .build/gen-ccov

Html report left in .build/ccov/html/index.html

To view docs from WSL

  1. find wsl IP address
$ hostname -I
  1. run nix build
$ nix-build -A xo-userenv
  1. serve docs from some available port
$ (cd result && python3 -m http.server 3000)
  1. browse to ":3000/share/doc/xo-flatstring/html" from windows

To add a new satellite repo

  1. check clone in clean state (all local changes committed or unwound)

  2. add satellite as remote

$ git remote add xo-foo git@github.com:Rconybea/xo-foo.git
$ git fetch xo-foo
  1. checkout satellite repo
$ git subtree add --prefix=xo-foo xo-foo main