From 3c0370fd85c9d63b8560151b029a815d12934f02 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 25 Feb 2026 11:18:29 +1100 Subject: [PATCH 01/35] build: osx default.nix carveouts --- default.nix | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/default.nix b/default.nix index 13c087a7..05c72fae 100644 --- a/default.nix +++ b/default.nix @@ -6,8 +6,8 @@ { # official 24.05 release # nearly works on macos, clang17, llvm18 except for sphinx-contrib.ditaa # probably whould be nixos-25.05.tar.gz here -# nixpkgs-path ? fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixos-24.05.tar.gz", - nixpkgs-path ? ../nixpkgs, + nixpkgs-path ? fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixos-24.11.tar.gz", +# nixpkgs-path ? ../nixpkgs, # pkgs ? import (fetchTarball { # # 24.05-darwin works on macos, clang17, llvm 18 (copying from xo-nix2) @@ -256,7 +256,11 @@ let pkgs.emacsPackages.notmuch pkgs.inconsolata-lgc pkgs.fontconfig +] +++ (if pkgs.stdenv.isLinux then [ pkgs.ghostty +] else []) +++ [ pkgs.timg pkgs.fish pkgs.nushell @@ -273,9 +277,9 @@ let pkgs.lcov pkgs.catch2 - pkgs.gdb ] ++ (if pkgs.stdenv.isLinux then [ + pkgs.gdb pkgs.strace ] else []) ++ [ @@ -287,7 +291,11 @@ let pkgs.openssh pkgs.ccache +] +++ (if pkgs.stdenv.isLinux then [ pkgs.distcc +] else []) + ++ [ pkgs.cmake pkgs.pkg-config pkgs.unzip @@ -336,7 +344,7 @@ let pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.darwin.moltenvk ] ++ - [ + pkgs.lib.optionals pkgs.stdenv.isLinux [ pkgs.vulkan-tools pkgs.vulkan-loader pkgs.vulkan-headers @@ -388,7 +396,7 @@ let pkgs.libxml2 pkgs.libffi - pkgs.elfutils # for libelf.so + pkgs.elfutils pkgs.ncurses # for libtinfo.so pkgs.expat pkgs.zstd @@ -615,7 +623,7 @@ in pkgs.libxml2 pkgs.libffi - pkgs.elfutils # for libelf.so + pkgs.elfutils pkgs.ncurses # for libtinfo.so pkgs.expat pkgs.zstd From e0ce3e1a78b4d47656a9ed0f84ff8e351bdfb3bc Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 25 Feb 2026 11:31:22 +1100 Subject: [PATCH 02/35] osx: shell3 running w/ nixpkgs-24.11 --- default.nix | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/default.nix b/default.nix index 05c72fae..c05c74eb 100644 --- a/default.nix +++ b/default.nix @@ -344,8 +344,7 @@ let pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.darwin.moltenvk ] ++ - pkgs.lib.optionals pkgs.stdenv.isLinux [ - pkgs.vulkan-tools + [ pkgs.vulkan-tools pkgs.vulkan-loader pkgs.vulkan-headers pkgs.vulkan-validation-layers @@ -382,7 +381,7 @@ let # elfutils, ncurses, expat, zstd, zlib, libbsd, gcc.cc.lib) # glxgears runs at ~170fps # - glpath = pkgs.lib.makeLibraryPath [ + glpath = pkgs.lib.makeLibraryPath ([ pkgs.wayland # for libwayland-client.so pkgs.xorg.libXau @@ -396,7 +395,8 @@ let pkgs.libxml2 pkgs.libffi - pkgs.elfutils + ] ++ (if pkgs.stdenv.isLinux then [ pkgs.elfutils ] else []) + ++ [ pkgs.ncurses # for libtinfo.so pkgs.expat pkgs.zstd @@ -404,7 +404,7 @@ let pkgs.libbsd pkgs.gcc.cc.lib # for libstdc++.so (won't blow up cmake, only touching LD_LIBRARY_PATH) - ]; + ]); in '' # CXENV: cosmetic: coordinates with ~/proj/env/dotfiles/bashrc to drive PS1 @@ -610,7 +610,7 @@ in # elfutils, ncurses, expat, zstd, zlib, libbsd, gcc.cc.lib) # glxgears runs at ~170fps # - glpath = pkgs.lib.makeLibraryPath [ + glpath = pkgs.lib.makeLibraryPath ([ pkgs.wayland # for libwayland-client.so pkgs.xorg.libXau @@ -623,7 +623,8 @@ in pkgs.libxml2 pkgs.libffi - pkgs.elfutils + ] ++ (if pkgs.stdenv.isLinux then [ pkgs.elfutils ] else []) + ++ [ pkgs.ncurses # for libtinfo.so pkgs.expat pkgs.zstd @@ -631,7 +632,7 @@ in pkgs.libbsd pkgs.gcc.cc.lib # for libstdc++.so (won't blow up cmake, only touching LD_LIBRARY_PATH) - ]; + ]); in '' # CXENV: cosmetic: coordinates with ~/proj/env/dotfiles/bashrc to drive PS1 From e5e95a8737f3e94f40505f256ec1f958f2033267 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 25 Feb 2026 17:05:45 +1100 Subject: [PATCH 03/35] indentlog: fix utest for OSX --- xo-indentlog/utest/log_streambuf.test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xo-indentlog/utest/log_streambuf.test.cpp b/xo-indentlog/utest/log_streambuf.test.cpp index fc3968be..1e38a01e 100644 --- a/xo-indentlog/utest/log_streambuf.test.cpp +++ b/xo-indentlog/utest/log_streambuf.test.cpp @@ -77,7 +77,7 @@ namespace ut { //REQUIRE(sbuf.lo() == sbuf.pbase()); - auto expected = string_view("empty log_streambuf :sbuf.lo 0 :sbuf.hi 0 :sbuf.color_escape_chars 0"); + auto expected = string_view("empty log_streambuf :sbuf.lo 0x0 :sbuf.hi 0x0 :sbuf.color_escape_chars 0"); REQUIRE(string_view(sbuf) == expected); From 93dec12e9e9182f90d7a41a8a20b99123971df0c Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 25 Feb 2026 17:06:35 +1100 Subject: [PATCH 04/35] minor doc fix --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index f2f0ba0e..11d705d0 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ $ 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-osx # stable environment + emacs + lsp + imgui stack (osx-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 @@ -157,6 +158,12 @@ $ nix-build -A xo-userenv-slow Same result as `$nix-build -A xo-userenv`, but builds each package serially using `xo-build`. +Finally, can also individual XO packages: +``` +$ nix-build -A xo.cmake +... +``` + #### Nix + SDL2 + Vulkan + ImGui Currently (Nov 2025) only affects `xo-umbrella2/xo-imgui`. From 3c5af1e5e4fb3873d0ea72ecb536c665eb4e30b2 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 25 Feb 2026 17:07:00 +1100 Subject: [PATCH 05/35] emacs setup + xo-arena build --- default.nix | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/default.nix b/default.nix index c05c74eb..93d476dc 100644 --- a/default.nix +++ b/default.nix @@ -138,10 +138,11 @@ let xo-refcnt = self.callPackage pkgs/xo-refcnt.nix {}; xo-subsys = self.callPackage pkgs/xo-subsys.nix {}; xo-randomgen = self.callPackage pkgs/xo-randomgen.nix { buildExamples = true; }; + xo-reflectutil = self.callPackage pkgs/xo-reflectutil.nix {}; + xo-arena = self.callPackage pkgs/xo-arena.nix {}; xo-ordinaltree = self.callPackage pkgs/xo-ordinaltree.nix {}; xo-flatstring = self.callPackage pkgs/xo-flatstring.nix { buildDocs = true; buildExamples = true; }; xo-pyutil = self.callPackage pkgs/xo-pyutil.nix {}; - xo-reflectutil = self.callPackage pkgs/xo-reflectutil.nix {}; xo-reflect = self.callPackage pkgs/xo-reflect.nix {}; xo-pyreflect = self.callPackage pkgs/xo-pyreflect.nix {}; xo-ratio = self.callPackage pkgs/xo-ratio.nix { buildDocs = true; buildExamples = true; }; @@ -244,19 +245,43 @@ let pkgs.libbsd ]; + # emacs + emacs4xo = (pkgs.emacsPackagesFor pkgs.emacs30).emacsWithPackages (epkgs: with epkgs; [ + lsp-mode + lsp-ui + lsp-ivy + flycheck + ivy + rg + transient # magit dep + nix-mode + yaml-mode + htmlize + magit + exec-path-from-shell + highlight + surround + projectile + treemacs + treemacs-projectile + company + cmake-mode + which-key + xterm-color + yasnippet + ]); + # xo ide utils ideutils = [ pkgs.gsettings-desktop-schemas - pkgs.emacs30 -# (pkgs.emacs.pkgs.withPackages (epkgs: [ -# ])) + emacs4xo # pkgs.emacs-pgtk # wayland with treesitter; alternatively pkgs.emacs30 for emacs+tree-sitter pkgs.tree-sitter # CLI tool, but not grammars pkgs.notmuch pkgs.emacsPackages.notmuch pkgs.inconsolata-lgc pkgs.fontconfig -] +] ++ (if pkgs.stdenv.isLinux then [ pkgs.ghostty ] else []) @@ -457,6 +482,7 @@ in refcnt = pkgs.xo-refcnt; subsys = pkgs.xo-subsys; randomgen = pkgs.xo-randomgen; + arena = pkgs.xo-arena; ordinaltree = pkgs.xo-ordinaltree; flatstring = pkgs.xo-flatstring; pyutil = pkgs.xo-pyutil; From 681e76bc2d35b2ae0a158ff5968a3e010b02ce52 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 25 Feb 2026 17:07:14 +1100 Subject: [PATCH 06/35] + pkgs/README.md --- pkgs/README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 pkgs/README.md diff --git a/pkgs/README.md b/pkgs/README.md new file mode 100644 index 00000000..43ceb7e4 --- /dev/null +++ b/pkgs/README.md @@ -0,0 +1,5 @@ +### Notes + +propagatedBuildInputs: when providing definition for a package xo-foo: +dependencies xo-foo needs, that will also be transitive for some other package +that uses xo-foo. From 6a57bf398fa9936a0e4888dc4169c1d18c029bda Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 25 Feb 2026 17:08:14 +1100 Subject: [PATCH 07/35] xo-arena: + nix build --- pkgs/xo-arena.nix | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 pkgs/xo-arena.nix diff --git a/pkgs/xo-arena.nix b/pkgs/xo-arena.nix new file mode 100644 index 00000000..6daab810 --- /dev/null +++ b/pkgs/xo-arena.nix @@ -0,0 +1,28 @@ +{ + # nixpkgs dependencies + stdenv, cmake, catch2, + + # xo dependencies + xo-cmake, +# xo-refcnt, + xo-reflectutil, + xo-indentlog, +} : + +stdenv.mkDerivation (finalattrs: + { + name = "xo-arena"; + + src = ../xo-arena; + + cmakeFlags = ["-DCMAKE_MODULE_PATH=${xo-cmake}/share/cmake"]; + doCheck = true; + nativeBuildInputs = [ + cmake catch2 xo-cmake + ]; + propagatedBuildInputs = [ +# xo-refcnt + xo-reflectutil + xo-indentlog + ]; + }) From ffa6682f1cebaa8a57f7b9e7d381364d861f3ae5 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 00:10:47 +1100 Subject: [PATCH 08/35] xo-cmake: + xo-reconfigure.in install --- xo-cmake/CMakeLists.txt | 1 + xo-cmake/share/xo-macros/xo-reconfigure.in | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/xo-cmake/CMakeLists.txt b/xo-cmake/CMakeLists.txt index 14226afa..51f2a45a 100644 --- a/xo-cmake/CMakeLists.txt +++ b/xo-cmake/CMakeLists.txt @@ -62,6 +62,7 @@ install( "share/xo-macros/gen-ccov.in" "share/xo-macros/Doxyfile.in" "share/xo-macros/xo-bootstrap-macros.cmake" + "share/xo-macros/xo-reconfigure.in" PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE DESTINATION ${CMAKE_INSTALL_DATADIR}/xo-macros ) diff --git a/xo-cmake/share/xo-macros/xo-reconfigure.in b/xo-cmake/share/xo-macros/xo-reconfigure.in index 41d641c6..d3e55e55 100644 --- a/xo-cmake/share/xo-macros/xo-reconfigure.in +++ b/xo-cmake/share/xo-macros/xo-reconfigure.in @@ -23,7 +23,9 @@ while [[ $# -gt 0 ]]; do *) echo "error: xo-reconfigure: unexpected argument [$1]" echo "usage: xo-reconfigure" - echo " xo-reconfigure [-n] -- CMAKE_ARGS" + echo " xo-reconfigure [-n|--dry-run]" + echo " [--enable-testing|--disable-testing]" + echo " -- CMAKE_ARGS" exit 1 esac From ef64727d79a53ebe49007f61e72fad734362f817 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 00:40:47 +1100 Subject: [PATCH 09/35] xo-arena: fix paths for when xo-arena is a nix-build dep --- CMakeLists.txt | 4 ++-- xo-arena/include/xo/arena/hashmap/DArenaHashMapIterator.hpp | 2 +- xo-arena/include/xo/arena/hashmap/HashMapStore.hpp | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 592bf697..e12def34 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,8 +82,8 @@ add_subdirectory(xo-cmake) add_subdirectory(xo-indentlog) add_subdirectory(xo-reflectutil) # header-only reflect support add_subdirectory(xo-randomgen) # xoshiro256ss -add_subdirectory(xo-arena) # arena allocator (DArena) -add_subdirectory(xo-facet) # sep iface,data +add_subdirectory(xo-arena) # arena allocator (DArena) +add_subdirectory(xo-facet) # sep iface,data add_subdirectory(xo-allocutil) add_subdirectory(xo-refcnt) add_subdirectory(xo-subsys) diff --git a/xo-arena/include/xo/arena/hashmap/DArenaHashMapIterator.hpp b/xo-arena/include/xo/arena/hashmap/DArenaHashMapIterator.hpp index ea87c0ce..77c450d7 100644 --- a/xo-arena/include/xo/arena/hashmap/DArenaHashMapIterator.hpp +++ b/xo-arena/include/xo/arena/hashmap/DArenaHashMapIterator.hpp @@ -5,7 +5,7 @@ #pragma once -#include "hashmap/DArenaHashMapUtil.hpp" +#include namespace xo { namespace map { diff --git a/xo-arena/include/xo/arena/hashmap/HashMapStore.hpp b/xo-arena/include/xo/arena/hashmap/HashMapStore.hpp index 6393bb02..23b9d31f 100644 --- a/xo-arena/include/xo/arena/hashmap/HashMapStore.hpp +++ b/xo-arena/include/xo/arena/hashmap/HashMapStore.hpp @@ -5,8 +5,8 @@ #pragma once -#include "hashmap/DArenaHashMapUtil.hpp" -#include "hashmap/ControlGroup.hpp" +#include +#include namespace xo { namespace map { @@ -52,7 +52,7 @@ namespace xo { float load_factor() const noexcept { return size_ / static_cast(n_slot_); } void visit_pools(const MemorySizeVisitor & visitor) const { - // complexity here in service of HashMapStore-specific value for MemorySizeInfo.used + // complexity here in service of HashMapStore-specific value for MemorySizeInfo.used MemorySizeInfo ctl_info; MemorySizeInfo slot_info; From a14c257b5e1066c56240ae7af121c6a2afbfb340 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 00:42:28 +1100 Subject: [PATCH 10/35] build: xo-facet: nix-build -A xo.facet --- default.nix | 4 +++- pkgs/xo-facet.nix | 30 ++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 pkgs/xo-facet.nix diff --git a/default.nix b/default.nix index 93d476dc..bdfe93b1 100644 --- a/default.nix +++ b/default.nix @@ -135,11 +135,12 @@ let { xo-cmake = self.callPackage pkgs/xo-cmake.nix {}; xo-indentlog = self.callPackage pkgs/xo-indentlog.nix { buildDocs = true; buildExamples = true; }; - xo-refcnt = self.callPackage pkgs/xo-refcnt.nix {}; xo-subsys = self.callPackage pkgs/xo-subsys.nix {}; xo-randomgen = self.callPackage pkgs/xo-randomgen.nix { buildExamples = true; }; xo-reflectutil = self.callPackage pkgs/xo-reflectutil.nix {}; xo-arena = self.callPackage pkgs/xo-arena.nix {}; + xo-facet = self.callPackage pkgs/xo-facet.nix {}; + xo-refcnt = self.callPackage pkgs/xo-refcnt.nix {}; xo-ordinaltree = self.callPackage pkgs/xo-ordinaltree.nix {}; xo-flatstring = self.callPackage pkgs/xo-flatstring.nix { buildDocs = true; buildExamples = true; }; xo-pyutil = self.callPackage pkgs/xo-pyutil.nix {}; @@ -483,6 +484,7 @@ in subsys = pkgs.xo-subsys; randomgen = pkgs.xo-randomgen; arena = pkgs.xo-arena; + facet = pkgs.xo-facet; ordinaltree = pkgs.xo-ordinaltree; flatstring = pkgs.xo-flatstring; pyutil = pkgs.xo-pyutil; diff --git a/pkgs/xo-facet.nix b/pkgs/xo-facet.nix new file mode 100644 index 00000000..79fec39c --- /dev/null +++ b/pkgs/xo-facet.nix @@ -0,0 +1,30 @@ +{ + # nixpkgs dependencies + stdenv, cmake, catch2, + + # xo dependencies + xo-cmake, + xo-arena, +# xo-reflectutil, +# xo-indentlog, +} : + +stdenv.mkDerivation (finalattrs: + { + name = "xo-facet"; + + src = ../xo-facet; + + cmakeFlags = ["-DCMAKE_MODULE_PATH=${xo-cmake}/share/cmake" + "-DENABLE_TESTING=1" + ]; + doCheck = true; + nativeBuildInputs = [ + cmake catch2 xo-cmake + ]; + propagatedBuildInputs = [ + xo-arena +# xo-reflectutil +# xo-indentlog + ]; + }) From 1ae0ebd6008ebb4e276ce53f8f8a226825c3bfaa Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 00:47:49 +1100 Subject: [PATCH 11/35] xo-arena: nix-build works, including utest --- CMakeLists.txt | 1 - pkgs/xo-arena.nix | 10 ++++++---- xo-indentlog/utest/CMakeLists.txt | 12 +++++------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e12def34..d31de7cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,7 +87,6 @@ add_subdirectory(xo-facet) # sep iface,data add_subdirectory(xo-allocutil) add_subdirectory(xo-refcnt) add_subdirectory(xo-subsys) -#add_subdirectory(xo-randomgen) add_subdirectory(xo-flatstring) add_subdirectory(xo-pyutil) add_subdirectory(xo-reflect) diff --git a/pkgs/xo-arena.nix b/pkgs/xo-arena.nix index 6daab810..b216ba6c 100644 --- a/pkgs/xo-arena.nix +++ b/pkgs/xo-arena.nix @@ -4,7 +4,7 @@ # xo dependencies xo-cmake, -# xo-refcnt, + xo-randomgen, xo-reflectutil, xo-indentlog, } : @@ -15,13 +15,15 @@ stdenv.mkDerivation (finalattrs: src = ../xo-arena; - cmakeFlags = ["-DCMAKE_MODULE_PATH=${xo-cmake}/share/cmake"]; + cmakeFlags = ["-DCMAKE_MODULE_PATH=${xo-cmake}/share/cmake" + "-DENABLE_TESTING=1" + ]; doCheck = true; nativeBuildInputs = [ - cmake catch2 xo-cmake + cmake catch2 + xo-cmake xo-randomgen ]; propagatedBuildInputs = [ -# xo-refcnt xo-reflectutil xo-indentlog ]; diff --git a/xo-indentlog/utest/CMakeLists.txt b/xo-indentlog/utest/CMakeLists.txt index 5fa2bf1b..b22b4eb8 100644 --- a/xo-indentlog/utest/CMakeLists.txt +++ b/xo-indentlog/utest/CMakeLists.txt @@ -6,12 +6,10 @@ set(SELF_SOURCE_FILES filename.test.cpp code_location.test.cpp function.test.cpp pretty_vector.test.cpp indentlog_utest_main.cpp log_streambuf.test.cpp toppstr.test.cpp cond.test.cpp) -xo_add_utest_executable(${SELF_EXECUTABLE_NAME} ${SELF_SOURCE_FILES}) - -# ---------------------------------------------------------------- -# 3rd party dependency: catch2 - -xo_self_dependency(${SELF_EXECUTABLE_NAME} indentlog) -xo_external_target_dependency(${SELF_EXECUTABLE_NAME} Catch2 Catch2::Catch2) +if (ENABLE_TESTING) + xo_add_utest_executable(${SELF_EXECUTABLE_NAME} ${SELF_SOURCE_FILES}) + xo_self_dependency(${SELF_EXECUTABLE_NAME} indentlog) + xo_external_target_dependency(${SELF_EXECUTABLE_NAME} Catch2 Catch2::Catch2) +endif() # end CMakeLists.txt From 41488b61680d07ec381ae7e387457ff6adf2076d Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 11:47:14 +1100 Subject: [PATCH 12/35] nix-build: xo-arena: build docs + minor doc facepalms --- default.nix | 2 +- pkgs/xo-arena.nix | 33 +++++++++++++++++++++---- xo-arena/CMakeLists.txt | 5 ++++ xo-arena/docs/AllocInfo-reference.rst | 26 +++++++++++++++++++ xo-arena/docs/cmpresult-reference.rst | 2 +- xo-arena/include/xo/arena/cmpresult.hpp | 2 +- 6 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 xo-arena/docs/AllocInfo-reference.rst diff --git a/default.nix b/default.nix index bdfe93b1..a1782e91 100644 --- a/default.nix +++ b/default.nix @@ -138,7 +138,7 @@ let xo-subsys = self.callPackage pkgs/xo-subsys.nix {}; xo-randomgen = self.callPackage pkgs/xo-randomgen.nix { buildExamples = true; }; xo-reflectutil = self.callPackage pkgs/xo-reflectutil.nix {}; - xo-arena = self.callPackage pkgs/xo-arena.nix {}; + xo-arena = self.callPackage pkgs/xo-arena.nix { buildDocs = true; }; xo-facet = self.callPackage pkgs/xo-facet.nix {}; xo-refcnt = self.callPackage pkgs/xo-refcnt.nix {}; xo-ordinaltree = self.callPackage pkgs/xo-ordinaltree.nix {}; diff --git a/pkgs/xo-arena.nix b/pkgs/xo-arena.nix index b216ba6c..4b67f35d 100644 --- a/pkgs/xo-arena.nix +++ b/pkgs/xo-arena.nix @@ -1,12 +1,19 @@ { # nixpkgs dependencies - stdenv, cmake, catch2, + lib, stdenv, cmake, catch2, + doxygen, + + python3Packages, + + sphinx, graphviz, # xo dependencies - xo-cmake, xo-randomgen, xo-reflectutil, xo-indentlog, + xo-cmake, + + buildDocs ? false, } : stdenv.mkDerivation (finalattrs: @@ -15,13 +22,29 @@ stdenv.mkDerivation (finalattrs: src = ../xo-arena; - cmakeFlags = ["-DCMAKE_MODULE_PATH=${xo-cmake}/share/cmake" - "-DENABLE_TESTING=1" - ]; + cmakeFlags = ["-DCMAKE_MODULE_PATH=${xo-cmake}/share/cmake"] + ++ lib.optionals buildDocs ["-DXO_ENABLE_DOCS=on"] + ++ ["-DENABLE_TESTING=1"]; + + inherit buildDocs; doCheck = true; + + postBuild = lib.optionalString buildDocs '' + cmake --build . -- docs + ''; + nativeBuildInputs = [ cmake catch2 xo-cmake xo-randomgen + ] ++ lib.optionals buildDocs [ + doxygen + sphinx + graphviz + python3Packages.sphinx-rtd-theme + python3Packages.breathe + python3Packages.sphinxcontrib-ditaa + python3Packages.sphinxcontrib-plantuml + python3Packages.pillow ]; propagatedBuildInputs = [ xo-reflectutil diff --git a/xo-arena/CMakeLists.txt b/xo-arena/CMakeLists.txt index 36fbfcb0..0b6c7020 100644 --- a/xo-arena/CMakeLists.txt +++ b/xo-arena/CMakeLists.txt @@ -28,4 +28,9 @@ add_subdirectory(utest) xo_export_cmake_config(${PROJECT_NAME} ${PROJECT_VERSION} ${PROJECT_NAME}Targets) +# ---------------------------------------------------------------- +# docs targets depend on all the other library/utest targets +# +add_subdirectory(docs) + # end CMakeLists.txt diff --git a/xo-arena/docs/AllocInfo-reference.rst b/xo-arena/docs/AllocInfo-reference.rst new file mode 100644 index 00000000..05da0eac --- /dev/null +++ b/xo-arena/docs/AllocInfo-reference.rst @@ -0,0 +1,26 @@ +.. _AllocInfo-reference: + +AllocInfo Reference +=================== + +Describes a single allocation. +Requires allocator configured to store per-allocation headers + +Context +------- + +.. ditaa:: + :--scale: 0.99 + + +-----------------------------------------------------+ + | DArena | + | DArenaIterator | + +-----------------------------------------------------+ + | ArenaConfig | + +--------------+------------------------+-------------+ + | | AllocInfo cBLU| | + | +------------------------+ | + | AllocError | AllocHeaderConfig | cmpresult | + | +------------------------+ | + | | AllocHeader | | + +--------------+------------------------+-------------+ diff --git a/xo-arena/docs/cmpresult-reference.rst b/xo-arena/docs/cmpresult-reference.rst index 46998543..ecaa4ba2 100644 --- a/xo-arena/docs/cmpresult-reference.rst +++ b/xo-arena/docs/cmpresult-reference.rst @@ -37,7 +37,7 @@ Class Constructors ------------ -.. doxgyengroup:: mm-cmpresult-ctors +.. doxygengroup:: mm-cmpresult-ctors Methods ------- diff --git a/xo-arena/include/xo/arena/cmpresult.hpp b/xo-arena/include/xo/arena/cmpresult.hpp index 0a9a9110..bf09af57 100644 --- a/xo-arena/include/xo/arena/cmpresult.hpp +++ b/xo-arena/include/xo/arena/cmpresult.hpp @@ -24,7 +24,7 @@ namespace xo { return os; } - /** Result of a generic comparison operation + /** @brief result of a generic comparison operation **/ struct cmpresult { /** @defgroup mm-cmpresult-ctors cmpresult ctors **/ From cc47795ad3832907f918eab23d135877ce60aba8 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 11:47:40 +1100 Subject: [PATCH 13/35] nix-build: + xo-allocutil --- default.nix | 1 + pkgs/xo-allocutil.nix | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 pkgs/xo-allocutil.nix diff --git a/default.nix b/default.nix index a1782e91..9ac6e7c2 100644 --- a/default.nix +++ b/default.nix @@ -140,6 +140,7 @@ let xo-reflectutil = self.callPackage pkgs/xo-reflectutil.nix {}; xo-arena = self.callPackage pkgs/xo-arena.nix { buildDocs = true; }; xo-facet = self.callPackage pkgs/xo-facet.nix {}; + xo-allocutil = self.callPackage pkgs/xo-allocutil.nix {}; xo-refcnt = self.callPackage pkgs/xo-refcnt.nix {}; xo-ordinaltree = self.callPackage pkgs/xo-ordinaltree.nix {}; xo-flatstring = self.callPackage pkgs/xo-flatstring.nix { buildDocs = true; buildExamples = true; }; diff --git a/pkgs/xo-allocutil.nix b/pkgs/xo-allocutil.nix new file mode 100644 index 00000000..acdceb1e --- /dev/null +++ b/pkgs/xo-allocutil.nix @@ -0,0 +1,31 @@ +{ + # nixpkgs dependencies + stdenv, cmake, catch2, + + # xo dependencies + xo-cmake, +# xo-randomgen, +# xo-reflectutil, +# xo-indentlog, +} : + +stdenv.mkDerivation (finalattrs: + { + name = "xo-allocutil"; + + src = ../xo-allocutil; + + cmakeFlags = ["-DCMAKE_MODULE_PATH=${xo-cmake}/share/cmake" + "-DENABLE_TESTING=1" + ]; + doCheck = true; + nativeBuildInputs = [ + cmake catch2 + xo-cmake +# xo-randomgen + ]; + propagatedBuildInputs = [ +# xo-reflectutil +# xo-indentlog + ]; + }) From 0d9900f6dcc58a69442bd3aa073c17ebbf9e414a Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 12:15:20 +1100 Subject: [PATCH 14/35] nix-build: xo-refcnt: + xo-reflectutil dep --- pkgs/xo-refcnt.nix | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkgs/xo-refcnt.nix b/pkgs/xo-refcnt.nix index 1bbeb924..f371c0db 100644 --- a/pkgs/xo-refcnt.nix +++ b/pkgs/xo-refcnt.nix @@ -3,7 +3,11 @@ stdenv, cmake, catch2, # xo dependencies - xo-cmake, xo-indentlog + xo-reflectutil, + xo-indentlog, + xo-cmake, + + doCheck ? true, } : stdenv.mkDerivation (finalattrs: From f22239af7d3bb5282dc314b77b15b62ad7f2ce6a Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 12:15:45 +1100 Subject: [PATCH 15/35] xo-refcnt: missing xo-reflectutil dep in cmake export --- xo-refcnt/cmake/refcntConfig.cmake.in | 1 + 1 file changed, 1 insertion(+) diff --git a/xo-refcnt/cmake/refcntConfig.cmake.in b/xo-refcnt/cmake/refcntConfig.cmake.in index 5b38fa74..edc16a80 100644 --- a/xo-refcnt/cmake/refcntConfig.cmake.in +++ b/xo-refcnt/cmake/refcntConfig.cmake.in @@ -1,6 +1,7 @@ @PACKAGE_INIT@ include(CMakeFindDependencyMacro) +find_dependency(xo_reflectutil) find_dependency(indentlog) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") check_required_components("@PROJECT_NAME@") From c041d63896b5745489d4833e40c0c710e841a625 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 12:16:13 +1100 Subject: [PATCH 16/35] nix-build: xo-refcnt: + missing xo-reflectutil dep --- pkgs/xo-refcnt.nix | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/pkgs/xo-refcnt.nix b/pkgs/xo-refcnt.nix index f371c0db..33c17d35 100644 --- a/pkgs/xo-refcnt.nix +++ b/pkgs/xo-refcnt.nix @@ -18,7 +18,15 @@ stdenv.mkDerivation (finalattrs: src = ../xo-refcnt; cmakeFlags = ["-DCMAKE_MODULE_PATH=${xo-cmake}/share/cmake"]; - doCheck = true; - propagatedBuildInputs = [ xo-indentlog ]; - nativeBuildInputs = [ cmake catch2 xo-cmake ]; + + inherit doCheck; + + propagatedBuildInputs = [ + xo-reflectutil + xo-indentlog + ]; + nativeBuildInputs = [ + cmake + catch2 + xo-cmake ]; }) From 51543ad3d395b1cb05c8fab326df4f1012bc3f49 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 12:20:34 +1100 Subject: [PATCH 17/35] xo-alloc: nix-build + compiler nits --- default.nix | 4 +- pkgs/xo-alloc.nix | 64 +++++++++++++++++++++++++++++++ pkgs/xo-allocutil.nix | 1 + xo-alloc/src/alloc/ArenaAlloc.cpp | 2 + xo-alloc/src/alloc/GC.cpp | 6 ++- 5 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 pkgs/xo-alloc.nix diff --git a/default.nix b/default.nix index 9ac6e7c2..3a9b4466 100644 --- a/default.nix +++ b/default.nix @@ -141,6 +141,7 @@ let xo-arena = self.callPackage pkgs/xo-arena.nix { buildDocs = true; }; xo-facet = self.callPackage pkgs/xo-facet.nix {}; xo-allocutil = self.callPackage pkgs/xo-allocutil.nix {}; + xo-alloc = self.callPackage pkgs/xo-alloc.nix {}; # buildDocs = true; xo-refcnt = self.callPackage pkgs/xo-refcnt.nix {}; xo-ordinaltree = self.callPackage pkgs/xo-ordinaltree.nix {}; xo-flatstring = self.callPackage pkgs/xo-flatstring.nix { buildDocs = true; buildExamples = true; }; @@ -479,13 +480,14 @@ in pkgs = pkgs; xo = { cmake = pkgs.xo-cmake; -# facet = pkgs.xo-facet; indentlog = pkgs.xo-indentlog; refcnt = pkgs.xo-refcnt; subsys = pkgs.xo-subsys; randomgen = pkgs.xo-randomgen; arena = pkgs.xo-arena; facet = pkgs.xo-facet; + allocutil = pkgs.xo-allocutil; + alloc = pkgs.xo-alloc; ordinaltree = pkgs.xo-ordinaltree; flatstring = pkgs.xo-flatstring; pyutil = pkgs.xo-pyutil; diff --git a/pkgs/xo-alloc.nix b/pkgs/xo-alloc.nix new file mode 100644 index 00000000..51cbda83 --- /dev/null +++ b/pkgs/xo-alloc.nix @@ -0,0 +1,64 @@ +{ + # nixpkgs dependencies + lib, stdenv, cmake, catch2, + doxygen, + + python3Packages, + + sphinx, graphviz, + + # xo dependencies + xo-callback, + xo-unit, + xo-reflect, +# xo-randomgen, + xo-reflectutil, + xo-indentlog, + xo-allocutil, + xo-cmake, + + buildDocs ? false, + doCheck ? true, +} : + +stdenv.mkDerivation (finalattrs: + { + name = "xo-alloc"; + + src = ../xo-alloc; + + cmakeFlags = ["-DCMAKE_MODULE_PATH=${xo-cmake}/share/cmake"] + ++ lib.optionals buildDocs ["-DXO_ENABLE_DOCS=on"] + ++ ["-DENABLE_TESTING=1"]; + + inherit buildDocs; + inherit doCheck; + + postBuild = lib.optionalString buildDocs '' + cmake --build . -- docs + ''; + + nativeBuildInputs = [ + cmake + catch2 + xo-cmake +# xo-randomgen + ] ++ lib.optionals buildDocs [ + doxygen + sphinx + graphviz + python3Packages.sphinx-rtd-theme + python3Packages.breathe + python3Packages.sphinxcontrib-ditaa + python3Packages.sphinxcontrib-plantuml + python3Packages.pillow + ]; + propagatedBuildInputs = [ + xo-callback + xo-unit + xo-reflect + xo-allocutil + xo-reflectutil + xo-indentlog + ]; + }) diff --git a/pkgs/xo-allocutil.nix b/pkgs/xo-allocutil.nix index acdceb1e..dd66dbd6 100644 --- a/pkgs/xo-allocutil.nix +++ b/pkgs/xo-allocutil.nix @@ -3,6 +3,7 @@ stdenv, cmake, catch2, # xo dependencies + xo-allocutil, xo-cmake, # xo-randomgen, # xo-reflectutil, diff --git a/xo-alloc/src/alloc/ArenaAlloc.cpp b/xo-alloc/src/alloc/ArenaAlloc.cpp index d7f794f3..dc80eb4e 100644 --- a/xo-alloc/src/alloc/ArenaAlloc.cpp +++ b/xo-alloc/src/alloc/ArenaAlloc.cpp @@ -390,8 +390,10 @@ namespace xo { /* word size for alignment */ constexpr uint32_t c_bpw = sizeof(std::uintptr_t); + (void)c_bpw; std::uintptr_t free_u64 = reinterpret_cast(free_ptr_); + (void)free_u64; assert(free_u64 % c_bpw == 0ul); diff --git a/xo-alloc/src/alloc/GC.cpp b/xo-alloc/src/alloc/GC.cpp index dd17fd3b..f1c52d1b 100644 --- a/xo-alloc/src/alloc/GC.cpp +++ b/xo-alloc/src/alloc/GC.cpp @@ -551,7 +551,7 @@ namespace xo { case generation_result::nursery: if (is_before_checkpoint(parent)) { log && log(xtag("act", "N1->N0 must mlog")); - + // N1->N0, so must log this->mutation_log_[role2int(role::to_space)]->push_back(MutationLogEntry(parent, lhs)); ++(this->gc_statistics_.n_logged_mutation_); @@ -974,12 +974,14 @@ namespace xo { from_entry.fixup_parent_child_moved(child_to); +#ifndef NDEBUG { // verify fixup was effective IObject * child_from2 = from_entry.child(); assert(child_from2 == child_to); } - +#endif + // P->C', loc(C') in {N1', T'} From 9fcd7f5fb785e8181cca4852b0e353c2300bbaab Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 12:28:14 +1100 Subject: [PATCH 18/35] xo-expression: fix type-unification utest on OSX --- xo-expression/utest/type_unifier.test.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/xo-expression/utest/type_unifier.test.cpp b/xo-expression/utest/type_unifier.test.cpp index e6e411c2..054f4173 100644 --- a/xo-expression/utest/type_unifier.test.cpp +++ b/xo-expression/utest/type_unifier.test.cpp @@ -146,7 +146,11 @@ namespace xo { .expect_unify_ok_ = true, .expect_unify_id_{type_var::from_chars("a")}, .expect_unify_concrete_ = true, +#ifdef __APPLE__ + .expect_concrete_typename_ = "long long", +#else .expect_concrete_typename_ = "long int", +#endif .expect_unify_variable_ = false, }, /* same, but reverse order */ @@ -157,7 +161,11 @@ namespace xo { .expect_unify_ok_ = true, .expect_unify_id_{type_var::from_chars("a")}, .expect_unify_concrete_ = true, +#ifdef __APPLE__ + .expect_concrete_typename_ = "long long", +#else .expect_concrete_typename_ = "long int", +#endif .expect_unify_variable_ = false, }, /* matching concrete types */ From d6c5ee911fab953d38371162e916bbb2d6fcc5d3 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 13:02:58 +1100 Subject: [PATCH 19/35] xo-facet: genfacet wrapper script (play nice w/ nix) --- xo-facet/CMakeLists.txt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/xo-facet/CMakeLists.txt b/xo-facet/CMakeLists.txt index d8ad41a4..ee21aa64 100644 --- a/xo-facet/CMakeLists.txt +++ b/xo-facet/CMakeLists.txt @@ -35,13 +35,24 @@ xo_export_cmake_config(${PROJECT_NAME} ${PROJECT_VERSION} ${PROJECT_NAME}Targets # ---------------------------------------------------------------- -# Install the generator script +# Install the generator script: install( PROGRAMS codegen/genfacet DESTINATION share/xo-facet/codegen COMPONENT codegen ) +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/genfacet-bin +"#!/bin/bash +exec \"${CMAKE_INSTALL_FULL_DATADIR}/xo-facet/codegen/genfacet\" \"\$@\" +") + +install( + PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/genfacet-bin + DESTINATION bin + RENAME genfacet +) + # Install all .j2 template files install( DIRECTORY codegen/ From 734c06c8a9201fbf0150bdbcac34369b23e42f64 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 13:03:50 +1100 Subject: [PATCH 20/35] nix-build: + xo-printable2 --- default.nix | 2 ++ pkgs/xo-printable2.nix | 58 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 pkgs/xo-printable2.nix diff --git a/default.nix b/default.nix index 3a9b4466..258cf593 100644 --- a/default.nix +++ b/default.nix @@ -153,6 +153,7 @@ let xo-pyunit = self.callPackage pkgs/xo-pyunit.nix {}; # xo-callback = self.callPackage pkgs/xo-callback.nix {}; + xo-printable2 = self.callPackage pkgs/xo-printable2.nix {}; xo-webutil = self.callPackage pkgs/xo-webutil.nix {}; xo-pywebutil = self.callPackage pkgs/xo-pywebutil.nix {}; xo-printjson = self.callPackage pkgs/xo-printjson.nix {}; @@ -498,6 +499,7 @@ in unit = pkgs.xo-unit; pyunit = pkgs.xo-pyunit; callback = pkgs.xo-callback; + printable2 = pkgs.xo-printable2; webutil = pkgs.xo-webutil; pywebutil = pkgs.xo-pywebutil; printjson = pkgs.xo-printjson; diff --git a/pkgs/xo-printable2.nix b/pkgs/xo-printable2.nix new file mode 100644 index 00000000..a584fd5e --- /dev/null +++ b/pkgs/xo-printable2.nix @@ -0,0 +1,58 @@ +{ + # nixpkgs dependencies + lib, stdenv, cmake, catch2, + doxygen, + + python3Packages, + + sphinx, graphviz, + + # xo dependencies + xo-facet, +# xo-randomgen, +# xo-reflectutil, +# xo-indentlog, + xo-cmake, + +# buildDocs ? false, +# doCheck ? true, +} : + +stdenv.mkDerivation (finalattrs: + { + name = "xo-printable2"; + + src = ../xo-printable2; + + cmakeFlags = ["-DCMAKE_MODULE_PATH=${xo-cmake}/share/cmake"] +# ++ lib.optionals buildDocs ["-DXO_ENABLE_DOCS=on"] +# ++ ["-DENABLE_TESTING=1"]; + ; + +# inherit buildDocs; +# inherit doCheck; + +# postBuild = lib.optionalString buildDocs '' +# cmake --build . -- docs +# ''; + + nativeBuildInputs = [ + cmake catch2 + xo-cmake +# xo-randomgen +# ] ++ lib.optionals buildDocs [ +# doxygen +# sphinx +# graphviz +# python3Packages.sphinx-rtd-theme +# python3Packages.breathe +# python3Packages.sphinxcontrib-ditaa +# python3Packages.sphinxcontrib-plantuml +# python3Packages.pillow + ]; + propagatedBuildInputs = [ + xo-facet +# xo-reflectutil +# xo-indentlog + ]; + }) From 115782abf6c58619f7868f6c0fda5a4001ff342d Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 13:28:42 +1100 Subject: [PATCH 21/35] nix-build: + xo-alloc2 working --- default.nix | 2 ++ pkgs/xo-alloc2.nix | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 pkgs/xo-alloc2.nix diff --git a/default.nix b/default.nix index 258cf593..ee43faf2 100644 --- a/default.nix +++ b/default.nix @@ -142,6 +142,7 @@ let xo-facet = self.callPackage pkgs/xo-facet.nix {}; xo-allocutil = self.callPackage pkgs/xo-allocutil.nix {}; xo-alloc = self.callPackage pkgs/xo-alloc.nix {}; # buildDocs = true; + xo-alloc2 = self.callPackage pkgs/xo-alloc2.nix { buildDocs = true; }; xo-refcnt = self.callPackage pkgs/xo-refcnt.nix {}; xo-ordinaltree = self.callPackage pkgs/xo-ordinaltree.nix {}; xo-flatstring = self.callPackage pkgs/xo-flatstring.nix { buildDocs = true; buildExamples = true; }; @@ -489,6 +490,7 @@ in facet = pkgs.xo-facet; allocutil = pkgs.xo-allocutil; alloc = pkgs.xo-alloc; + alloc2 = pkgs.xo-alloc2; ordinaltree = pkgs.xo-ordinaltree; flatstring = pkgs.xo-flatstring; pyutil = pkgs.xo-pyutil; diff --git a/pkgs/xo-alloc2.nix b/pkgs/xo-alloc2.nix new file mode 100644 index 00000000..0ca4afee --- /dev/null +++ b/pkgs/xo-alloc2.nix @@ -0,0 +1,69 @@ +{ + # nixpkgs dependencies + lib, stdenv, cmake, catch2, + doxygen, + + python3Packages, + + sphinx, graphviz, + + # xo dependencies + xo-facet, + xo-randomgen, + xo-subsys, +# xo-callback, +# xo-unit, +# xo-reflect, +# xo-randomgen, +# xo-reflectutil, +# xo-indentlog, +# xo-allocutil, + xo-cmake, + + buildDocs ? false, + doCheck ? true, +} : + +stdenv.mkDerivation (finalattrs: + { + name = "xo-alloc2"; + + src = ../xo-alloc2; + + cmakeFlags = ["-DCMAKE_MODULE_PATH=${xo-cmake}/share/cmake"] + ++ lib.optionals buildDocs ["-DXO_ENABLE_DOCS=on"] + ++ lib.optionals doCheck ["-DENABLE_TESTING=1"]; + + inherit buildDocs; + inherit doCheck; + + postBuild = lib.optionalString buildDocs '' + cmake --build . -- docs + ''; + + nativeBuildInputs = [ + cmake + catch2 + xo-randomgen + xo-cmake + ] ++ lib.optionals buildDocs [ + doxygen + sphinx + graphviz + python3Packages.sphinx-rtd-theme + python3Packages.breathe + python3Packages.sphinxcontrib-ditaa + python3Packages.sphinxcontrib-plantuml + python3Packages.pillow + ]; + propagatedBuildInputs = [ + xo-facet + xo-subsys +# xo-callback +# xo-unit +# xo-reflect +# xo-allocutil +# xo-reflectutil +# xo-indentlog + ]; + }) From d8d8781068494e39d39cf74fa82ae5f05d34d1af Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Feb 2026 14:27:02 +1100 Subject: [PATCH 22/35] xo-gc: docs build [WIP] + misc fixes + works w/ nix --- CMakeLists.txt | 16 +++--- default.nix | 4 +- index.rst | 1 + pkgs/xo-gc.nix | 61 +++++++++++++++++++++++ xo-alloc2/cmake/xo_alloc2Config.cmake.in | 2 +- xo-gc/CMakeLists.txt | 2 +- xo-gc/cmake/xo_gcConfig.cmake.in | 1 + xo-gc/docs/_static/README | 1 + xo-gc/docs/_static/img/favicon.ico | Bin 0 -> 309936 bytes xo-gc/docs/conf.py | 39 +++++++++++++++ xo-gc/src/gc/CMakeLists.txt | 1 + 11 files changed, 117 insertions(+), 11 deletions(-) create mode 100644 pkgs/xo-gc.nix create mode 100644 xo-gc/docs/_static/README create mode 100644 xo-gc/docs/_static/img/favicon.ico create mode 100644 xo-gc/docs/conf.py diff --git a/CMakeLists.txt b/CMakeLists.txt index d31de7cb..115cbe69 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,19 +95,19 @@ add_subdirectory(xo-ratio) add_subdirectory(xo-unit) add_subdirectory(xo-pyunit) add_subdirectory(xo-callback) -add_subdirectory(xo-printable2) # experiment w/ facet object model +add_subdirectory(xo-printable2) # experiment w/ facet object model add_subdirectory(xo-alloc) -add_subdirectory(xo-alloc2) # experiment w/ facet object model -add_subdirectory(xo-gc) +add_subdirectory(xo-alloc2) # experiment w/ facet object model +add_subdirectory(xo-gc) # experiment w/ facet object model add_subdirectory(xo-object) -add_subdirectory(xo-object2) # experiment w/ facet object model -add_subdirectory(xo-procedure2) # schematika procedure abstraction + runtime context (fomo) +add_subdirectory(xo-object2) # experiment w/ facet object model +add_subdirectory(xo-procedure2) # schematika procedure abstraction + runtime context (fomo) add_subdirectory(xo-ordinaltree) # -add_subdirectory(xo-tokenizer2) # schematika tokenizer (fomo) +add_subdirectory(xo-tokenizer2) # schematika tokenizer (fomo) add_subdirectory(xo-expression2) # schematika expressions (fomo) -add_subdirectory(xo-reader2) # schematika expression parser (fomo) -add_subdirectory(xo-interpreter2) # schematika interpreter (fomo) +add_subdirectory(xo-reader2) # schematika expression parser (fomo) +add_subdirectory(xo-interpreter2) # schematika interpreter (fomo) # add_subdirectory(xo-webutil) add_subdirectory(xo-pywebutil) diff --git a/default.nix b/default.nix index ee43faf2..07182293 100644 --- a/default.nix +++ b/default.nix @@ -141,8 +141,9 @@ let xo-arena = self.callPackage pkgs/xo-arena.nix { buildDocs = true; }; xo-facet = self.callPackage pkgs/xo-facet.nix {}; xo-allocutil = self.callPackage pkgs/xo-allocutil.nix {}; - xo-alloc = self.callPackage pkgs/xo-alloc.nix {}; # buildDocs = true; + xo-alloc = self.callPackage pkgs/xo-alloc.nix { buildDocs = true; }; xo-alloc2 = self.callPackage pkgs/xo-alloc2.nix { buildDocs = true; }; + xo-gc = self.callPackage pkgs/xo-gc.nix { buildDocs = true; }; xo-refcnt = self.callPackage pkgs/xo-refcnt.nix {}; xo-ordinaltree = self.callPackage pkgs/xo-ordinaltree.nix {}; xo-flatstring = self.callPackage pkgs/xo-flatstring.nix { buildDocs = true; buildExamples = true; }; @@ -491,6 +492,7 @@ in allocutil = pkgs.xo-allocutil; alloc = pkgs.xo-alloc; alloc2 = pkgs.xo-alloc2; + gc = pkgs.xo-gc; ordinaltree = pkgs.xo-ordinaltree; flatstring = pkgs.xo-flatstring; pyutil = pkgs.xo-pyutil; diff --git a/index.rst b/index.rst index 3e581fb6..e68572a3 100644 --- a/index.rst +++ b/index.rst @@ -20,6 +20,7 @@ Some features: kalman filters, stochastic processes, complex event processing, s xo-flatstring/docs/index xo-ratio/docs/index xo-unit/docs/index + xo-gc/docs/index xo-tokenizer/docs/index xo-reader/docs/index xo-jit/docs/index diff --git a/pkgs/xo-gc.nix b/pkgs/xo-gc.nix new file mode 100644 index 00000000..61db7249 --- /dev/null +++ b/pkgs/xo-gc.nix @@ -0,0 +1,61 @@ +{ + # nixpkgs dependencies + lib, stdenv, cmake, catch2, + doxygen, + + python3Packages, + + sphinx, graphviz, + + # xo dependencies + xo-alloc2, + xo-facet, + xo-randomgen, + xo-subsys, +# xo-reflectutil, +# xo-indentlog, + xo-cmake, + + buildDocs ? false, + doCheck ? true, +} : + +stdenv.mkDerivation (finalattrs: + { + name = "xo-gc"; + + src = ../xo-gc; + + cmakeFlags = ["-DCMAKE_MODULE_PATH=${xo-cmake}/share/cmake"] + ++ lib.optionals buildDocs ["-DXO_ENABLE_DOCS=on"] + ++ lib.optionals doCheck ["-DENABLE_TESTING=1"]; + + inherit buildDocs; + inherit doCheck; + + postBuild = lib.optionalString buildDocs '' + cmake --build . -- docs + ''; + + nativeBuildInputs = [ + cmake catch2 + xo-cmake + xo-randomgen + ] ++ lib.optionals buildDocs [ + doxygen + sphinx + graphviz + python3Packages.sphinx-rtd-theme + python3Packages.breathe + python3Packages.sphinxcontrib-ditaa + python3Packages.sphinxcontrib-plantuml + python3Packages.pillow + ]; + propagatedBuildInputs = [ + xo-alloc2 + xo-facet + xo-subsys +# xo-reflectutil +# xo-indentlog + ]; + }) diff --git a/xo-alloc2/cmake/xo_alloc2Config.cmake.in b/xo-alloc2/cmake/xo_alloc2Config.cmake.in index e0b5e0b0..16819c3d 100644 --- a/xo-alloc2/cmake/xo_alloc2Config.cmake.in +++ b/xo-alloc2/cmake/xo_alloc2Config.cmake.in @@ -2,7 +2,7 @@ include(CMakeFindDependencyMacro) #find_dependency(indentlog) -find_depnedency(xo_arena) +find_dependency(xo_arena) find_dependency(xo_facet) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-gc/CMakeLists.txt b/xo-gc/CMakeLists.txt index df57b1e3..4a05fc4a 100644 --- a/xo-gc/CMakeLists.txt +++ b/xo-gc/CMakeLists.txt @@ -41,6 +41,6 @@ xo_export_cmake_config(${PROJECT_NAME} ${PROJECT_VERSION} ${PROJECT_NAME}Targets # docs targets depend on other library/utest/exec targets above, # --> must come after them. # -#add_subdirectory(docs) +add_subdirectory(docs) # end CMakeLists.txt diff --git a/xo-gc/cmake/xo_gcConfig.cmake.in b/xo-gc/cmake/xo_gcConfig.cmake.in index aebd133c..a7eea6c0 100644 --- a/xo-gc/cmake/xo_gcConfig.cmake.in +++ b/xo-gc/cmake/xo_gcConfig.cmake.in @@ -3,6 +3,7 @@ include(CMakeFindDependencyMacro) find_dependency(xo_alloc2) find_dependency(xo_facet) +find_dependency(subsys) find_dependency(indentlog) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") diff --git a/xo-gc/docs/_static/README b/xo-gc/docs/_static/README new file mode 100644 index 00000000..7297d046 --- /dev/null +++ b/xo-gc/docs/_static/README @@ -0,0 +1 @@ +add any static {.html, .js, ..} files for sphinx to pickup here diff --git a/xo-gc/docs/_static/img/favicon.ico b/xo-gc/docs/_static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4163dd69c734f8186cf1ce5e726213cebd231c31 GIT binary patch literal 309936 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 uml diagrams + ] + +# note: breathe requires doxygen xml output -> must have GENERATE_XML = YES in Doxyfile.in +# match project name in Doxyfile.in +breathe_default_project = "xodoxxml" + +templates_path = ['_templates'] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +pygments_style = 'sphinx' + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +#html_theme = 'alabaster' +html_theme = 'sphinx_rtd_theme' +html_static_path = ['_static'] +html_favicon = '_static/img/favicon.ico' diff --git a/xo-gc/src/gc/CMakeLists.txt b/xo-gc/src/gc/CMakeLists.txt index 44cef925..985592b0 100644 --- a/xo-gc/src/gc/CMakeLists.txt +++ b/xo-gc/src/gc/CMakeLists.txt @@ -21,4 +21,5 @@ xo_add_shared_library4(${SELF_LIB} ${PROJECT_NAME}Targets ${PROJECT_VERSION} 1 $ # note: deps here must also appear in cmake/xo_alloc2Config.cmake.in xo_dependency(${SELF_LIB} xo_alloc2) xo_dependency(${SELF_LIB} xo_facet) +xo_dependency(${SELF_LIB} subsys) xo_dependency(${SELF_LIB} indentlog) From 0933e6309f96069a2e8c63d0b5a3d807c02b30b5 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 27 Feb 2026 11:31:54 +1100 Subject: [PATCH 23/35] xo: _Any.cpp files need for clang 18 build --- xo-alloc2/src/alloc2/IAllocIterator_Any.cpp | 1 + xo-alloc2/src/alloc2/IAllocator_Any.cpp | 1 + xo-alloc2/src/alloc2/IResourceVisitor_Any.cpp | 1 + xo-gc/src/gc/ICollector_Any.cpp | 1 + xo-gc/src/gc/IGCObject_Any.cpp | 1 + xo-printable2/src/printable2/IPrintable_Any.cpp | 3 ++- 6 files changed, 7 insertions(+), 1 deletion(-) diff --git a/xo-alloc2/src/alloc2/IAllocIterator_Any.cpp b/xo-alloc2/src/alloc2/IAllocIterator_Any.cpp index 86c2ba72..4ae6c575 100644 --- a/xo-alloc2/src/alloc2/IAllocIterator_Any.cpp +++ b/xo-alloc2/src/alloc2/IAllocIterator_Any.cpp @@ -5,6 +5,7 @@ #include "alloc/IAllocIterator_Any.hpp" #include +#include namespace xo { namespace mm { diff --git a/xo-alloc2/src/alloc2/IAllocator_Any.cpp b/xo-alloc2/src/alloc2/IAllocator_Any.cpp index 864ddf15..9af28ca5 100644 --- a/xo-alloc2/src/alloc2/IAllocator_Any.cpp +++ b/xo-alloc2/src/alloc2/IAllocator_Any.cpp @@ -5,6 +5,7 @@ #include "alloc/IAllocator_Any.hpp" #include +#include namespace xo { using xo::facet::DVariantPlaceholder; diff --git a/xo-alloc2/src/alloc2/IResourceVisitor_Any.cpp b/xo-alloc2/src/alloc2/IResourceVisitor_Any.cpp index 2d9fb12a..0c9cf0e7 100644 --- a/xo-alloc2/src/alloc2/IResourceVisitor_Any.cpp +++ b/xo-alloc2/src/alloc2/IResourceVisitor_Any.cpp @@ -4,6 +4,7 @@ #include "visitor/IResourceVisitor_Any.hpp" #include +#include namespace xo { namespace mm { diff --git a/xo-gc/src/gc/ICollector_Any.cpp b/xo-gc/src/gc/ICollector_Any.cpp index 99563bf9..301524fe 100644 --- a/xo-gc/src/gc/ICollector_Any.cpp +++ b/xo-gc/src/gc/ICollector_Any.cpp @@ -5,6 +5,7 @@ #include "detail/ICollector_Any.hpp" #include +#include namespace xo { using xo::facet::DVariantPlaceholder; diff --git a/xo-gc/src/gc/IGCObject_Any.cpp b/xo-gc/src/gc/IGCObject_Any.cpp index 778760ad..95c8cc84 100644 --- a/xo-gc/src/gc/IGCObject_Any.cpp +++ b/xo-gc/src/gc/IGCObject_Any.cpp @@ -4,6 +4,7 @@ #include "detail/IGCObject_Any.hpp" #include +#include namespace xo { namespace mm { diff --git a/xo-printable2/src/printable2/IPrintable_Any.cpp b/xo-printable2/src/printable2/IPrintable_Any.cpp index 8ff043f1..46b0bddc 100644 --- a/xo-printable2/src/printable2/IPrintable_Any.cpp +++ b/xo-printable2/src/printable2/IPrintable_Any.cpp @@ -4,6 +4,7 @@ #include "detail/IPrintable_Any.hpp" #include +#include namespace xo { namespace print { @@ -38,4 +39,4 @@ IPrintable_Any::_valid } /*namespace print*/ } /*namespace xo*/ -/* end IPrintable_Any.cpp */ \ No newline at end of file +/* end IPrintable_Any.cpp */ From 24704daf578e3be8f5d1a4fd2db8d9323b6de646 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 27 Feb 2026 11:32:26 +1100 Subject: [PATCH 24/35] xo-facet: in _Any.cpp template --- xo-facet/codegen/iface_facet_any.cpp.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/xo-facet/codegen/iface_facet_any.cpp.j2 b/xo-facet/codegen/iface_facet_any.cpp.j2 index 6ad2d07e..0c8d000e 100644 --- a/xo-facet/codegen/iface_facet_any.cpp.j2 +++ b/xo-facet/codegen/iface_facet_any.cpp.j2 @@ -4,6 +4,7 @@ #include "{{impl_hpp_subdir}}/{{iface_facet_any_hpp_fname}}" #include +#include namespace {{facet_ns1}} { namespace {{facet_ns2}} { From afeb9cc81cb6b394a0ceb036beecc9b946de75fb Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 27 Feb 2026 11:33:40 +1100 Subject: [PATCH 25/35] xo-alloc: nix requires specific include path --- xo-alloc/include/xo/alloc/Blob.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xo-alloc/include/xo/alloc/Blob.hpp b/xo-alloc/include/xo/alloc/Blob.hpp index 9e3ae44a..205e984b 100644 --- a/xo-alloc/include/xo/alloc/Blob.hpp +++ b/xo-alloc/include/xo/alloc/Blob.hpp @@ -6,7 +6,7 @@ #pragma once #include "Object.hpp" -#include "IAlloc.hpp" +#include namespace xo { /** Use to allocate opaque binary data, From 0c4e8639d7019616b282ed056cfc882e4b3536ef Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 27 Feb 2026 11:34:18 +1100 Subject: [PATCH 26/35] xo-alloc: fix broken cmake export deps --- xo-alloc/cmake/xo_allocConfig.cmake.in | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xo-alloc/cmake/xo_allocConfig.cmake.in b/xo-alloc/cmake/xo_allocConfig.cmake.in index f5afd837..97574de5 100644 --- a/xo-alloc/cmake/xo_allocConfig.cmake.in +++ b/xo-alloc/cmake/xo_allocConfig.cmake.in @@ -1,7 +1,10 @@ @PACKAGE_INIT@ include(CMakeFindDependencyMacro) +find_dependency(xo_allocutil) +find_dependency(xo_unit) find_dependency(indentlog) -#find_dependency(xo_flatstring) +find_dependency(reflect) +find_dependency(callback) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") check_required_components("@PROJECT_NAME@") From dedb0aaa1ba03f935bb2981c4a57e5f99d722c29 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 27 Feb 2026 11:34:46 +1100 Subject: [PATCH 27/35] xo-object: nix build requires specific include paths --- xo-object/cmake/xo_objectConfig.cmake.in | 5 ++++- xo-object/src/object/Boolean.cpp | 4 ++-- xo-object/src/object/ObjectConverter.cpp | 6 ++++-- xo-object/src/object/String.cpp | 10 ++++++---- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/xo-object/cmake/xo_objectConfig.cmake.in b/xo-object/cmake/xo_objectConfig.cmake.in index 32e5b030..df95c47b 100644 --- a/xo-object/cmake/xo_objectConfig.cmake.in +++ b/xo-object/cmake/xo_objectConfig.cmake.in @@ -2,7 +2,10 @@ include(CMakeFindDependencyMacro) # reminder: deps here must also appear in xo-object/src/object/CMakeLists.txt -find_dependency(xo_alloc) +find_dependency(xo_reflectutil) +find_dependency(xo_unit) +find_dependency(callback) +#find_dependency(xo_alloc) #find_dependency(xo_flatstring) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-object/src/object/Boolean.cpp b/xo-object/src/object/Boolean.cpp index 20d874b0..424da920 100644 --- a/xo-object/src/object/Boolean.cpp +++ b/xo-object/src/object/Boolean.cpp @@ -4,8 +4,8 @@ */ #include "Boolean.hpp" -#include "TaggedPtr.hpp" -#include "xo/reflect/Reflect.hpp" +#include +#include #include #include #include diff --git a/xo-object/src/object/ObjectConverter.cpp b/xo-object/src/object/ObjectConverter.cpp index a7d0ed4d..5ad36cb5 100644 --- a/xo-object/src/object/ObjectConverter.cpp +++ b/xo-object/src/object/ObjectConverter.cpp @@ -8,8 +8,8 @@ #include "Float.hpp" #include "Boolean.hpp" #include "String.hpp" -#include "TaggedPtr.hpp" -#include "xo/alloc/Blob.hpp" +#include +#include namespace xo { using xo::reflect::Reflect; @@ -145,6 +145,8 @@ namespace xo { // still don't have good solver for this yet assert(false); + + return TaggedPtr::universal_null(); } } diff --git a/xo-object/src/object/String.cpp b/xo-object/src/object/String.cpp index b164c14a..4a457a36 100644 --- a/xo-object/src/object/String.cpp +++ b/xo-object/src/object/String.cpp @@ -5,10 +5,12 @@ #include "String.hpp" #include "GC.hpp" -#include "TaggedPtr.hpp" -#include "xo/reflect/Reflect.hpp" -#include "xo/indentlog/print/quoted.hpp" -#include +#include +#include +#include +#ifdef __linux__ +# include +#endif #include #include #include From 1322a97a8bda4f9006fedb9b5d53bd0941c11fc9 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 27 Feb 2026 11:36:20 +1100 Subject: [PATCH 28/35] nix-build: + xo-object + use clang 18 [WIP] --- default.nix | 61 ++++++++++++++++++++++++++-------------------- pkgs/xo-object.nix | 49 +++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 26 deletions(-) create mode 100644 pkgs/xo-object.nix diff --git a/default.nix b/default.nix index 07182293..f4897bf6 100644 --- a/default.nix +++ b/default.nix @@ -84,13 +84,19 @@ let # }; # Problem: builds *everything* with llvm18 toolchain, exposes too many compiler nits - llvm-overlay = self: super: { + llvm-overlay = self: super: # use 'super' when you want to override the terms of a package. # use 'self' when pointing to an existing package # - llvmPackages = super.llvmPackages_18; - }; + let + llvmPackages = super.llvmPackages_18; + in let + clangStdenv = super.overrideCC super.stdenv super.llvmPackages_18.clang; + in let + jitStdenv = if super.stdenv.isDarwin then clangStdenv else super.stdenv; + in + { inherit llvmPackages clangStdenv jitStdenv; }; # tests excruciatingly slow mailutils-overlay = self: super: { @@ -133,30 +139,31 @@ let in { - xo-cmake = self.callPackage pkgs/xo-cmake.nix {}; - xo-indentlog = self.callPackage pkgs/xo-indentlog.nix { buildDocs = true; buildExamples = true; }; - xo-subsys = self.callPackage pkgs/xo-subsys.nix {}; - xo-randomgen = self.callPackage pkgs/xo-randomgen.nix { buildExamples = true; }; - xo-reflectutil = self.callPackage pkgs/xo-reflectutil.nix {}; - xo-arena = self.callPackage pkgs/xo-arena.nix { buildDocs = true; }; - xo-facet = self.callPackage pkgs/xo-facet.nix {}; - xo-allocutil = self.callPackage pkgs/xo-allocutil.nix {}; - xo-alloc = self.callPackage pkgs/xo-alloc.nix { buildDocs = true; }; - xo-alloc2 = self.callPackage pkgs/xo-alloc2.nix { buildDocs = true; }; - xo-gc = self.callPackage pkgs/xo-gc.nix { buildDocs = true; }; - xo-refcnt = self.callPackage pkgs/xo-refcnt.nix {}; - xo-ordinaltree = self.callPackage pkgs/xo-ordinaltree.nix {}; - xo-flatstring = self.callPackage pkgs/xo-flatstring.nix { buildDocs = true; buildExamples = true; }; - xo-pyutil = self.callPackage pkgs/xo-pyutil.nix {}; - xo-reflect = self.callPackage pkgs/xo-reflect.nix {}; - xo-pyreflect = self.callPackage pkgs/xo-pyreflect.nix {}; - xo-ratio = self.callPackage pkgs/xo-ratio.nix { buildDocs = true; buildExamples = true; }; - xo-unit = self.callPackage pkgs/xo-unit.nix { buildDocs = true; buildExamples = true; }; - xo-pyunit = self.callPackage pkgs/xo-pyunit.nix {}; + xo-cmake = self.callPackage pkgs/xo-cmake.nix { stdenv = jitStdenv; }; + xo-indentlog = self.callPackage pkgs/xo-indentlog.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; + xo-subsys = self.callPackage pkgs/xo-subsys.nix { stdenv = jitStdenv; }; + xo-randomgen = self.callPackage pkgs/xo-randomgen.nix { stdenv = jitStdenv; buildExamples = true; }; + xo-reflectutil = self.callPackage pkgs/xo-reflectutil.nix { stdenv = jitStdenv; }; + xo-flatstring = self.callPackage pkgs/xo-flatstring.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; + xo-arena = self.callPackage pkgs/xo-arena.nix { stdenv = jitStdenv; buildDocs = true; }; + xo-facet = self.callPackage pkgs/xo-facet.nix { stdenv = jitStdenv; }; + xo-allocutil = self.callPackage pkgs/xo-allocutil.nix { stdenv = jitStdenv; }; + xo-alloc = self.callPackage pkgs/xo-alloc.nix { stdenv = jitStdenv; buildDocs = true; }; + xo-alloc2 = self.callPackage pkgs/xo-alloc2.nix { stdenv = jitStdenv; buildDocs = true; }; + xo-gc = self.callPackage pkgs/xo-gc.nix { stdenv = jitStdenv; buildDocs = true; }; + xo-object = self.callPackage pkgs/xo-object.nix { stdenv = jitStdenv; }; + xo-refcnt = self.callPackage pkgs/xo-refcnt.nix { stdenv = jitStdenv; }; + xo-ordinaltree = self.callPackage pkgs/xo-ordinaltree.nix { stdenv = jitStdenv; }; + xo-pyutil = self.callPackage pkgs/xo-pyutil.nix { stdenv = jitStdenv; }; + xo-reflect = self.callPackage pkgs/xo-reflect.nix { stdenv = jitStdenv; }; + xo-pyreflect = self.callPackage pkgs/xo-pyreflect.nix { stdenv = jitStdenv; }; + xo-ratio = self.callPackage pkgs/xo-ratio.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; + xo-unit = self.callPackage pkgs/xo-unit.nix { stdenv = jitStdenv; buildDocs = true; buildExamples = true; }; + xo-pyunit = self.callPackage pkgs/xo-pyunit.nix { stdenv = jitStdenv; }; # - xo-callback = self.callPackage pkgs/xo-callback.nix {}; - xo-printable2 = self.callPackage pkgs/xo-printable2.nix {}; - xo-webutil = self.callPackage pkgs/xo-webutil.nix {}; + xo-callback = self.callPackage pkgs/xo-callback.nix { stdenv = jitStdenv; }; + xo-printable2 = self.callPackage pkgs/xo-printable2.nix { stdenv = jitStdenv; }; + xo-webutil = self.callPackage pkgs/xo-webutil.nix { stdenv = jitStdenv; }; xo-pywebutil = self.callPackage pkgs/xo-pywebutil.nix {}; xo-printjson = self.callPackage pkgs/xo-printjson.nix {}; xo-pyprintjson = self.callPackage pkgs/xo-pyprintjson.nix {}; @@ -493,6 +500,7 @@ in alloc = pkgs.xo-alloc; alloc2 = pkgs.xo-alloc2; gc = pkgs.xo-gc; + object = pkgs.xo-object; ordinaltree = pkgs.xo-ordinaltree; flatstring = pkgs.xo-flatstring; pyutil = pkgs.xo-pyutil; @@ -741,6 +749,7 @@ in # 1 - get this to work as standalone copy of shell4-assembly # 2 - merge to look like shell4-wsl / shell4-nvidia # + #shell4-osx = pkgs.mkShell.override { stdenv = pkgs.jitStdenv; } { .. } # very high attack surface area shell4-osx = pkgs.mkShell { buildInputs = docutils ++ xodeps ++ devutils ++ ideutils ++ x11utils ++ gldeps ++ vkdeps ++ imguideps; diff --git a/pkgs/xo-object.nix b/pkgs/xo-object.nix new file mode 100644 index 00000000..7d65efe7 --- /dev/null +++ b/pkgs/xo-object.nix @@ -0,0 +1,49 @@ +{ + # nixpkgs dependencies + lib, stdenv, cmake, catch2, + + # xo dependencies +# xo-reflect, +# xo-webutil, + xo-callback, + xo-unit, + xo-refcnt, + xo-reflectutil, + xo-alloc, + xo-randomgen, + xo-cmake, +# xo-printjson, +# xo-ordinaltree, + xo-indentlog, + doCheck ? true, +} : + +stdenv.mkDerivation (finalattrs: + { + name = "xo-object"; + + src = ../xo-object; + + cmakeFlags = ["-DCMAKE_MODULE_PATH=${xo-cmake}/share/cmake"] + ++ lib.optionals doCheck ["-DENABLE_TESTING=1"]; + + inherit doCheck; + + nativeBuildInputs = [ + cmake catch2 + xo-randomgen + xo-cmake + ]; + propagatedBuildInputs = [ + xo-callback + xo-unit + xo-refcnt +# xo-reflect +# xo-webutil +# xo-printjson +# xo-ordinaltree + xo-alloc + xo-reflectutil + xo-indentlog + ]; + }) From 6dd635599ce9460d7dc6f80d054a9cf71bebade5 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 27 Feb 2026 13:04:46 +1100 Subject: [PATCH 29/35] nix-build: + xo-object2 builds --- default.nix | 2 + pkgs/xo-object2.nix | 48 ++++++++++++++++++++++++ xo-cmake/cmake/xo_macros/xo_cxx.cmake | 12 ++++++ xo-object2/src/object2/ISequence_Any.cpp | 1 + 4 files changed, 63 insertions(+) create mode 100644 pkgs/xo-object2.nix diff --git a/default.nix b/default.nix index f4897bf6..e3139947 100644 --- a/default.nix +++ b/default.nix @@ -152,6 +152,7 @@ let xo-alloc2 = self.callPackage pkgs/xo-alloc2.nix { stdenv = jitStdenv; buildDocs = true; }; xo-gc = self.callPackage pkgs/xo-gc.nix { stdenv = jitStdenv; buildDocs = true; }; xo-object = self.callPackage pkgs/xo-object.nix { stdenv = jitStdenv; }; + xo-object2 = self.callPackage pkgs/xo-object2.nix { stdenv = jitStdenv; }; xo-refcnt = self.callPackage pkgs/xo-refcnt.nix { stdenv = jitStdenv; }; xo-ordinaltree = self.callPackage pkgs/xo-ordinaltree.nix { stdenv = jitStdenv; }; xo-pyutil = self.callPackage pkgs/xo-pyutil.nix { stdenv = jitStdenv; }; @@ -501,6 +502,7 @@ in alloc2 = pkgs.xo-alloc2; gc = pkgs.xo-gc; object = pkgs.xo-object; + object2 = pkgs.xo-object2; ordinaltree = pkgs.xo-ordinaltree; flatstring = pkgs.xo-flatstring; pyutil = pkgs.xo-pyutil; diff --git a/pkgs/xo-object2.nix b/pkgs/xo-object2.nix new file mode 100644 index 00000000..93de3b0c --- /dev/null +++ b/pkgs/xo-object2.nix @@ -0,0 +1,48 @@ +{ + # nixpkgs dependencies + lib, stdenv, cmake, catch2, + + # xo dependencies +# xo-webutil, +# xo-callback, +# xo-unit, +# xo-refcnt, +# xo-reflectutil, +# xo-alloc, + # xo-randomgen, + xo-reflect, + xo-gc, + xo-printable2, + xo-facet, + xo-subsys, + xo-cmake, +# xo-printjson, +# xo-ordinaltree, +# xo-indentlog, + doCheck ? true, +} : + +stdenv.mkDerivation (finalattrs: + { + name = "xo-object2"; + + src = ../xo-object2; + + cmakeFlags = ["-DCMAKE_MODULE_PATH=${xo-cmake}/share/cmake"] + ++ lib.optionals doCheck ["-DENABLE_TESTING=1"]; + + inherit doCheck; + + nativeBuildInputs = [ + cmake catch2 +# xo-randomgen + xo-cmake + ]; + propagatedBuildInputs = [ + xo-reflect + xo-gc + xo-printable2 + xo-subsys + xo-facet + ]; + }) diff --git a/xo-cmake/cmake/xo_macros/xo_cxx.cmake b/xo-cmake/cmake/xo_macros/xo_cxx.cmake index 38d01df3..9c70505a 100644 --- a/xo-cmake/cmake/xo_macros/xo_cxx.cmake +++ b/xo-cmake/cmake/xo_macros/xo_cxx.cmake @@ -1748,6 +1748,18 @@ function(xo_add_genfacetimpl) if (NOT DEFINED GF_FACET_PKG) message(FATAL_ERROR "xo_add_genfacetimpl: FACET_PKG or FACET_DIR required") else() + # share_${GF_FACET_PKG} is a cmake target created by xo_add_shared_library4() + # or similar when a facet-provider (e.g. xo-gc) builds from source in the same + # cmake context (XO_SUBMODULE_BUILD=True). + # + # It is NOT exported in the installed cmake + # config, so it won't exist when the facet package is consumed as an installed + # dependency (e.g. in a standalone nix build). + # + if(NOT TARGET share_${GF_FACET_PKG}) + message(STATUS "xo_add_genfacetimpl: share_${GF_FACET_PKG} not available; skipping ${GF_TARGET}") + return() + endif() get_target_property(_facet_dir share_${GF_FACET_PKG} path) set(GF_FACET_DIR ${_facet_dir}) endif() diff --git a/xo-object2/src/object2/ISequence_Any.cpp b/xo-object2/src/object2/ISequence_Any.cpp index 372571f7..77da7d31 100644 --- a/xo-object2/src/object2/ISequence_Any.cpp +++ b/xo-object2/src/object2/ISequence_Any.cpp @@ -3,6 +3,7 @@ **/ #include "sequence/ISequence_Any.hpp" +#include #include namespace xo { From 831fc10c18ba25f8f3436f89480693e0334236af Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 27 Feb 2026 19:38:53 +1100 Subject: [PATCH 30/35] xo-cmake: setup to make share target available via cmake install --- xo-alloc/cmake/xo_allocConfig.cmake.in | 1 + xo-alloc2/cmake/xo_alloc2Config.cmake.in | 1 + .../cmake/xo_allocutilConfig.cmake.in | 1 + xo-arena/cmake/xo_arenaConfig.cmake.in | 1 + xo-callback/cmake/callbackConfig.cmake.in | 1 + xo-cmake/cmake/xo_macros/xo_cxx.cmake | 11 +++ .../docs/history/2026/cmake-facet-export.rst | 81 +++++++++++++++++++ .../cmake/xo_distributionConfig.cmake.in | 1 + .../cmake/xo_expressionConfig.cmake.in | 1 + .../cmake/xo_expression2Config.cmake.in | 1 + xo-facet/cmake/xo_facetConfig.cmake.in | 1 + .../cmake/xo_flatstringConfig.cmake.in | 1 + xo-gc/cmake/xo_gcConfig.cmake.in | 1 + xo-indentlog/cmake/indentlogConfig.cmake.in | 1 + .../cmake/xo_interpreterConfig.cmake.in | 1 + .../cmake/xo_interpreter2Config.cmake.in | 1 + xo-jit/cmake/xo_jitConfig.cmake.in | 1 + .../cmake/xo_kalmanfilterConfig.cmake.in | 1 + xo-object/cmake/xo_objectConfig.cmake.in | 1 + xo-object2/cmake/xo_object2Config.cmake.in | 1 + .../cmake/xo_ordinaltreeConfig.cmake.in | 1 + .../cmake/xo_printable2Config.cmake.in | 1 + xo-printjson/cmake/printjsonConfig.cmake.in | 1 + .../cmake/xo_procedure2Config.cmake.in | 1 + xo-process/cmake/processConfig.cmake.in | 1 + .../cmake/xo_pydistributionConfig.cmake.in | 1 + .../cmake/xo_pyexpressionConfig.cmake.in | 1 + xo-pyjit/cmake/xo_pyjitConfig.cmake.in | 1 + .../cmake/xo_pykalmanfilterConfig.cmake.in | 1 + .../cmake/xo_pyprintjsonConfig.cmake.in | 1 + .../cmake/xo_pyprocessConfig.cmake.in | 1 + .../cmake/xo_pyreactorConfig.cmake.in | 1 + .../cmake/xo_pyreflectConfig.cmake.in | 1 + .../cmake/xo_pyprintjsonConfig.cmake.in | 1 + .../cmake/xo_pysimulatorConfig.cmake.in | 1 + xo-pyunit/cmake/xo_pyunitConfig.cmake.in | 1 + xo-pyutil/cmake/xo_pyutilConfig.cmake.in | 1 + .../cmake/xo_pywebsockConfig.cmake.in | 1 + .../cmake/xo_pywebutilConfig.cmake.in | 1 + xo-randomgen/cmake/randomgenConfig.cmake.in | 1 + xo-ratio/cmake/xo_ratioConfig.cmake.in | 1 + xo-reactor/cmake/reactorConfig.cmake.in | 1 + xo-reader/cmake/xo_readerConfig.cmake.in | 1 + xo-reader2/cmake/xo_reader2Config.cmake.in | 1 + xo-refcnt/cmake/refcntConfig.cmake.in | 1 + xo-reflect/cmake/reflectConfig.cmake.in | 1 + .../cmake/xo_reflectutilConfig.cmake.in | 1 + xo-simulator/cmake/simulatorConfig.cmake.in | 1 + .../cmake/xo_statisticsConfig.cmake.in | 1 + xo-subsys/cmake/subsysConfig.cmake.in | 1 + .../cmake/xo_symboltableConfig.cmake.in | 1 + .../cmake/xo_tokenizerConfig.cmake.in | 1 + .../cmake/xo_tokenizer2Config.cmake.in | 1 + xo-unit/cmake/xo_unitConfig.cmake.in | 1 + xo-websock/cmake/websockConfig.cmake.in | 1 + xo-webutil/cmake/webutilConfig.cmake.in | 1 + 56 files changed, 146 insertions(+) create mode 100644 xo-cmake/docs/history/2026/cmake-facet-export.rst diff --git a/xo-alloc/cmake/xo_allocConfig.cmake.in b/xo-alloc/cmake/xo_allocConfig.cmake.in index 97574de5..e627df64 100644 --- a/xo-alloc/cmake/xo_allocConfig.cmake.in +++ b/xo-alloc/cmake/xo_allocConfig.cmake.in @@ -7,4 +7,5 @@ find_dependency(indentlog) find_dependency(reflect) find_dependency(callback) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-alloc2/cmake/xo_alloc2Config.cmake.in b/xo-alloc2/cmake/xo_alloc2Config.cmake.in index 16819c3d..e226be2e 100644 --- a/xo-alloc2/cmake/xo_alloc2Config.cmake.in +++ b/xo-alloc2/cmake/xo_alloc2Config.cmake.in @@ -5,4 +5,5 @@ include(CMakeFindDependencyMacro) find_dependency(xo_arena) find_dependency(xo_facet) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-allocutil/cmake/xo_allocutilConfig.cmake.in b/xo-allocutil/cmake/xo_allocutilConfig.cmake.in index 00b2de9b..a1cc0fc9 100644 --- a/xo-allocutil/cmake/xo_allocutilConfig.cmake.in +++ b/xo-allocutil/cmake/xo_allocutilConfig.cmake.in @@ -3,4 +3,5 @@ include(CMakeFindDependencyMacro) #find_dependency(randomgen) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-arena/cmake/xo_arenaConfig.cmake.in b/xo-arena/cmake/xo_arenaConfig.cmake.in index 1700fb8a..20b8f877 100644 --- a/xo-arena/cmake/xo_arenaConfig.cmake.in +++ b/xo-arena/cmake/xo_arenaConfig.cmake.in @@ -10,4 +10,5 @@ find_dependency(xo_reflectutil) find_dependency(indentlog) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-callback/cmake/callbackConfig.cmake.in b/xo-callback/cmake/callbackConfig.cmake.in index f7176f38..d6c98d89 100644 --- a/xo-callback/cmake/callbackConfig.cmake.in +++ b/xo-callback/cmake/callbackConfig.cmake.in @@ -3,4 +3,5 @@ include(CMakeFindDependencyMacro) find_dependency(refcnt) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-cmake/cmake/xo_macros/xo_cxx.cmake b/xo-cmake/cmake/xo_macros/xo_cxx.cmake index 9c70505a..7966559a 100644 --- a/xo-cmake/cmake/xo_macros/xo_cxx.cmake +++ b/xo-cmake/cmake/xo_macros/xo_cxx.cmake @@ -1227,6 +1227,17 @@ macro(xo_export_cmake_config projectname projectversion projecttargets) PERMISSIONS OWNER_READ GROUP_READ WORLD_READ DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/cmake/${projectname} ) + # generate Share file that recreates share_${projectname} in consuming projects + file(WRITE "${PROJECT_BINARY_DIR}/${projectname}Share.cmake" + "if(NOT TARGET share_${projectname})\n" + " add_custom_target(share_${projectname})\n" + " set_property(TARGET share_${projectname} PROPERTY path\n" + " \"\${CMAKE_CURRENT_LIST_DIR}/../../../share/${projectname}\")\n" + "endif()\n") + install( + FILES "${PROJECT_BINARY_DIR}/${projectname}Share.cmake" + PERMISSIONS OWNER_READ GROUP_READ WORLD_READ + DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/cmake/${projectname}) endmacro() # ---------------------------------------------------------------- diff --git a/xo-cmake/docs/history/2026/cmake-facet-export.rst b/xo-cmake/docs/history/2026/cmake-facet-export.rst new file mode 100644 index 00000000..f2de60d6 --- /dev/null +++ b/xo-cmake/docs/history/2026/cmake-facet-export.rst @@ -0,0 +1,81 @@ +cmake-facet-export +================== + +:date: 2026-02 + +Background +---------- + +``xo_add_genfacetimpl()`` in ``xo_cxx.cmake`` uses ``genfacet`` to regenerate facet +implementation boilerplate from ``.json5`` IDL files. When ``FACET_PKG`` is specified +(e.g. ``FACET_PKG xo_gc``), the macro resolves the IDL directory via a cmake custom target:: + + get_target_property(_facet_dir share_${GF_FACET_PKG} path) + +``share_${PROJECT_NAME}`` is a custom target created by ``xo_cxx_toplevel_options2()`` for +every xo satellite, with its ``path`` property set to ``${PROJECT_SOURCE_DIR}`` (the package +source root). Subdirectory ``idl/`` within that root holds the facet IDL files. + +Problem +------- + +Custom cmake targets are not exportable through the standard ``install(TARGETS ... EXPORT ...)`` +mechanism. As a result, ``share_xo_gc`` and similar targets do not exist when a satellite is +consumed as an installed dependency (e.g. in a standalone nix build or any build that uses +``find_package(xo_gc)`` rather than building xo-gc in the same cmake invocation). + +This caused ``nix-build -A xo.object2`` to fail at cmake configure time with:: + + CMake Error: get_target_property() called with non-existent target "share_xo_gc". + +xo-gc was unaffected because it uses only ``xo_add_genfacet()`` (which does not reference +``share_*`` targets), while xo-object2 uses ``xo_add_genfacetimpl()`` with ``FACET_PKG``. + +Immediate fix (2026-02) +----------------------- + +A guard was added to ``xo_add_genfacetimpl()`` to skip target creation gracefully when the +``share_*`` target is absent, since all callers annotate these as +``# note: manual target; generated code committed to git``:: + + if(NOT TARGET share_${GF_FACET_PKG}) + message(STATUS "xo_add_genfacetimpl: share_${GF_FACET_PKG} not available; skipping") + return() + endif() + +This unblocked the nix build while leaving a forward path to full support. + +Long-term design +---------------- + +To make ``xo_add_genfacetimpl()`` fully functional in standalone builds: + +1. **Export ``share_`` targets universally** — ``xo_export_cmake_config()`` generates and + installs a ``${PROJECT_NAME}Share.cmake`` file for every satellite. This file recreates + ``share_${PROJECT_NAME}`` pointing to the installed data root:: + + if(NOT TARGET share_xo_gc) + add_custom_target(share_xo_gc) + set_property(TARGET share_xo_gc PROPERTY path + "${CMAKE_CURRENT_LIST_DIR}/../../../share/xo_gc") + endif() + + Doing this universally (not only for facet-providers) keeps ``*Config.cmake.in`` templates + consistent and provides future-proofing for other attributes that may be added to + ``share_`` targets. + +2. **Include the Share file** — every ``cmake/${pkg}Config.cmake.in`` adds:: + + include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") + +3. **Install IDL files** — packages whose IDL is consumed by ``xo_add_genfacetimpl()`` + install their ``idl/`` tree:: + + install(DIRECTORY idl/ + DESTINATION share/${PROJECT_NAME}/idl + FILES_MATCHING PATTERN "*.json5") + + This maps to the same relative path that ``genfacet`` would find under the source root. + +The skip-if-absent guard is retained as graceful degradation for older installed packages +that predate this change. diff --git a/xo-distribution/cmake/xo_distributionConfig.cmake.in b/xo-distribution/cmake/xo_distributionConfig.cmake.in index d906d196..dacd949e 100644 --- a/xo-distribution/cmake/xo_distributionConfig.cmake.in +++ b/xo-distribution/cmake/xo_distributionConfig.cmake.in @@ -3,4 +3,5 @@ include(CMakeFindDependencyMacro) find_dependency(refcnt) include("${CMAKE_CURRENT_LIST_DIR}/xo_distributionTargets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-expression/cmake/xo_expressionConfig.cmake.in b/xo-expression/cmake/xo_expressionConfig.cmake.in index 1560b468..3c6d3b16 100644 --- a/xo-expression/cmake/xo_expressionConfig.cmake.in +++ b/xo-expression/cmake/xo_expressionConfig.cmake.in @@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro) find_dependency(reflect) find_dependency(xo_flatstring) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-expression2/cmake/xo_expression2Config.cmake.in b/xo-expression2/cmake/xo_expression2Config.cmake.in index 15ff18ff..ca2e2ccb 100644 --- a/xo-expression2/cmake/xo_expression2Config.cmake.in +++ b/xo-expression2/cmake/xo_expression2Config.cmake.in @@ -15,4 +15,5 @@ find_dependency(cmake) find_dependency(indentlog) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-facet/cmake/xo_facetConfig.cmake.in b/xo-facet/cmake/xo_facetConfig.cmake.in index 23483949..d4ded169 100644 --- a/xo-facet/cmake/xo_facetConfig.cmake.in +++ b/xo-facet/cmake/xo_facetConfig.cmake.in @@ -5,4 +5,5 @@ include(CMakeFindDependencyMacro) find_dependency(xo_arena) find_dependency(xo_reflectutil) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-flatstring/cmake/xo_flatstringConfig.cmake.in b/xo-flatstring/cmake/xo_flatstringConfig.cmake.in index e5ee1778..c6b988e1 100644 --- a/xo-flatstring/cmake/xo_flatstringConfig.cmake.in +++ b/xo-flatstring/cmake/xo_flatstringConfig.cmake.in @@ -14,4 +14,5 @@ include(CMakeFindDependencyMacro) #find_dependency(callback) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-gc/cmake/xo_gcConfig.cmake.in b/xo-gc/cmake/xo_gcConfig.cmake.in index a7eea6c0..548eb737 100644 --- a/xo-gc/cmake/xo_gcConfig.cmake.in +++ b/xo-gc/cmake/xo_gcConfig.cmake.in @@ -7,4 +7,5 @@ find_dependency(subsys) find_dependency(indentlog) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-indentlog/cmake/indentlogConfig.cmake.in b/xo-indentlog/cmake/indentlogConfig.cmake.in index cc57615e..38c9e093 100644 --- a/xo-indentlog/cmake/indentlogConfig.cmake.in +++ b/xo-indentlog/cmake/indentlogConfig.cmake.in @@ -1,4 +1,5 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/indentlogTargets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-interpreter/cmake/xo_interpreterConfig.cmake.in b/xo-interpreter/cmake/xo_interpreterConfig.cmake.in index 1cf48ccd..a1dba569 100644 --- a/xo-interpreter/cmake/xo_interpreterConfig.cmake.in +++ b/xo-interpreter/cmake/xo_interpreterConfig.cmake.in @@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro) find_dependency(xo_alloc) #find_dependency(xo_flatstring) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-interpreter2/cmake/xo_interpreter2Config.cmake.in b/xo-interpreter2/cmake/xo_interpreter2Config.cmake.in index bea8e9cc..3310d075 100644 --- a/xo-interpreter2/cmake/xo_interpreter2Config.cmake.in +++ b/xo-interpreter2/cmake/xo_interpreter2Config.cmake.in @@ -10,4 +10,5 @@ find_dependency(xo_expression2) find_dependency(xo_gc) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-jit/cmake/xo_jitConfig.cmake.in b/xo-jit/cmake/xo_jitConfig.cmake.in index 26d2315a..a9203adb 100644 --- a/xo-jit/cmake/xo_jitConfig.cmake.in +++ b/xo-jit/cmake/xo_jitConfig.cmake.in @@ -3,4 +3,5 @@ include(CMakeFindDependencyMacro) find_dependency(xo_expression) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-kalmanfilter/cmake/xo_kalmanfilterConfig.cmake.in b/xo-kalmanfilter/cmake/xo_kalmanfilterConfig.cmake.in index 950e70c0..9744c624 100644 --- a/xo-kalmanfilter/cmake/xo_kalmanfilterConfig.cmake.in +++ b/xo-kalmanfilter/cmake/xo_kalmanfilterConfig.cmake.in @@ -14,4 +14,5 @@ find_dependency(Eigen3) #find_dependency(callback) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-object/cmake/xo_objectConfig.cmake.in b/xo-object/cmake/xo_objectConfig.cmake.in index df95c47b..df79b605 100644 --- a/xo-object/cmake/xo_objectConfig.cmake.in +++ b/xo-object/cmake/xo_objectConfig.cmake.in @@ -8,4 +8,5 @@ find_dependency(callback) #find_dependency(xo_alloc) #find_dependency(xo_flatstring) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-object2/cmake/xo_object2Config.cmake.in b/xo-object2/cmake/xo_object2Config.cmake.in index 6773adb7..22772095 100644 --- a/xo-object2/cmake/xo_object2Config.cmake.in +++ b/xo-object2/cmake/xo_object2Config.cmake.in @@ -7,4 +7,5 @@ find_dependency(xo_printable2) find_dependency(subsys) find_dependency(indentlog) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-ordinaltree/cmake/xo_ordinaltreeConfig.cmake.in b/xo-ordinaltree/cmake/xo_ordinaltreeConfig.cmake.in index 9884d371..594156f1 100644 --- a/xo-ordinaltree/cmake/xo_ordinaltreeConfig.cmake.in +++ b/xo-ordinaltree/cmake/xo_ordinaltreeConfig.cmake.in @@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro) find_dependency(randomgen) find_dependency(xo_allocutil) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-printable2/cmake/xo_printable2Config.cmake.in b/xo-printable2/cmake/xo_printable2Config.cmake.in index 985fc324..3bcd63df 100644 --- a/xo-printable2/cmake/xo_printable2Config.cmake.in +++ b/xo-printable2/cmake/xo_printable2Config.cmake.in @@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro) find_dependency(indentlog) find_dependency(xo_facet) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-printjson/cmake/printjsonConfig.cmake.in b/xo-printjson/cmake/printjsonConfig.cmake.in index 9417e239..82e349a8 100644 --- a/xo-printjson/cmake/printjsonConfig.cmake.in +++ b/xo-printjson/cmake/printjsonConfig.cmake.in @@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro) find_dependency(reflect) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-procedure2/cmake/xo_procedure2Config.cmake.in b/xo-procedure2/cmake/xo_procedure2Config.cmake.in index 867a3535..fa6ee3cd 100644 --- a/xo-procedure2/cmake/xo_procedure2Config.cmake.in +++ b/xo-procedure2/cmake/xo_procedure2Config.cmake.in @@ -11,4 +11,5 @@ find_dependency(xo_gc) find_dependency(subsys) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-process/cmake/processConfig.cmake.in b/xo-process/cmake/processConfig.cmake.in index dc6207c5..c8ec3a92 100644 --- a/xo-process/cmake/processConfig.cmake.in +++ b/xo-process/cmake/processConfig.cmake.in @@ -10,4 +10,5 @@ find_dependency(reactor) find_dependency(printjson) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-pydistribution/cmake/xo_pydistributionConfig.cmake.in b/xo-pydistribution/cmake/xo_pydistributionConfig.cmake.in index 9c15f36a..eb9a3b16 100644 --- a/xo-pydistribution/cmake/xo_pydistributionConfig.cmake.in +++ b/xo-pydistribution/cmake/xo_pydistributionConfig.cmake.in @@ -1,4 +1,5 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-pyexpression/cmake/xo_pyexpressionConfig.cmake.in b/xo-pyexpression/cmake/xo_pyexpressionConfig.cmake.in index dc1d5e3d..0d02261b 100644 --- a/xo-pyexpression/cmake/xo_pyexpressionConfig.cmake.in +++ b/xo-pyexpression/cmake/xo_pyexpressionConfig.cmake.in @@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro) find_dependency(xo_expression) find_dependency(xo_pyreflect) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-pyjit/cmake/xo_pyjitConfig.cmake.in b/xo-pyjit/cmake/xo_pyjitConfig.cmake.in index 5d7de08a..8ffcf9dc 100644 --- a/xo-pyjit/cmake/xo_pyjitConfig.cmake.in +++ b/xo-pyjit/cmake/xo_pyjitConfig.cmake.in @@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro) find_dependency(xo_jit) find_dependency(xo_pyexpression) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-pykalmanfilter/cmake/xo_pykalmanfilterConfig.cmake.in b/xo-pykalmanfilter/cmake/xo_pykalmanfilterConfig.cmake.in index 9c15f36a..eb9a3b16 100644 --- a/xo-pykalmanfilter/cmake/xo_pykalmanfilterConfig.cmake.in +++ b/xo-pykalmanfilter/cmake/xo_pykalmanfilterConfig.cmake.in @@ -1,4 +1,5 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-pyprintjson/cmake/xo_pyprintjsonConfig.cmake.in b/xo-pyprintjson/cmake/xo_pyprintjsonConfig.cmake.in index 9c15f36a..eb9a3b16 100644 --- a/xo-pyprintjson/cmake/xo_pyprintjsonConfig.cmake.in +++ b/xo-pyprintjson/cmake/xo_pyprintjsonConfig.cmake.in @@ -1,4 +1,5 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-pyprocess/cmake/xo_pyprocessConfig.cmake.in b/xo-pyprocess/cmake/xo_pyprocessConfig.cmake.in index 9c15f36a..eb9a3b16 100644 --- a/xo-pyprocess/cmake/xo_pyprocessConfig.cmake.in +++ b/xo-pyprocess/cmake/xo_pyprocessConfig.cmake.in @@ -1,4 +1,5 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-pyreactor/cmake/xo_pyreactorConfig.cmake.in b/xo-pyreactor/cmake/xo_pyreactorConfig.cmake.in index 9c15f36a..eb9a3b16 100644 --- a/xo-pyreactor/cmake/xo_pyreactorConfig.cmake.in +++ b/xo-pyreactor/cmake/xo_pyreactorConfig.cmake.in @@ -1,4 +1,5 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-pyreflect/cmake/xo_pyreflectConfig.cmake.in b/xo-pyreflect/cmake/xo_pyreflectConfig.cmake.in index 9c15f36a..eb9a3b16 100644 --- a/xo-pyreflect/cmake/xo_pyreflectConfig.cmake.in +++ b/xo-pyreflect/cmake/xo_pyreflectConfig.cmake.in @@ -1,4 +1,5 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-pyrprintjson/cmake/xo_pyprintjsonConfig.cmake.in b/xo-pyrprintjson/cmake/xo_pyprintjsonConfig.cmake.in index 9c15f36a..eb9a3b16 100644 --- a/xo-pyrprintjson/cmake/xo_pyprintjsonConfig.cmake.in +++ b/xo-pyrprintjson/cmake/xo_pyprintjsonConfig.cmake.in @@ -1,4 +1,5 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-pysimulator/cmake/xo_pysimulatorConfig.cmake.in b/xo-pysimulator/cmake/xo_pysimulatorConfig.cmake.in index 9c15f36a..eb9a3b16 100644 --- a/xo-pysimulator/cmake/xo_pysimulatorConfig.cmake.in +++ b/xo-pysimulator/cmake/xo_pysimulatorConfig.cmake.in @@ -1,4 +1,5 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-pyunit/cmake/xo_pyunitConfig.cmake.in b/xo-pyunit/cmake/xo_pyunitConfig.cmake.in index 18187c96..bf479a08 100644 --- a/xo-pyunit/cmake/xo_pyunitConfig.cmake.in +++ b/xo-pyunit/cmake/xo_pyunitConfig.cmake.in @@ -8,4 +8,5 @@ find_dependency(refcnt) find_dependency(indentlog) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-pyutil/cmake/xo_pyutilConfig.cmake.in b/xo-pyutil/cmake/xo_pyutilConfig.cmake.in index 9c15f36a..eb9a3b16 100644 --- a/xo-pyutil/cmake/xo_pyutilConfig.cmake.in +++ b/xo-pyutil/cmake/xo_pyutilConfig.cmake.in @@ -1,4 +1,5 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-pywebsock/cmake/xo_pywebsockConfig.cmake.in b/xo-pywebsock/cmake/xo_pywebsockConfig.cmake.in index 9c15f36a..eb9a3b16 100644 --- a/xo-pywebsock/cmake/xo_pywebsockConfig.cmake.in +++ b/xo-pywebsock/cmake/xo_pywebsockConfig.cmake.in @@ -1,4 +1,5 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-pywebutil/cmake/xo_pywebutilConfig.cmake.in b/xo-pywebutil/cmake/xo_pywebutilConfig.cmake.in index 18eaf04d..fd1c4b68 100644 --- a/xo-pywebutil/cmake/xo_pywebutilConfig.cmake.in +++ b/xo-pywebutil/cmake/xo_pywebutilConfig.cmake.in @@ -3,4 +3,5 @@ include(CMakeFindDependencyMacro) find_dependency(xo_pyutil) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-randomgen/cmake/randomgenConfig.cmake.in b/xo-randomgen/cmake/randomgenConfig.cmake.in index e66430b0..d835ad0d 100644 --- a/xo-randomgen/cmake/randomgenConfig.cmake.in +++ b/xo-randomgen/cmake/randomgenConfig.cmake.in @@ -1,4 +1,5 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/randomgenTargets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-ratio/cmake/xo_ratioConfig.cmake.in b/xo-ratio/cmake/xo_ratioConfig.cmake.in index b7a5a0a2..6f4bfb56 100644 --- a/xo-ratio/cmake/xo_ratioConfig.cmake.in +++ b/xo-ratio/cmake/xo_ratioConfig.cmake.in @@ -14,4 +14,5 @@ find_dependency(xo_flatstring) #find_dependency(callback) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-reactor/cmake/reactorConfig.cmake.in b/xo-reactor/cmake/reactorConfig.cmake.in index 19ea52a2..6079b76a 100644 --- a/xo-reactor/cmake/reactorConfig.cmake.in +++ b/xo-reactor/cmake/reactorConfig.cmake.in @@ -13,4 +13,5 @@ find_dependency(printjson) find_dependency(callback) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-reader/cmake/xo_readerConfig.cmake.in b/xo-reader/cmake/xo_readerConfig.cmake.in index 6eadeb07..94b1811e 100644 --- a/xo-reader/cmake/xo_readerConfig.cmake.in +++ b/xo-reader/cmake/xo_readerConfig.cmake.in @@ -5,4 +5,5 @@ find_dependency(xo_expression) find_dependency(xo_tokenizer) #find_dependency(subsys) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-reader2/cmake/xo_reader2Config.cmake.in b/xo-reader2/cmake/xo_reader2Config.cmake.in index ed161c20..26ab1dae 100644 --- a/xo-reader2/cmake/xo_reader2Config.cmake.in +++ b/xo-reader2/cmake/xo_reader2Config.cmake.in @@ -13,4 +13,5 @@ find_dependency(xo_expression2) find_dependency(subsys) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-refcnt/cmake/refcntConfig.cmake.in b/xo-refcnt/cmake/refcntConfig.cmake.in index edc16a80..4df193f6 100644 --- a/xo-refcnt/cmake/refcntConfig.cmake.in +++ b/xo-refcnt/cmake/refcntConfig.cmake.in @@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro) find_dependency(xo_reflectutil) find_dependency(indentlog) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-reflect/cmake/reflectConfig.cmake.in b/xo-reflect/cmake/reflectConfig.cmake.in index ce449a35..b7c79684 100644 --- a/xo-reflect/cmake/reflectConfig.cmake.in +++ b/xo-reflect/cmake/reflectConfig.cmake.in @@ -5,4 +5,5 @@ find_dependency(refcnt) find_dependency(indentlog) find_dependency(subsys) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-reflectutil/cmake/xo_reflectutilConfig.cmake.in b/xo-reflectutil/cmake/xo_reflectutilConfig.cmake.in index 26df0fc7..b57e2bb5 100644 --- a/xo-reflectutil/cmake/xo_reflectutilConfig.cmake.in +++ b/xo-reflectutil/cmake/xo_reflectutilConfig.cmake.in @@ -9,4 +9,5 @@ include(CMakeFindDependencyMacro) #find_dependency(xo_flatstring) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-simulator/cmake/simulatorConfig.cmake.in b/xo-simulator/cmake/simulatorConfig.cmake.in index 4f721e9f..c6853935 100644 --- a/xo-simulator/cmake/simulatorConfig.cmake.in +++ b/xo-simulator/cmake/simulatorConfig.cmake.in @@ -10,4 +10,5 @@ find_dependency(reactor) #find_dependency(callback) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-statistics/cmake/xo_statisticsConfig.cmake.in b/xo-statistics/cmake/xo_statisticsConfig.cmake.in index 9c15f36a..eb9a3b16 100644 --- a/xo-statistics/cmake/xo_statisticsConfig.cmake.in +++ b/xo-statistics/cmake/xo_statisticsConfig.cmake.in @@ -1,4 +1,5 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-subsys/cmake/subsysConfig.cmake.in b/xo-subsys/cmake/subsysConfig.cmake.in index 9c15f36a..eb9a3b16 100644 --- a/xo-subsys/cmake/subsysConfig.cmake.in +++ b/xo-subsys/cmake/subsysConfig.cmake.in @@ -1,4 +1,5 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-symboltable/cmake/xo_symboltableConfig.cmake.in b/xo-symboltable/cmake/xo_symboltableConfig.cmake.in index 32e5b030..204efa7f 100644 --- a/xo-symboltable/cmake/xo_symboltableConfig.cmake.in +++ b/xo-symboltable/cmake/xo_symboltableConfig.cmake.in @@ -5,4 +5,5 @@ include(CMakeFindDependencyMacro) find_dependency(xo_alloc) #find_dependency(xo_flatstring) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-tokenizer/cmake/xo_tokenizerConfig.cmake.in b/xo-tokenizer/cmake/xo_tokenizerConfig.cmake.in index f13d9e2b..e1b8fe7a 100644 --- a/xo-tokenizer/cmake/xo_tokenizerConfig.cmake.in +++ b/xo-tokenizer/cmake/xo_tokenizerConfig.cmake.in @@ -5,4 +5,5 @@ include(CMakeFindDependencyMacro) find_dependency(indentlog) #find_dependency(subsys) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-tokenizer2/cmake/xo_tokenizer2Config.cmake.in b/xo-tokenizer2/cmake/xo_tokenizer2Config.cmake.in index 13f1dac1..eccd2745 100644 --- a/xo-tokenizer2/cmake/xo_tokenizer2Config.cmake.in +++ b/xo-tokenizer2/cmake/xo_tokenizer2Config.cmake.in @@ -10,4 +10,5 @@ find_dependency(xo_arena) find_dependency(indentlog) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-unit/cmake/xo_unitConfig.cmake.in b/xo-unit/cmake/xo_unitConfig.cmake.in index 849efa07..79865d60 100644 --- a/xo-unit/cmake/xo_unitConfig.cmake.in +++ b/xo-unit/cmake/xo_unitConfig.cmake.in @@ -9,4 +9,5 @@ find_dependency(indentlog) #find_dependency(callback) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-websock/cmake/websockConfig.cmake.in b/xo-websock/cmake/websockConfig.cmake.in index 3e03d576..c926812b 100644 --- a/xo-websock/cmake/websockConfig.cmake.in +++ b/xo-websock/cmake/websockConfig.cmake.in @@ -11,4 +11,5 @@ find_dependency(webutil) find_dependency(Libwebsockets) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") diff --git a/xo-webutil/cmake/webutilConfig.cmake.in b/xo-webutil/cmake/webutilConfig.cmake.in index 79a9df3d..6867c0da 100644 --- a/xo-webutil/cmake/webutilConfig.cmake.in +++ b/xo-webutil/cmake/webutilConfig.cmake.in @@ -3,4 +3,5 @@ include(CMakeFindDependencyMacro) find_dependency(callback) include("${CMAKE_CURRENT_LIST_DIR}/webutilTargets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake") check_required_components("@PROJECT_NAME@") From 7abddb4714a0483772e15c11af6046e2bb1d8856 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 27 Feb 2026 19:41:03 +1100 Subject: [PATCH 31/35] osx build: #include in _Any.cpp --- xo-expression2/src/expression2/IExpression_Any.cpp | 1 + xo-expression2/src/expression2/ISymbolTable_Any.cpp | 1 + xo-procedure2/src/procedure2/IProcedure_Any.cpp | 1 + xo-procedure2/src/procedure2/IRuntimeContext_Any.cpp | 1 + xo-reader2/src/reader2/ISyntaxStateMachine_Any.cpp | 1 + 5 files changed, 5 insertions(+) diff --git a/xo-expression2/src/expression2/IExpression_Any.cpp b/xo-expression2/src/expression2/IExpression_Any.cpp index 9557e7e7..fe245c76 100644 --- a/xo-expression2/src/expression2/IExpression_Any.cpp +++ b/xo-expression2/src/expression2/IExpression_Any.cpp @@ -4,6 +4,7 @@ #include "detail/IExpression_Any.hpp" #include +#include namespace xo { namespace scm { diff --git a/xo-expression2/src/expression2/ISymbolTable_Any.cpp b/xo-expression2/src/expression2/ISymbolTable_Any.cpp index 95718429..31d324de 100644 --- a/xo-expression2/src/expression2/ISymbolTable_Any.cpp +++ b/xo-expression2/src/expression2/ISymbolTable_Any.cpp @@ -4,6 +4,7 @@ #include "symtab/ISymbolTable_Any.hpp" #include +#include namespace xo { namespace scm { diff --git a/xo-procedure2/src/procedure2/IProcedure_Any.cpp b/xo-procedure2/src/procedure2/IProcedure_Any.cpp index dcdf9eeb..8ff611c7 100644 --- a/xo-procedure2/src/procedure2/IProcedure_Any.cpp +++ b/xo-procedure2/src/procedure2/IProcedure_Any.cpp @@ -4,6 +4,7 @@ #include "detail/IProcedure_Any.hpp" #include +#include namespace xo { namespace scm { diff --git a/xo-procedure2/src/procedure2/IRuntimeContext_Any.cpp b/xo-procedure2/src/procedure2/IRuntimeContext_Any.cpp index 1ea5859a..195bd135 100644 --- a/xo-procedure2/src/procedure2/IRuntimeContext_Any.cpp +++ b/xo-procedure2/src/procedure2/IRuntimeContext_Any.cpp @@ -4,6 +4,7 @@ #include "detail/IRuntimeContext_Any.hpp" #include +#include namespace xo { namespace scm { diff --git a/xo-reader2/src/reader2/ISyntaxStateMachine_Any.cpp b/xo-reader2/src/reader2/ISyntaxStateMachine_Any.cpp index 393fea04..4fa59332 100644 --- a/xo-reader2/src/reader2/ISyntaxStateMachine_Any.cpp +++ b/xo-reader2/src/reader2/ISyntaxStateMachine_Any.cpp @@ -4,6 +4,7 @@ #include "ssm/ISyntaxStateMachine_Any.hpp" #include +#include namespace xo { namespace scm { From e72e7c25a788261c468fc54e675731e4ce2f7726 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 27 Feb 2026 19:42:06 +1100 Subject: [PATCH 32/35] build: + install target for idl .json5 files --- xo-gc/CMakeLists.txt | 4 ++++ xo-object2/CMakeLists.txt | 4 ++++ xo-printable2/CMakeLists.txt | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/xo-gc/CMakeLists.txt b/xo-gc/CMakeLists.txt index 4a05fc4a..573e5acc 100644 --- a/xo-gc/CMakeLists.txt +++ b/xo-gc/CMakeLists.txt @@ -35,6 +35,10 @@ xo_add_genfacet_all(xo-gc-genfacet-all) add_subdirectory(src/gc) add_subdirectory(utest) +install(DIRECTORY idl/ + DESTINATION share/${PROJECT_NAME}/idl + FILES_MATCHING PATTERN "*.json5") + xo_export_cmake_config(${PROJECT_NAME} ${PROJECT_VERSION} ${PROJECT_NAME}Targets) # ---------------------------------------------------------------- diff --git a/xo-object2/CMakeLists.txt b/xo-object2/CMakeLists.txt index 4b0962de..af08b267 100644 --- a/xo-object2/CMakeLists.txt +++ b/xo-object2/CMakeLists.txt @@ -193,6 +193,10 @@ xo_add_genfacet_all(xo-object2-genfacet-all) add_subdirectory(src/object2) add_subdirectory(utest) +install(DIRECTORY idl/ + DESTINATION share/${PROJECT_NAME}/idl + FILES_MATCHING PATTERN "*.json5") + xo_export_cmake_config(${PROJECT_NAME} ${PROJECT_VERSION} ${PROJECT_NAME}Targets) # ---------------------------------------------------------------- diff --git a/xo-printable2/CMakeLists.txt b/xo-printable2/CMakeLists.txt index 7d3990be..602fce5e 100644 --- a/xo-printable2/CMakeLists.txt +++ b/xo-printable2/CMakeLists.txt @@ -31,6 +31,10 @@ xo_add_genfacet( add_subdirectory(src/printable2) #add_subdirectory(utest) +install(DIRECTORY idl/ + DESTINATION share/${PROJECT_NAME}/idl + FILES_MATCHING PATTERN "*.json5") + xo_export_cmake_config(${PROJECT_NAME} ${PROJECT_VERSION} ${PROJECT_NAME}Targets) # ---------------------------------------------------------------- From ea1dca81230dbf2765bf8d8e66f6b41d77ddd02e Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 27 Feb 2026 19:42:29 +1100 Subject: [PATCH 33/35] osx build: + unistd.h for isatty() --- xo-interpreter2/src/skrepl/skreplxx.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xo-interpreter2/src/skrepl/skreplxx.cpp b/xo-interpreter2/src/skrepl/skreplxx.cpp index df6be29d..123d323f 100644 --- a/xo-interpreter2/src/skrepl/skreplxx.cpp +++ b/xo-interpreter2/src/skrepl/skreplxx.cpp @@ -9,6 +9,7 @@ #include #include #include +#include // for isatty() namespace xo { using xo::scm::VirtualSchematikaMachine; @@ -85,7 +86,7 @@ namespace xo { AppConfig(const ReplConfig & repl_cfg = ReplConfig(), const ArenaConfig & app_arena_cfg = ArenaConfig().with_name("skreplxx").with_size(16 * 1024), - const VsmConfig & vsm_cfg = VsmConfig()) + const VsmConfig & vsm_cfg = VsmConfig()) : repl_config_{repl_cfg}, app_arena_config_{app_arena_cfg}, vsm_config_{vsm_cfg} { //rdr_config_.reader_debug_flag_ = true; @@ -239,4 +240,3 @@ main (int argc, char * argv[]) } /*main*/ /* end skreplxx.cpp */ - From e2880cadbee4dfc2402110a2c59cb24e1c633f19 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 27 Feb 2026 19:42:43 +1100 Subject: [PATCH 34/35] build: + for osx build --- .../include/xo/interpreter2/VirtualSchematikaMachine.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xo-interpreter2/include/xo/interpreter2/VirtualSchematikaMachine.hpp b/xo-interpreter2/include/xo/interpreter2/VirtualSchematikaMachine.hpp index 75fb968f..0df50ced 100644 --- a/xo-interpreter2/include/xo/interpreter2/VirtualSchematikaMachine.hpp +++ b/xo-interpreter2/include/xo/interpreter2/VirtualSchematikaMachine.hpp @@ -15,6 +15,7 @@ #include #include #include +#include namespace xo { namespace scm { @@ -91,7 +92,7 @@ namespace xo { /** allocator for runtime errors **/ obj error_allocator() const noexcept; - /** true iff parser is at top-level -> does not contain + /** true iff parser is at top-level -> does not contain * state for a incomplete/partial expression **/ bool is_at_toplevel() const noexcept; From 6727fd03816d5d72d5de9c5d0b920656ed547cbe Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 27 Feb 2026 21:38:02 +1100 Subject: [PATCH 35/35] nix-build: shell4-osx uses clang18 --- README.md | 5 +++-- default.nix | 17 ++++++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 11d705d0..1a3441c6 100644 --- a/README.md +++ b/README.md @@ -49,8 +49,9 @@ If `nix` is available, you probably prefer the nix build, unless working on XO i Otherwise continue reading.. ``` -$ cd xo -$ PREFIX=/path/to/say/usr/local +$ PREFIX=/path/to/say/home/local +$ cd xo-umbrella2 +$ (cd xo-cmake && cmake -DCMAKE_INSTALL_PREFIX=$PREFIX -B .build -S . && cmake --install .build) $ cmake -B .build -S . -DCMAKE_INSTALL_PREFIX=${PREFIX} -DXO_ENABLE_EXAMPLES=1 -DXO_ENABLE_DOCS=1 -DCMAKE_BUILD_TYPE=debug $ cmake --build .build --verbose $ cmake --install .build diff --git a/default.nix b/default.nix index e3139947..77c8f1e1 100644 --- a/default.nix +++ b/default.nix @@ -752,11 +752,18 @@ in # 2 - merge to look like shell4-wsl / shell4-nvidia # #shell4-osx = pkgs.mkShell.override { stdenv = pkgs.jitStdenv; } { .. } # very high attack surface area - shell4-osx = pkgs.mkShell { - buildInputs = docutils ++ xodeps ++ devutils ++ ideutils ++ x11utils ++ gldeps ++ vkdeps ++ imguideps; + shell4-osx = + let + clangStdenv = pkgs.overrideCC pkgs.stdenv pkgs.llvmPackages_18.clang; + in + let jitStdenv = if pkgs.stdenv.isDarwin then clangStdenv else pkgs.stdenv; + in + (pkgs.mkShell.override { stdenv = jitStdenv; }) + { + buildInputs = docutils ++ xodeps ++ devutils ++ ideutils ++ x11utils ++ gldeps ++ vkdeps ++ imguideps; - shellHook = - '' + shellHook = + '' export CXENV=$CXENV:xo4-WIP # override SOUCE_DATE_EPOCH to current time (otherwise will get 1980) @@ -777,7 +784,7 @@ in # dependencies on host system libraries # glpath = pkgs.lib.makeLibraryPath [ ]; ''; - }; + }; # like shell4 but drop etc/hostwsl2 symlink dir. # looks like nixpkgs mesa not built for wsl2 dxg