Skip to main content

max / makeover-layout

0.16.0: one copy of the vocabulary per graph, or the build fails Two versions of a description layer in one dependency graph is not a warning today, it is a silent second copy. goingson was carrying one: makeover-build 0.20.1 resolved makeover-webview 0.25.1 while src-tauri asked for 0.26.0, so layout.css and tables.css were generated off different vocabularies from a single build.rs run, and nothing said so. quasi-vocabulary-findings lesson 5 already named the failure and answered it with a procedure someone has to remember. `links` makes cargo remember instead. Only one package per graph may claim a given links value, so a second copy is a resolver error with a message naming both packages. The cost is that a bump here is tree-wide rather than per-repo, the same way libsqlite3-sys makes a rusqlite bump tree-wide. That is the intended effect. The guard only bites between versions that both declare `links`, so it stops skew from here forward and not skew against 0.15.0 and earlier. build.rs exists solely because cargo requires a build script alongside `links`.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-12 01:18 UTC
Commit: e1a489ba111d6b5b3cd7d8c0d370e003bbd2e978
Parent: 2deb098
2 files changed, +21 insertions, -1 deletion
M Cargo.toml +6 -1
@@ -1,7 +1,12 @@
1 1 [package]
2 2 name = "makeover-layout"
3 - version = "0.15.0"
3 + version = "0.16.0"
4 4 edition = "2024"
5 + # One copy of this vocabulary per dependency graph, enforced by cargo rather
6 + # than by remembering. Two versions of a description layer in one build means
7 + # the stylesheet and the markup can be generated off different vocabularies,
8 + # which is exactly what goingson was doing until 2026-08-11. See build.rs.
9 + links = "makeover-layout"
5 10 description = "The renderer-agnostic half of the make-family design system: what a thing IS, named as intents and relationships and never as values. Colour defers to makeover, spacing to makeover-geometry; what is left is composition."
6 11 license = "MIT"
7 12 repository = "https://makenot.work/git/max/makeover-layout"
A build.rs +15
@@ -1,0 +1,15 @@
1 + //! Nothing is built here. The file exists because `links` in Cargo.toml
2 + //! requires it, and `links` is what makes two copies of this vocabulary in one
3 + //! dependency graph a resolver error rather than a silent second copy.
4 + //!
5 + //! Cargo permits exactly one crate with a given `links` value per graph. That
6 + //! is the same property `libsqlite3-sys` gives rusqlite, and it is why a
7 + //! version bump here is tree-wide rather than per-repo. Intended: version skew
8 + //! across consumers is the thing being prevented.
9 + //!
10 + //! The guard only bites between versions that both declare `links`, so it
11 + //! stops future skew rather than skew against anything published before 0.16.0.
12 +
13 + fn main() {
14 + println!("cargo::rerun-if-changed=build.rs");
15 + }