<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>elizafox.life — Projects</title>
    <link>https://elizafox.life/projects/</link>
    <description>Personal projects by Elizabeth Ashford.</description>
    <language>en-us</language>
    <lastBuildDate>Wed, 19 Aug 2026 08:17:53 GMT</lastBuildDate>
    <atom:link href="https://elizafox.life/projects/rss.xml" rel="self" type="application/rss+xml"/>

    <item>
      <title>cxx-modgraph</title>
      <link>https://elizafox.life/projects/cxx-modgraph/</link>
      <guid isPermaLink="true">https://elizafox.life/projects/cxx-modgraph/</guid>
      <pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate>
      <description>A compiler-neutral dependency-graph bridge for C++ modules and build systems.</description>
      <content:encoded>&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;cxx-modgraph&amp;lt;/code&amp;gt; is a small C++20 tool that turns compiler-generated C++ module
dependency information into a deterministic build graph. It imports P1689
dependency scans, validates and orders them as a DAG, and emits build-system
friendly formats such as includable GNU Make fragments and canonical JSON.&amp;lt;/p&amp;gt;
&amp;lt;h2&amp;gt;Description&amp;lt;/h2&amp;gt;
&amp;lt;p&amp;gt;C++ modules introduce an additional build-ordering problem: before compiling a
translation unit, the build system must know which modules it imports, where
those modules are provided, and which binary module interfaces must already
exist. Compilers can discover this information, but integrating their output
into simple or bespoke build systems remains awkward.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;cxx-modgraph&amp;lt;/code&amp;gt; bridges this gap. It combines a compiler&amp;apos;s
&amp;lt;a href=&amp;quot;https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1689r2.html&amp;quot;&amp;gt;P1689&amp;lt;/a&amp;gt;
dependency scan with its compilation database, normalizes the result into a
compiler-neutral model, validates providers and imports, detects cycles, and
processes the graph deterministically using Kahn’s algorithm. It can then emit
canonical JSON or a recipe-free Make fragment containing BMI and object
prerequisites.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The project deliberately separates dependency facts from compiler commands.
&amp;lt;code&amp;gt;cxx-modgraph&amp;lt;/code&amp;gt; describes what must be built and in what dependency order;
adapters or consuming build systems decide how to invoke the compiler. The
included Clang/GNU Make adapter demonstrates the complete workflow: it
discovers local module-interface candidates from explicit module directories,
runs clang-scan-deps, imports the resulting P1689 graph, builds libc++&amp;apos;s &amp;lt;code&amp;gt;std&amp;lt;/code&amp;gt;
module, and compiles a custom module and its consumer incrementally.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The longer-term goal is to provide a small interoperability layer for plain
Makefiles, bespoke CMake or Meson integrations, and other build systems while
native C++ module support continues to mature.&amp;lt;/p&amp;gt;
&amp;lt;h2&amp;gt;Example Makefile&amp;lt;/h2&amp;gt;
&amp;lt;p&amp;gt;Here is an example GNU Makefile from the project, showing the gains in
simplicity:&amp;lt;/p&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-make&amp;quot;&amp;gt;CXX := clang++

.DEFAULT_GOAL := all

CXX_MODGRAPH := ../../build/cxx-modgraph
CXX_MODGRAPH_SOURCES := src/main.cpp
CXX_MODGRAPH_MODULE_PATHS := modules
CXX_MODGRAPH_USE_LIBCXX_STD := 1

include ../../adapters/make/clang.mk

.PHONY: all clean
all: hello

hello: $(CXX_MODGRAPH_LINK_OBJECTS)
 $(CXX) $(CXX_MODGRAPH_CXXFLAGS) $^ -o $@

clean:
 rm -rf build hello
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;Anyone who has worked with C++ modules will appreciate the amount of ceremony
reduced by using this. The nice thing about this approach is that it scales to
even larger &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt;-based projects.&amp;lt;/p&amp;gt;
</content:encoded>
    </item>

    <item>
      <title>Luminate</title>
      <link>https://elizafox.life/projects/luminate/</link>
      <guid isPermaLink="true">https://elizafox.life/projects/luminate/</guid>
      <pubDate>Sun, 16 Aug 2026 00:00:00 GMT</pubDate>
      <description>A cross-platform lighting control daemon</description>
      <content:encoded>&amp;lt;p&amp;gt;This is a placeholder page for my lighting daemon, luminate.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I intend to make this more elaborate later.&amp;lt;/p&amp;gt;
</content:encoded>
    </item>

  </channel>
</rss>

