Skip to content

manifest: per-glob flags in [target.'cfg(os)'.build] (parity with descriptor mcpp.<os> flags/#253) — blocks vendored-opencv windows leg #258

Description

@Sunrisepeak

Summary

Feature request: support per-glob flags inside conditional target sections[target.'cfg(<os>)'.build] (and [target.<triple>.build]) should accept the same flags = [{ glob, cflags, cxxflags, asmflags, defines }] array that [build] accepts. Today the conditional build section parses only cflags/cxxflags/ldflags/sources (src/manifest/toml.cppm:976-987), and [features.<n>.flags] is likewise global-only; the per-OS flag semantics that #253 added exist only in the xpkg descriptor grammar (mcpp.<os>.features, mcpp.<os>.flags).

This is now the single blocker for the opencv-m single-repo windows leg (Sunrisepeak/opencv-m feat/vendor-single-repo — the vendored OpenCV build that retires compat.opencv).

Why hoisting/global tricks cannot cover windows

The three frozen per-OS snapshots need different per-glob defines on the same TU paths:

  • linux vs macos deltas are pure per-OS additions with group-unique names (PNG_INTEL_SSE_OPT vs PNG_ARM_NEON_OPT, NEON_INTRINSICS, HAVE_CAMV4L2, …) — we hoisted those to per-OS global cflags and shipped the macos leg that way. Workable, but already a hack: it relies on grep-verifying that each define name is only read by its own code group.

  • windows needs both additions and REMOVALS on shared globs, e.g.:

    • **/3rdparty/zlib/**: linux/mac say HAVE_UNISTD_H=1; windows must NOT define it (clang-MSVC has no unistd.h) and adds NO_FSEEKO
    • third_party/.../core/src/alloc.cpp: HAVE_MEMALIGN/HAVE_POSIX_MEMALIGN (unix) vs HAVE_WIN32_ALIGNED_MALLOC=1 (win)
    • **/modules/videoio/**: HAVE_CAMV4L2/HAVE_FFMPEG_LIBAVDEVICE (linux) absent on windows
    • every group: WIN32 _CRT_SECURE_NO_DEPRECATE _CRT_NONSTDC_NO_DEPRECATE _SCL_SECURE_NO_WARNINGS _VARIADIC_MAX=10 _WIN32_WINNT=0x0601 _WINDOWS added

    A removal cannot be expressed by any global-flag overlay: [[build.flags]] is unconditional, so the unix -DHAVE_UNISTD_H=1 from the union table reaches windows TUs; -U counter-entries would need to be windows-only — same gap, recursed.

The only in-grammar workaround is resurrecting a per-OS tu-stub indirection layer (per-OS wrapper TUs whose paths are OS-unique so globs can key on them) for every conflicting group — the pre-0.0.97 #233-era machinery this project was happy to delete.

Proposed grammar

[target.'cfg(windows)'.build]
cflags = ["-DWIN32", "-D_WIN32_WINNT=0x0601"]          # exists today
flags  = [                                              # NEW: same GlobFlags shape as [build].flags
  { glob = "third_party/opencv/3rdparty/zlib/**", defines = ["NO_FSEEKO"] },
  { glob = "third_party/opencv/modules/core/src/alloc.cpp", defines = ["HAVE_WIN32_ALIGNED_MALLOC=1"] },
]

Merge semantics: append the matching conditional entries AFTER [build].flags in the ordered vector (same "last flag wins" rule) — that also gives -U/re--D override power over the unconditional table, which covers the removal case. Same for [target.<sel>.'features'.…] or at least [target.<sel>.build.flags] reachable from features via the existing feature-flag funnel.

Symmetry argument: the descriptor grammar already has exactly this (per-OS flags inside mcpp.<os>, #253); manifest-built packages (single-repo/vendored libraries, workspace members, path deps) are second-class without it. Dep builds already run the conditional merge through the single #229 funnel (merge_conditional_sources_flags), so the plumbing point is well-defined.

Context / evidence

  • opencv-m single-repo branch: linux (gcc16 + llvm 20/22 + x86_64-linux-musl static) and the macos wiring are green with the manifest-only approach; the parked windows tables live in the port fragments (windows-flags-PARKED.toml, windows-dnn-flags-PARKED.toml) ready to drop in the day this lands.
  • Conflict inventory was produced mechanically by tools/vendor/port_descriptor.py's cross-OS union check and is reproducible from mcpp-index pkgs/c/compat.opencv.lua @8692bb26.

Environment: mcpp 0.0.101.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions