wyvrnpm 2.21.2 → 2.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,44 +4,22 @@ A simple, private C++ package manager that works with any static file hosting pr
4
4
 
5
5
  There is no central registry. You control where packages are hosted.
6
6
 
7
- > **README version: 2.20.2**
7
+ > **README version: 2.22.0**
8
8
  >
9
- > **New in 2.16.0 – 2.20.2:**
9
+ > **New in 2.16.0 – 2.22.0:**
10
10
  >
11
- > - **Visual Studio architecture pinning (2.20.0).** A recipe-less Windows/MSVC consumer (one that only lists `dependencies`, no `build` recipe) used to get a generator-less `wyvrn-<profile>` preset, so `cmake --preset` fell through to CMake's implicit Visual Studio default — which targets the **host** arch (x64) when no `-A` is supplied. An `x86` / `armv8` profile therefore silently produced 64-bit binaries. `wyvrnpm install` now detects the default VS generator and bakes both `generator` and `architecture` into the emitted preset, and `wyvrnpm build` derives `-A` (`x86→Win32`, `x86_64→x64`, `armv8→ARM64`, `armv7→ARM`) for VS generators. Builds now match the profile's bitness without a recipe. (Already-published non-host-arch artefacts built via the old source-build path may still hold wrong-bitness binaries — those are rebuilt + republished out of band.)
12
- > - **`wyvrnpm build` resolves the generator from the emitted preset, not the recipe (2.20.2).** The configure step now reads the generator that `cmake --preset` will *actually* use — precedence: CLI `--generator` > the `generator` baked into `CMakePresets.json` > the detected default for a generator-less preset. This drives both the `-A` pin and the vcvarsall-skip decision, so they stay consistent with reality. Fixes a class of failures where a Ninja Multi-Config preset got `-A x64` ("does not support platform specification") and skipped vcvarsall ("CMAKE_CXX_COMPILER not set") because the old code re-derived the generator from the recipe — which can legitimately diverge from the preset (an install-time `--generator`, or a recipe edited after the last install).
13
- > - **CMake-path fallback (2.20.1).** `install` / `build` / source-build no longer fail outright on a machine where CMake isn't on `PATH` — `resolveCmakeExe()` falls back to the Windows default `C:\Program Files\CMake\bin\cmake.exe` before surfacing the usual "is CMake installed?" error.
14
- > - **Machine-wide binary package cache (2.19.0).** Every successful v2 exact-match download is also cached under `%LOCALAPPDATA%\wyvrnpm\pkg\` (14-day TTL) so re-installs across projects skip the network. `wyvrnpm cache list` / `cache prune` gain a `--type src|pkg|all` selector covering both this and the source-build cache, and `wyvrnpm clean --pkg-cache` wipes it.
15
- > - **`wyvrnpm test` (2.18.0).** A `ctest --preset wyvrn-<profile>-<config>` wrapper that auto-builds when stale, supports `-R` / `-L` filters and `--all-configs`, and emits a `--format json` summary for CI.
16
- > - **Output directory restructure (2.17.0).** Compiled artefacts now land inside the CMake binary dir (`<binaryDir>/lib`, `<binaryDir>/bin`) instead of `${CMAKE_SOURCE_DIR}/output/`, so `wyvrnpm clean --all` actually catches them. Scripts that hard-coded `output/bin64/…` must switch paths — `clean --all` sweeps the legacy `output/` tree as a migration aid.
17
- > - **`wyvrnpm clean` flags (2.16.0).** `--build-dir` (also wipe the active profile's CMake build tree), `--all` (scorched-earth: build dirs + `wyvrn-*` presets + legacy `output/`), and `--dry-run` (preview, write nothing).
11
+ > - **`build --configure-only` (2.22.0)** configure only (`cmake --preset` `.sln` / `build.ninja`), skip compile; still auto-installs + applies the MSVC env / VS `-A` pin.
12
+ > - **VS architecture pinning (2.20.0)** recipe-less Windows/MSVC consumers bake `generator` + `architecture` into the preset and derive `-A` from arch, so `x86` / `armv8` profiles stop silently building x64.
13
+ > - **Generator from preset, not recipe (2.20.2)** configure reads the generator `cmake --preset` will actually use (CLI `--generator` > baked preset > detected default), keeping the `-A` pin + vcvarsall-skip consistent.
14
+ > - **CMake-path fallback (2.20.1)** falls back to `C:\Program Files\CMake\bin\cmake.exe` when CMake isn't on `PATH`.
15
+ > - **Machine-wide pkg cache (2.19.0)** v2 downloads cached under `%LOCALAPPDATA%\wyvrnpm\pkg\` (14-day TTL); `cache list` / `prune --type src|pkg|all`, `clean --pkg-cache`.
16
+ > - **`wyvrnpm test` (2.18.0)** `ctest --preset` wrapper: auto-build, `-R` / `-L` filters, `--all-configs`, `--format json`.
17
+ > - **Output dir restructure (2.17.0)** artefacts land in `<binaryDir>/lib|bin` instead of `output/`; `clean --all` catches them.
18
+ > - **`clean` flags (2.16.0)** — `--build-dir`, `--all`, `--dry-run`.
18
19
  >
19
- > **Planned (not yet shipped):**
20
+ > **Planned:** resolver provider unification — route metadata lookups through provider methods so S3 SigV4 / auth live in one place ([plan](.claude-wyvrn-local/plans/2026-04-24-resolver-http-unify.md)).
20
21
  >
21
- > - **Resolver → provider unification.** Today the dependency resolver (`resolve.js` / `download.js`) talks to registries through a bare `fetch` client that hard-codes the v2/v1 URL layouts, separate from the provider classes that handle publish + download. The plan is to route all metadata lookups through provider methods (`v2GetVersionsIndex` / `v2GetMeta` / `v2GetLatest` / `v1*`) so S3 SigV4, auth resolution, and provider-specific quirks live in one place. Design captured in [.claude-wyvrn-local/plans/2026-04-24-resolver-http-unify.md](.claude-wyvrn-local/plans/2026-04-24-resolver-http-unify.md). The 2.8.4 `Accept-Encoding: identity` hotfix covers the immediate CloudFront cache-split symptom in the meantime.
22
- >
23
- > **New in 2.15.0:**
24
- >
25
- > - **`buildDependencies` block + `whenOption` gating.** Recipes declare author-private deps (asio / websocketpp / boost-internals — header-only libs that compile into a `StaticLib`; protoc / flex / bison — tools invoked at configure time) in a sibling block to `dependencies`. Walked at the author's root and at source-build of a transitive, but **never walked transitively when a downstream consumer pulls the prebuilt binary** — they get the lean runtime closure. `whenOption: "websocket"` (or `"api=legacy"`) gates a dep on a recipe-declared option value. Subsumes Conan's `test_requires`: `options.tests` + gtest in `buildDependencies` with `whenOption: "tests"` → consumers of the prebuilt binary never see it. Closes EVALUATION.md **F3**; cross-compilation half stays open as F4.
26
- > - **npm self-update notifier.** When a newer `wyvrnpm` is on the npm registry, the next interactive run prints `[wyvrn] warn wyvrnpm <old> → <new> available` on stderr. The fetch runs in a detached background process — the user's command never blocks on the network; the banner appears on the *following* invocation. Auto-suppressed in CI, non-TTY, and `--format json`; opt out via `WYVRNPM_NO_UPDATE_CHECK=1` or `--no-update-check`. Hand-rolled (~120 lines, zero new deps).
27
- > - **Resolver caches `@latest` lookups** within a single `wyvrnpm install`. When a package is referenced as `@latest` from multiple parents (or already resolved via a range), the registry round-trip is reused. Eliminates ~12 redundant HTTPS round-trips on a typical 16-dep graph behind CloudFront. Brings `latestCache` into line with the existing `manifestCache` / `publishedCache`.
28
- > - **Per-config artefact slicing.** Recipes opt in via `build.publishPerConfig: true`; `wyvrnpm publish` emits one `wyvrn-<Config>.zip` per declared CMake config under one `profileHash` URL. Consumers fetch only what they need — `wyvrnpm install --request-configs Release` pulls 1.93 GB of gRPC instead of 14.96 GB across all four configs (~87% saving). Driven by CMake's own `*Targets-<config>.cmake` exports, so both the MSVC convention (`lib/<Config>/foo.lib`) and the postfix convention (`lib/foo.lib` vs `lib/food.lib`) classify correctly. `wyvrn.local.json` gains `requestConfigs` + `depRequestConfigs`. Attestation v2 binds an `artefactSha256: { config → sha }` map under one signature.
29
- > - `wyvrnpm publish --dry-run` materialises the would-be-uploaded artefacts to `<build>/dry-run-publish/` for inspection (override with `--dry-run-out`), and tolerates expired AWS credentials (`wouldOverwrite: null` instead of crashing).
30
- >
31
- > **Highlights since 2.8.3:**
32
- >
33
- > - **S1 artefact signing.** Ed25519 detached signatures over a canonical attestation, verified against a per-registry `.trust/keys.json`. `wyvrnpm key gen / show-pub`, `wyvrnpm trust list / refresh`, `wyvrnpm configure signing set-default / show / unset`. `--require-signatures` on install; `--no-sign` / `--signing-key-env` / `--signing-key-file` on publish. Pure-Node `crypto` — no external tooling, identical on Windows / Linux / macOS. Closes **S1** + **S3**.
34
- > - **`compiler.cppstd` is authoritative.** `CMAKE_CXX_STANDARD` is set unconditionally before `project()`; `cpp.cmake` no longer touches it post-`project()`. A `-DCMAKE_CXX_STANDARD=23` on the cmake CLI cannot defeat a `cppstd=20` profile.
35
- > - **Honest install exit codes.** `wyvrnpm install` exits non-zero on partial failure (sha256-mismatch, extract-failed, no-exact-match, source-build-failed, not-found) with a per-dep failure summary, instead of misreporting "Done — N installed".
36
- > - **Streaming publish via `archiver`.** Handles >2 GiB artefacts that `adm-zip` choked on — e.g. gRPC's `RelWithDebInfo` static libs.
37
- > - **`--build-dir <path>` + `wyvrn.local.json:binaryDirRoot`.** Sidesteps `build/` case-insensitive-FS collisions on repos with a Bazel/Buck `BUILD` file at the root (gRPC, …).
38
- > - **`wyvrnpm version`** — read / set / partially update the top-level `version` field from CI (`wyvrnpm version --build "$BUILD_ID"`).
39
- > - **`wyvrnpm bootstrap <git-url>`** — scaffold a first-draft `wyvrn.json` for OSS C++ libraries (fmt, spdlog, zlib, …) with cookbook-driven defaults.
40
- > - **`wyvrnpm publish --dry-run`** — npm-style preview of the upload plan; `wouldOverwrite` flag in `--format json`.
41
- > - **`wyvrnpm build --config Debug,Release` / `--all-configs`** — build multiple configurations from a single configure.
42
- > - **CloudFront brotli-vs-identity cache split fix** — resolved a class of bugs where `show` listed a freshly-published version that `install` claimed didn't exist.
43
- >
44
- > Full list in [claude/EVALUATION.md](claude/EVALUATION.md).
22
+ > **Earlier:** `buildDependencies` + `whenOption` gating · npm self-update notifier · `@latest` lookup caching · per-config artefact slicing + `--request-configs` · `publish --dry-run` · S1 Ed25519 signing · authoritative `compiler.cppstd` · honest install exit codes · streaming publish via `archiver` · `--build-dir` / `binaryDirRoot` · `wyvrnpm version` · `wyvrnpm bootstrap` · `build --config Debug,Release` / `--all-configs` · CloudFront cache-split fix.
45
23
 
46
24
  ---
47
25
 
@@ -461,6 +439,9 @@ wyvrnpm build --install --install-prefix C:\out\stage
461
439
  # Skip the auto-install step
462
440
  wyvrnpm build --no-auto-install
463
441
 
442
+ # Generate the .sln / build.ninja project files without compiling
443
+ wyvrnpm build --configure-only
444
+
464
445
  # Pass extra args through to cmake --build
465
446
  wyvrnpm build -- -j 8
466
447
  ```
@@ -476,6 +457,7 @@ wyvrnpm build -- -j 8
476
457
  | `--target` / `-t` | *(all)* | Specific CMake target to build. |
477
458
  | `--verbose` / `-v` | `false` | Pass `--verbose` to `cmake --build`. |
478
459
  | `--clean` | `false` | Remove the build directory before configuring. |
460
+ | `--configure-only` | `false` | Run only the CMake configure step (generate the `.sln` / `build.ninja` project files) and stop before compiling. Still auto-installs a stale toolchain and applies the MSVC env + Visual Studio `-A` arch pin. |
479
461
  | `--generator` / `-G` | *(from preset)* | Override the CMake generator used at configure time (e.g. `"Visual Studio 17 2022"`, `"Ninja"`, `"Ninja Multi-Config"`). CMake bakes the generator into the cache, so pair with `--clean` when switching. When the effective generator is Visual Studio, `-A <platform>` is auto-derived from the profile's arch (`x86→Win32`, `x86_64→x64`, `armv8→ARM64`, `armv7→ARM`) so VS doesn't silently default to x64 on 32-bit profiles. |
480
462
  | `--install` | `false` | Run `cmake --install` after a successful build. |
481
463
  | `--install-prefix` | *(baked in)* | Override `CMAKE_INSTALL_PREFIX` for `--install` without reconfiguring. |
@@ -2165,7 +2147,7 @@ wyvrnpm build --install --all-configs
2165
2147
 
2166
2148
  1. **Staleness check** — if `wyvrn_internal/wyvrn_toolchain.cmake` is missing or `wyvrn.lock` is newer than it, auto-runs `wyvrnpm install` first. Disable with `--no-auto-install`.
2167
2149
  2. **Optional clean** — `--clean` wipes the build directory before configuring.
2168
- 3. **Configure** — `cmake --preset wyvrn-<profile>` (or the value of `--preset`).
2150
+ 3. **Configure** — `cmake --preset wyvrn-<profile>` (or the value of `--preset`). `--configure-only` stops here, leaving the generated project files in place.
2169
2151
  4. **Build** — `cmake --build <binaryDir> --config <config>`.
2170
2152
  5. **Install** — `cmake --install <binaryDir> --config <config> [--prefix <install-prefix>]`.
2171
2153
 
package/bin/wyvrnpm.js CHANGED
@@ -392,6 +392,14 @@ yargs
392
392
  default: true,
393
393
  description: 'Auto-run `wyvrnpm install` when the toolchain is stale. Disable with --no-auto-install.',
394
394
  })
395
+ .option('configure-only', {
396
+ type: 'boolean',
397
+ default: false,
398
+ description:
399
+ 'Run only the CMake configure step (generate the .sln / build.ninja ' +
400
+ 'project files) and stop before compiling. Still auto-installs a stale ' +
401
+ 'toolchain and applies the MSVC env + Visual Studio -A arch pin.',
402
+ })
395
403
  .option('source', {
396
404
  alias: 's',
397
405
  type: 'string',
@@ -433,6 +441,7 @@ yargs
433
441
  installPrefix: argv['install-prefix'],
434
442
  allConfigs: argv['all-configs'],
435
443
  buildDir: argv['build-dir'],
444
+ configureOnly: argv['configure-only'],
436
445
  }),
437
446
  )
438
447
 
Binary file
@@ -161,6 +161,128 @@ else()
161
161
  message(STATUS "Unknown architecture")
162
162
  endif()
163
163
 
164
+ # ── CPU architecture detection ────────────────────────────────────────────────
165
+ # A parallel tier to WYVRN_PLATFORM_* above. CPU family is orthogonal to OS
166
+ # family (an ARM Mac and an x86 Mac are both DARWIN), so it is detected on its
167
+ # own axis rather than nested under any platform. Same idiom as the platform
168
+ # tier: default every leaf to FALSE, derive from the environment, then emit the
169
+ # survivors as compile definitions.
170
+ #
171
+ # WYVRN_CPU_X86_FAMILY – x86 / x86_64 (Intel/AMD)
172
+ # WYVRN_CPU_ARM_FAMILY – ARM / AArch64
173
+ #
174
+ # Derived vector-intrinsics selector — the SSE-vs-NEON switch a VectorRegister
175
+ # dispatch header keys off:
176
+ #
177
+ # WYVRN_ENABLE_VECTORINTRINSICS – SSE/AVX path available (x86 family)
178
+ # WYVRN_ENABLE_VECTORINTRINSICS_NEON – NEON path available (64-bit ARM)
179
+
180
+ set(WYVRN_CPU_X86_FAMILY FALSE)
181
+ set(WYVRN_CPU_ARM_FAMILY FALSE)
182
+ set(WYVRN_ENABLE_VECTORINTRINSICS FALSE)
183
+ set(WYVRN_ENABLE_VECTORINTRINSICS_NEON FALSE)
184
+
185
+ # CMAKE_SYSTEM_PROCESSOR is valid post-project(); its spelling varies by host
186
+ # (AMD64 on MSVC, x86_64 on Linux/Mac, ARM64 on Windows-on-ARM, aarch64 on
187
+ # Linux, arm64 on Apple). Lower-case before matching so one pattern covers all.
188
+ string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _wyvrn_cpu_lc)
189
+ if(_wyvrn_cpu_lc MATCHES "^(x86_64|amd64|x64|em64t|i[3-6]86|x86)$")
190
+ set(WYVRN_CPU_X86_FAMILY TRUE)
191
+ elseif(_wyvrn_cpu_lc MATCHES "^(arm64|aarch64|armv8|armv7|arm)")
192
+ set(WYVRN_CPU_ARM_FAMILY TRUE)
193
+ endif()
194
+
195
+ if(WYVRN_CPU_X86_FAMILY)
196
+ set(WYVRN_ENABLE_VECTORINTRINSICS TRUE)
197
+ elseif(WYVRN_CPU_ARM_FAMILY AND WYVRN_64)
198
+ # 32-bit ARM makes NEON optional; only the 64-bit baseline guarantees it.
199
+ set(WYVRN_ENABLE_VECTORINTRINSICS_NEON TRUE)
200
+ endif()
201
+
202
+ # ── x86 minimum CPU architecture opt-in (analogue of UBT's -MinCpuArchX64) ────
203
+ # Raises the compile-time SIMD floor for the WHOLE build. Off by default (None)
204
+ # so produced binaries run on the broadest x86_64 baseline (SSE2). Selecting a
205
+ # level does two coupled things that MUST stay in lockstep:
206
+ # (a) emits the matching /arch (MSVC) or -m flags (Clang/GCC) so every
207
+ # translation unit is actually codegen'd for that ISA, and
208
+ # (b) raises WYVRN_ALWAYS_HAS_AVX[2|512]/_FMA3 so headers may assume the ISA
209
+ # unconditionally, with no runtime CPUID guard.
210
+ # Applied globally (add_compile_options / add_compile_definitions) because the
211
+ # macro and the codegen flag must agree across every TU — a header that emits an
212
+ # AVX intrinsic under WYVRN_ALWAYS_HAS_AVX must never reach a TU built without
213
+ # /arch:AVX. Runtime detection (GetCPUVendor / HasAVX2) is the separate,
214
+ # portable-dispatch mechanism and is unaffected by this floor.
215
+ # MINSPEC WARNING: a binary built with AVX2 will fault (#UD/SIGILL) on any CPU
216
+ # that lacks it. Raise this only when the deploy target's minimum spec
217
+ # guarantees the level.
218
+ set(WYVRN_MIN_CPU_ARCH_X64 "None" CACHE STRING
219
+ "Minimum x86_64 SIMD ISA the build may assume unconditionally (None|AVX|AVX2|AVX512)")
220
+ set_property(CACHE WYVRN_MIN_CPU_ARCH_X64 PROPERTY STRINGS None AVX AVX2 AVX512)
221
+
222
+ set(WYVRN_ALWAYS_HAS_AVX 0)
223
+ set(WYVRN_ALWAYS_HAS_AVX2 0)
224
+ set(WYVRN_ALWAYS_HAS_AVX512 0)
225
+ set(WYVRN_ALWAYS_HAS_FMA3 0)
226
+
227
+ if(WYVRN_CPU_X86_FAMILY AND NOT WYVRN_MIN_CPU_ARCH_X64 STREQUAL "None")
228
+ if(NOT WYVRN_MIN_CPU_ARCH_X64 MATCHES "^(AVX|AVX2|AVX512)$")
229
+ message(FATAL_ERROR "WYVRN_MIN_CPU_ARCH_X64 must be one of None|AVX|AVX2|AVX512 (got '${WYVRN_MIN_CPU_ARCH_X64}')")
230
+ endif()
231
+
232
+ set(_wyvrn_arch_flags)
233
+ if(MSVC)
234
+ # MSVC /arch is cumulative: /arch:AVX2 implies AVX, /arch:AVX512 implies AVX2.
235
+ list(APPEND _wyvrn_arch_flags /arch:${WYVRN_MIN_CPU_ARCH_X64})
236
+ else()
237
+ # Clang/GCC -m flags are not cumulative — name each level explicitly.
238
+ # FMA3 ships with Haswell-era AVX2, so -mfma rides along from AVX2 up.
239
+ if(WYVRN_MIN_CPU_ARCH_X64 STREQUAL "AVX")
240
+ list(APPEND _wyvrn_arch_flags -mavx)
241
+ elseif(WYVRN_MIN_CPU_ARCH_X64 STREQUAL "AVX2")
242
+ list(APPEND _wyvrn_arch_flags -mavx2 -mfma)
243
+ elseif(WYVRN_MIN_CPU_ARCH_X64 STREQUAL "AVX512")
244
+ list(APPEND _wyvrn_arch_flags -mavx512f -mavx2 -mfma)
245
+ endif()
246
+ endif()
247
+ add_compile_options(${_wyvrn_arch_flags})
248
+
249
+ # Raise the cumulative WYVRN_ALWAYS_HAS_* floor. FMA3 is guaranteed only from
250
+ # AVX2 up (both MSVC /arch:AVX2 and GCC/Clang -mfma).
251
+ set(WYVRN_ALWAYS_HAS_AVX 1)
252
+ if(WYVRN_MIN_CPU_ARCH_X64 STREQUAL "AVX2" OR WYVRN_MIN_CPU_ARCH_X64 STREQUAL "AVX512")
253
+ set(WYVRN_ALWAYS_HAS_AVX2 1)
254
+ set(WYVRN_ALWAYS_HAS_FMA3 1)
255
+ endif()
256
+ if(WYVRN_MIN_CPU_ARCH_X64 STREQUAL "AVX512")
257
+ set(WYVRN_ALWAYS_HAS_AVX512 1)
258
+ endif()
259
+ endif()
260
+
261
+ # -- Emit WYVRN_CPU_* + vector-intrinsics selector compile definitions --
262
+ foreach(_cpu X86_FAMILY ARM_FAMILY)
263
+ if(WYVRN_CPU_${_cpu})
264
+ add_compile_definitions(WYVRN_CPU_${_cpu}=1)
265
+ endif()
266
+ endforeach()
267
+ if(WYVRN_ENABLE_VECTORINTRINSICS)
268
+ add_compile_definitions(WYVRN_ENABLE_VECTORINTRINSICS=1)
269
+ endif()
270
+ if(WYVRN_ENABLE_VECTORINTRINSICS_NEON)
271
+ add_compile_definitions(WYVRN_ENABLE_VECTORINTRINSICS_NEON=1)
272
+ endif()
273
+
274
+ # The AVX floor is always emitted (0 or 1) so headers can `#if WYVRN_ALWAYS_HAS_AVX`
275
+ # without an #ifdef guard, mirroring UE's PLATFORM_ALWAYS_HAS_AVX.
276
+ add_compile_definitions(
277
+ WYVRN_ALWAYS_HAS_AVX=${WYVRN_ALWAYS_HAS_AVX}
278
+ WYVRN_ALWAYS_HAS_AVX2=${WYVRN_ALWAYS_HAS_AVX2}
279
+ WYVRN_ALWAYS_HAS_AVX512=${WYVRN_ALWAYS_HAS_AVX512}
280
+ WYVRN_ALWAYS_HAS_FMA3=${WYVRN_ALWAYS_HAS_FMA3}
281
+ )
282
+
283
+ message(STATUS "CPU family : X86=${WYVRN_CPU_X86_FAMILY} ARM=${WYVRN_CPU_ARM_FAMILY} (processor='${CMAKE_SYSTEM_PROCESSOR}')")
284
+ message(STATUS "CPU intrinsics : VECTORINTRINSICS=${WYVRN_ENABLE_VECTORINTRINSICS} NEON=${WYVRN_ENABLE_VECTORINTRINSICS_NEON} MIN_CPU_ARCH_X64=${WYVRN_MIN_CPU_ARCH_X64} (AVX=${WYVRN_ALWAYS_HAS_AVX} AVX2=${WYVRN_ALWAYS_HAS_AVX2} AVX512=${WYVRN_ALWAYS_HAS_AVX512} FMA3=${WYVRN_ALWAYS_HAS_FMA3})")
285
+
164
286
  # Put compiled artefacts inside the CMake binary dir so `wyvrnpm clean --all`
165
287
  # (which sweeps `<binaryDirRoot>/wyvrn-*/`) catches them. Pre-2.17 wyvrnpm
166
288
  # put these under `${CMAKE_SOURCE_DIR}/output/<bin|lib>${WYVRN_ARCH_SUFFIX}/`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wyvrnpm",
3
- "version": "2.21.2",
3
+ "version": "2.22.0",
4
4
  "description": "A simple, static-hosting-compatible C++ package manager",
5
5
  "keywords": [
6
6
  "c++",
@@ -475,6 +475,16 @@ async function build(argv) {
475
475
  log.info(`cmake ${configureArgs.join(' ')}`);
476
476
  await runCmake(configureArgs, cmakeEnv);
477
477
 
478
+ // ── Configure-only short-circuit ───────────────────────────────────────────
479
+ // `--configure-only` stops here: the project files (.sln / build.ninja) are
480
+ // generated but nothing is compiled. Deliberately placed after configure so
481
+ // the caller still gets the auto-install, stale-toolchain, MSVC-env, and VS
482
+ // `-A` arch-pin handling that raw `cmake --preset` skips.
483
+ if (argv.configureOnly) {
484
+ log.success(`Configure complete: ${binaryDir} — project files generated (build skipped)`);
485
+ return;
486
+ }
487
+
478
488
  // ── Build (+ optional install) per config ─────────────────────────────────
479
489
  // Configure ran once above. Multi-config generators (VS, Xcode, Ninja
480
490
  // Multi-Config) produce every config from that one configure step; for