PATH_DOCS=out/markdown
generate:
mkdir -p out
find . -maxdepth 1 -name .gitignore | xargs -IX sed '/^#\s*EOF_DOCKERIGNORE.*/q' X > .dockerignore
test:
cargo test
big:
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '/^blob/ {size=$$3; $$1=$$2=$$3=""; sub(/^ +/, ""); printf "%12d %s\n", size, $$0}' | sort -n
update: generate
cargo install --root out mdbook --version 0.4.50
cargo fmt
cargo run --example codegen -- src/traits.rs src/lib.rs
cargo run --example markdown -- $(PATH_DOCS)/SUMMARY.md ./README.md
./out/bin/mdbook build
publish-ready:
git branch --show-current | grep -qx main gh api repos/lzpel/cadrum/commits/main --jq .sha | grep -q $(shell git rev-parse --short HEAD) cargo publish --dry-run publish: update publish-ready
$(MAKE) cross-wasm32-unknown-unknown GOAL=generate
docker tag cross-wasm32-unknown-unknown ghcr.io/lzpel/cross-wasm32-unknown-unknown:latest
docker push ghcr.io/lzpel/cross-wasm32-unknown-unknown:latest
cargo publish
occt: generate
cargo clean
bash -c "set -o pipefail && CADRUM_BUNDLE_RUNTIME=1 cargo build --example 01_primitives --release --features source 2>&1 | tee out/log.txt"
find $(or $(CARGO_TARGET_DIR),target) -maxdepth 1 -type d -name 'occt*' | xargs -IX sh -c 'tar -czf out/$$(basename X).tar.gz -C $$(dirname X) $$(basename X)'
cadrum: generate
cargo clean
cargo build --example 01_primitives --release
find $(or $(CARGO_TARGET_DIR),target) -name 'libocct-*-cadrum*.a' -exec cp {} out/ \;
sample-wasm:
mkdir -p target/check-wasm/src
printf '%s\n' "$$CHECK_WASM_CARGO_TOML" > target/check-wasm/Cargo.toml
printf '%s\n' "$$CHECK_WASM_LIB_RS" > target/check-wasm/src/lib.rs
cd target/check-wasm && cargo build --release --target-dir $(CURDIR)/target
cross-%:
@test -n "$(GOAL)" || { echo "GOAL is required: make cross-$* GOAL=occt|cadrum"; exit 1; }
docker build -f docker/Dockerfile_$(*) -t cross-$(*) .
docker run --rm -v $(PWD):/src -w /src -e CARGO_TARGET_DIR=/tmp/target -v $(PWD)/out/$(*):/src/out cross-$(*) make $(GOAL)
check-%:
$(MAKE) cross-$* GOAL=occt
mkdir -p target
find out -maxdepth 2 -type f -name '*.tar.gz' | xargs -IX tar -xzf X -C target
if [ "$*" = "wasm32-unknown-unknown" ]; then \
$(MAKE) cross-$* GOAL=sample-wasm; \
node -e "const fs=require('fs');WebAssembly.instantiate(fs.readFileSync('target/wasm32-unknown-unknown/release/check_wasm.wasm')).then(({instance})=>{instance.exports.start();const v=instance.exports.volume();console.log('Solid volume:',v);process.exit(v===6000?0:1)})"; \
else \
timeout 300 cargo run --example 01_primitives; \
fi
define CHECK_WASM_CARGO_TOML
[package]
name = "check-wasm"
version = "0.0.0"
edition = "2024"
[lib]
crate-type = ["cdylib"]
[dependencies]
cadrum = { path = "../..", default-features = false, features = ["color"] }
# An empty [workspace] keeps this a standalone workspace root, without which cargo would ignore the
# [profile] below. The optimizations only reach the Rust side -- the OCCT/libc++ archives are
# prebuilt, so their size is untouched by any of this.
[workspace]
[profile.release]
opt-level = "s"
lto = true
codegen-units = 1
strip = true
endef
export CHECK_WASM_CARGO_TOML
define CHECK_WASM_LIB_RS
use cadrum::{DVec3, Solid};
// A cdylib links with --no-entry, so OCCT's C++ global constructors never run on their own.
#[unsafe(no_mangle)]
pub extern "C" fn start() {
cadrum::__anchor_wasi_stub();
unsafe extern "C" {
fn __wasm_call_ctors();
}
unsafe { __wasm_call_ctors() };
}
#[unsafe(no_mangle)]
pub extern "C" fn volume() -> f64 {
let solid = Solid::cube(DVec3::ZERO, DVec3::new(10.0, 20.0, 30.0)).color("#4a90d9");
// Round-trip STEP through memory, never a file, so the OSD_File stub layer stays out of it.
let mut bytes: Vec<u8> = Vec::new();
Solid::write_step([&solid], &mut bytes).expect("write_step to memory failed");
let mut cursor = std::io::Cursor::new(&bytes);
let solids = Solid::read_step(&mut cursor).expect("read_step from memory failed");
solids.first().expect("no solid after round-trip").volume()
}
endef
export CHECK_WASM_LIB_RS