You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Replace Make with Bazel without regressing supported platforms, compiler/ISA behavior, release contents, ABI/public symbols, downstream use, performance, or developer workflows.
Objective is a cutover, not indefinite coexistence at 100% flag parity. Obsolete or irrelevant Make knobs are to be explicitly de-scoped with maintainer approval rather than reimplemented. Items below are ordered by whether they block the cutover.
Last audited: 2026-09-19 against main@67117cff, extended 2026-09-23. Evidence for the re-audit is in this comment; this description is the authoritative status list.
Legend: [x] done on main · [~] fix in review (PR open) · [ ] open · [-] de-scoped / not applicable
Status summary
Phase
Status
A — Linux x86-64 release-artifact parity
DONE for validated MKL configurations
B — Windows x86-64 release-package parity
DONE for validated ICX/DPC++ configurations
C — x86-64 build capability and compiler parity
IN PROGRESS — clang host build broken, no MSVC/ICX/clang lanes
D — Make platform and option parity
IN PROGRESS — non-x86 release layout is the gating item
E — Make deprecation readiness
NOT READY — downstream/ABI validation and DPC++ execution missing
Release packaging parity on Linux and Windows x86-64 is no longer the dominant risk. The remaining risks are: released-library loadability outside Bazel runfiles (in review), compiler-matrix coverage, DPC++ execution, architecture-parameterized release layout for the now-supported non-x86 targets, downstream/ABI validation against Bazel output, and non-hermetic host-tool discovery.
ISA and compiler behavior (all #3705 unless noted) — closes the former P0 "ISA compilation contract" block except for the verification item:
GCC/Clang ISA table: dev/bazel/flags.bzl emits -march=nocona / -march=haswell / -march=skylake-avx512, matching gnu.32e.mk:61-64. The "AVX2 and AVX-512 both map to -march=haswell" defect is gone.
Clang ISA option lists are no longer empty.
MSVC per-ISA /arch: _MSVC_CPU_FLAGS in dev/bazel/cc/compile.bzl:42-57, matching vc.mkl.32e.mk:47-50. No longer inherited from rules_cc auto-configuration.
Linux DPC++ archiver discovery: cc_toolchain_lnx.bzl:99-105 derives llvm-ar from dpcc_path and hard-fails when absent, instead of from the host compiler path.
[-] "Three-versus-four ISA variants / decide whether mc3/SSE4.2 is supported." Make builds three x86 variants — dev/make/function_definitions/32e.mk:25 is CPUs := sse2 avx2 avx512, and REQCPU is validated against exactly that list (makefile:77-78). mc3_OPT.* survives in the compiler-definition files but is unreferenced, i.e. dead in Make too. Bazel's _ISA_EXTENSIONS_X86 matches Make exactly. Nothing to decide.
[-] "2× static artifact / MKL bloat" blocker: resolved. bazel: align Linux MKL release parity #3662 measured complete Make and Bazel releases at ~405 MB and ~410 MB. Keep a size threshold, but the residual delta is not embedded MKL.
Linux pkg-config consumers work in both link modes (verified by compiling and runningbasic_statistics_dense_batch against a Bazel release via pkg-config --libs dal-dynamic-threading-host / dal-static-threading-host). The capability exists; only a CI lane is missing — see below.
Released Bazel libraries record no DT_NEEDED for oneTBB or libstdc++, and no oneTBB is staged, so a Bazel release cannot be loaded by any consumer outside a Bazel runfiles tree.cc.bzl stops requesting do_not_link_dynamic_dependencies on Linux; release.bzl stages tbb/latest/lib as Make does. Proof of sufficiency: with only this fix, scikit-learn-intelex builds unchanged against the Bazel release and passes 14 399 tests / 0 failures.
Level-4 comparator gains DT_NEEDED, undefined-symbol and staged-dependency comparison (new dev/release_tests/release_linkage.py), i.e. the gate that would have caught the above. Undefined-symbol comparison is report-only behind --strict-undefined, because Azure's Make side uses apt oneMKL 2026.1.0 while Bazel pins conda-forge mkl-static 2025.2.0.
red by design until #3799 merges — the 4 remaining differences are exactly #3799's defect
DPC++ cannot link against the pinned oneMKL: classic-before-SYCL library order under --as-needed, and the MKL CPU dispatch kernels are not symlinked, so any classic-MKL dispatch dies with Cannot load libmkl_avx512.so.2 or libmkl_def.so.2. Also fixes the same ordering in oneDALConfig.cmake.in.
Windows ARM64 Bazel support (Make PLAT=winarm parity), requested in this thread.
open
Blocks cutover
Compiler matrix
Linux clang host //:release does not build on main.dev/bazel/flags.bzl:150-151 adds -fno-strict-overflow for every non-icx compiler and flags.bzl:18 adds -fwrapv unconditionally; clang then fails under the build's own -Werror with argument unused during compilation: '-fno-strict-overflow'. Make passes neither flag to Linux clang (clang.32e.mk:55); they come from COMPILER.all.gnu (gnu.32e.mk:49). --copt=-Wno-unused-command-line-argument makes the whole clang release build clean, so this single flag is the only blocker. Undetected because there is no clang Bazel lane.
Linux clang host release lane
Linux ICX host release lane
Linux GCC host + ICPX DPC release lane that actually builds (today Azure does --nobuild for release-dpc, ci.yml:378)
Linux ICX + ICPX DPC release lane
Windows MSVC cl host release lane (both Windows Bazel lanes use icx; compare_windows_release.ps1:22-27 states the comparison is packaging-only, not compiler equivalence)
Linux GCC host release lane
Windows ICX host/DPC release lane
ISA verification
Verify ISA by compile options, not symbol names. dev/bazel/tests/isa_coverage_test.sh proves that E0/E4/E6-named symbols exist, not that the objects were compiled with distinct instruction sets. bazel aquery 'mnemonic("CppCompile", deps(//cpp/daal:core))' --cpu=all does show the same source compiled three times with the three distinct -march values, and --cpu=auto yields baseline + host ISA — so an aquery-based regression test is straightforward. The repo contains no aquery usage today.
Add small ISA probe targets that require the intended instructions.
Add runtime dispatch and representative performance comparison against Make on capable machines.
Produce a Bazel release tree for AArch64, RISC-V, Windows ARM64 and macOS. The existing non-x86 lanes build only //cpp/daal:core_dynamic and //cpp/oneapi/dal:dynamic and assert on readelf output. The RISC-V Bazel lane also uses GCC where Make uses Clang and executes nothing under QEMU.
macOS x86-64 Bazel toolchain/build with .dylib install-name/version-link handling.
Select dependencies by target platform or build them from source; remove x86-specific defaults where inappropriate.
Remove execution of hardcoded host g++ during target configuration.
The pkg-config generator is duplicated and the Bazel copy is x86-only. Make preprocesses deploy/pkg-config/pkg-config.cpp, which selects lib/intel64 / lib/arm / lib/riscv64 from target macros; dev/bazel/scripts.bzl:185,239 hardcode lib/intel64. Byte-identical on x86 today (verified by re-running the Make recipe and diffing both .pc files); diverges the moment a non-x86 release tree exists.
DPC++ execution
Run a packaged SYCL CPU-device example from the standalone release tree on every relevant PR. Bazel currently runs only --config=host tests (ci.yml:678); examples/oneapi/dpc/BUILD exists but no CI command references it.
Run Windows packaged DPC++ examples/tests, not only build/link plus host examples.
GPU nightly execution where hardware is available.
AOT validation, if AOT is part of the supported contract.
Exercise the repo's own pinned oneMKL SYCL in a real DPC link. The GHA nightly builds release-dpc only after source /opt/intel/oneapi/setvars.sh, which sets MKLROOT and repoints @mkl at system oneAPI; Azure only does --nobuild. The pinned package is therefore never link-tested (this is how bazel: fix DPC++ linking against oneMKL (order and CPU dispatch kernels) #3801's two defects survived).
Check packaged runtime dependencies for SYCL, MKL SYCL and oneDPL. A Bazel release ships no DPC pkg-config file (BUILD:42-58 emits only host .pc files; deploy/pkg-config/pkg-config.cpp has no dpc/sycl handling) and no oneMKL SYCL runtime, so a DPC consumer must supply a version-matched oneMKL itself.
Compare representative DPC++ runtime performance against Make.
Downstream and ABI validation
Build a daal4py/scikit-learn-intelex smoke consumer against the Bazel release. Today abi_check.sh and both sklearnex lanes consume Make artifacts exclusively; no Bazel-produced library is ABI-checked or exercised downstream.
Cover static/dynamic and host/DPC consumer variants; add a Linux pkg-config consumer lane (the capability is verified, the lane is missing).
Maintain an explicit public ABI baseline.
Review and document every ignored symbol prefix in the level-4 comparator. It currently drops all-uppercase symbols (^[A-Z][A-Z0-9_]+(_64)?$), all _ZNSt/_ZSt libstdc++ symbols, the whole _ZN4daal namespace for libonedal_dpc.so, and silently excludes any file whose suffix is in neither TEXT_SUFFIXES nor BINARY_SUFFIXES from the level-3 content comparison. Measured effect on x86/gcc: the ignore lists hide nothing (raw symbol sets are equal except three linker-synthesized __bss_start/_edata/_end), but the uppercase rule is far broader than its stated MKL/Fortran intent.
Keep separate forbidden-export tests for MKL/internal symbols. (mkl_linkage_test passes today.)
dev/bazel/tests/release_structure_test.sh is wired into no CI job. Only mkl_linkage_test, isa_coverage_test and parameters_layout_test.sh run (ci.yml:449,531,536). It is the only check covering the libonedal_core.so → .so.4 → .so.4.0 chain, which compare_release_trees.py:367-376 documents as its own blind spot. It passes 20/20 on a fresh release, so wiring it up is free.
.github/workflows/ci-aarch64.yml:341 (CI AArch64 status job) is not fork-guarded while both of its dependencies are, so on a fork it reports success with nothing having run.
Windows Bazel has no release_static example link mode; Make exercises both lib and dll.
CI time budgeting: the audited nightly passed the Windows Bazel release, level-4 comparison and CMake consumer, then exceeded the 180-minute job budget during later BaseKit compression.
Documentation
dev/bazel/README.md:213 documents --cpu="avx2,avx512", but dev/bazel/config/config.bzl:164 splits on whitespace, so the comma form is a hard analysis failure in _check_cpu_extensions. Space-separated lists and all/auto/modern work.
README.md:793 maps PLAT=<isa> to --cpu=<isa>; PLAT is platform selection and REQCPU is the CPU-list knob.
Remove stale text saying a Make-like release structure is missing; reconcile duplicate statements about whether //:release enables all ISAs and DPC++; document the CPU-list separator and distinguish cpu=auto from the //:release transition; remove Bazelisk version drift between documentation/Azure and the Windows helper.
Version numbers are hardcoded in dev/bazel/config/config.bzl:308-317 instead of read from makefile.ver — silent drift at the next version bump.
.nupkg production and documentation-package targets, if literal Make target parity requires them
Threshold gates for: clean Make vs Bazel build time, one-header and one-source incremental rebuild, warm disk-cache rebuild, release and static archive size, downstream link time, representative algorithm throughput/latency. Measured baseline on one 224-core box, gcc 13.3 both sides, -j96: clean 122.3 s Make vs 66.6 s Bazel; null 12.0 s vs 1.1 s (warm server); touch one .cpp 10.0 s vs 5.1 s; touch one .h with 14 users 11.5 s vs 5.5 s — Bazel wins every case while building strictly more (Make target is libraries, Bazel target is the staged release tree). Both build systems are bit-for-bit reproducible (985/985 identical sha256 across independent builds), so there is no reproducibility regression at cutover.
Hermeticity: compiler/link tools are discovered via PATH, system include directories and the shell environment are consumed, and Windows uses INCLUDE/LIB. Either package and register pinned compilers, sysroots and link tools, or narrow the goal and document which environment inputs are part of the build contract.
Make knobs with no Bazel equivalent, listed for completeness rather than as requirements: CHECK_DLL_SIG, BULLSEYEROOT/COVFILE, SYSROOT, WORKDIR, RELEASEDIR, BUILDREV, a named/validated OPTFLAG and LINKER, make help.
Candidates for explicit de-scoping
Maintainer decision required so that cutover is not blocked on them: Bullseye coverage, CHECK_DLL_SIG, WORKDIR/RELEASEDIR relocation, make help, and literal one-to-one target names (daal_c, onedal_c, _release_c, …) where a flag already expresses the same thing.
Note on test targets: Make has no test goals at all (makefile goals are only daal/oneapi/release/clean); all 325 *_test targets are Bazel-only. Unit-test coverage cannot regress at cutover — Bazel is a strict superset.
Definition of done
Close this tracker only when:
Every supported Make platform/compiler/backend combination is either supported and continuously tested by Bazel, or explicitly de-scoped with maintainer-approved rationale.
Release-tree, linkage and public-ABI comparisons are hard gates on every supported platform.
ISA compile options and runtime dispatch are validated, not inferred from symbol names.
At least one host and one DPC downstream consumer use the Bazel-produced release.
Package size, build time, downstream link time and representative runtime performance stay within agreed thresholds.
Every supported Make command-line capability has a documented Bazel equivalent, or a recorded de-scope decision.
Documentation matches actual build transitions/defaults and CI behavior.
Goal
Replace Make with Bazel without regressing supported platforms, compiler/ISA behavior, release contents, ABI/public symbols, downstream use, performance, or developer workflows.
Objective is a cutover, not indefinite coexistence at 100% flag parity. Obsolete or irrelevant Make knobs are to be explicitly de-scoped with maintainer approval rather than reimplemented. Items below are ordered by whether they block the cutover.
Last audited: 2026-09-19 against
main@67117cff, extended 2026-09-23. Evidence for the re-audit is in this comment; this description is the authoritative status list.Legend: [x] done on
main· [~] fix in review (PR open) · [ ] open · [-] de-scoped / not applicableStatus summary
Release packaging parity on Linux and Windows x86-64 is no longer the dominant risk. The remaining risks are: released-library loadability outside Bazel runfiles (in review), compiler-matrix coverage, DPC++ execution, architecture-parameterized release layout for the now-supported non-x86 targets, downstream/ABI validation against Bazel output, and non-hermetic host-tool discovery.
Done on
mainBuild system and release construction:
//:releasetransition to all configured x86 ISA variants and DPC++ artifacts by default: bazel: release target auto-compiles all ISAs and DPC++ by default #3537--copt/--linkopt: bazel: add debug/sanitizer configs and expand build documentation #3538ISA and compiler behavior (all #3705 unless noted) — closes the former P0 "ISA compilation contract" block except for the verification item:
dev/bazel/flags.bzlemits-march=nocona/-march=haswell/-march=skylake-avx512, matchinggnu.32e.mk:61-64. The "AVX2 and AVX-512 both map to-march=haswell" defect is gone./arch:_MSVC_CPU_FLAGSindev/bazel/cc/compile.bzl:42-57, matchingvc.mkl.32e.mk:47-50. No longer inherited from rules_cc auto-configuration.cc_toolchain_lnx.bzl:99-105derivesllvm-arfromdpcc_pathand hard-fails when absent, instead of from the host compiler path.Make options now available in Bazel:
STDALLOC=yes: bazel: add Linux standard allocator option #3714dsuffix): bazel: decouple Windows MSVC runtime from --compilation_mode, adddsuffix #3740Resolved as non-issues:
mc3/SSE4.2 is supported." Make builds three x86 variants —dev/make/function_definitions/32e.mk:25isCPUs := sse2 avx2 avx512, andREQCPUis validated against exactly that list (makefile:77-78).mc3_OPT.*survives in the compiler-definition files but is unreferenced, i.e. dead in Make too. Bazel's_ISA_EXTENSIONS_X86matches Make exactly. Nothing to decide.basic_statistics_dense_batchagainst a Bazel release viapkg-config --libs dal-dynamic-threading-host/dal-static-threading-host). The capability exists; only a CI lane is missing — see below.Fixes in review
DT_NEEDEDfor oneTBB orlibstdc++, and no oneTBB is staged, so a Bazel release cannot be loaded by any consumer outside a Bazel runfiles tree.cc.bzlstops requestingdo_not_link_dynamic_dependencieson Linux;release.bzlstagestbb/latest/libas Make does. Proof of sufficiency: with only this fix, scikit-learn-intelex builds unchanged against the Bazel release and passes 14 399 tests / 0 failures.DT_NEEDED, undefined-symbol and staged-dependency comparison (newdev/release_tests/release_linkage.py), i.e. the gate that would have caught the above. Undefined-symbol comparison is report-only behind--strict-undefined, because Azure's Make side uses apt oneMKL 2026.1.0 while Bazel pins conda-forgemkl-static2025.2.0.--as-needed, and the MKL CPU dispatch kernels are not symlinked, so any classic-MKL dispatch dies withCannot load libmkl_avx512.so.2 or libmkl_def.so.2. Also fixes the same ordering inoneDALConfig.cmake.in.PLAT=winarmparity), requested in this thread.Blocks cutover
Compiler matrix
//:releasedoes not build onmain.dev/bazel/flags.bzl:150-151adds-fno-strict-overflowfor every non-icx compiler andflags.bzl:18adds-fwrapvunconditionally; clang then fails under the build's own-Werrorwithargument unused during compilation: '-fno-strict-overflow'. Make passes neither flag to Linux clang (clang.32e.mk:55); they come fromCOMPILER.all.gnu(gnu.32e.mk:49).--copt=-Wno-unused-command-line-argumentmakes the whole clang release build clean, so this single flag is the only blocker. Undetected because there is no clang Bazel lane.--nobuildforrelease-dpc,ci.yml:378)clhost release lane (both Windows Bazel lanes use icx;compare_windows_release.ps1:22-27states the comparison is packaging-only, not compiler equivalence)ISA verification
dev/bazel/tests/isa_coverage_test.shproves thatE0/E4/E6-named symbols exist, not that the objects were compiled with distinct instruction sets.bazel aquery 'mnemonic("CppCompile", deps(//cpp/daal:core))' --cpu=alldoes show the same source compiled three times with the three distinct-marchvalues, and--cpu=autoyields baseline + host ISA — so anaquery-based regression test is straightforward. The repo contains noaqueryusage today.Architecture-dependent release layout
dev/bazel/release.bzl:301,302,620anddev/bazel/scripts.bzl:95,185,239hardcodelib/intel64/redist/intel64; Make parameterizes them (makefile:223,226). After Bazel: add AArch64/RISC-V64 cross-compile and OpenRNG backend support #3719 this is what blocks an AArch64/RISC-V release tree, and it blocks Windows ARM64 in build(bazel): support Windows ARM64 (Make PLAT=winarm parity) #3795.//cpp/daal:core_dynamicand//cpp/oneapi/dal:dynamicand assert onreadelfoutput. The RISC-V Bazel lane also uses GCC where Make uses Clang and executes nothing under QEMU..dylibinstall-name/version-link handling.g++during target configuration.deploy/pkg-config/pkg-config.cpp, which selectslib/intel64/lib/arm/lib/riscv64from target macros;dev/bazel/scripts.bzl:185,239hardcodelib/intel64. Byte-identical on x86 today (verified by re-running the Make recipe and diffing both.pcfiles); diverges the moment a non-x86 release tree exists.DPC++ execution
--config=hosttests (ci.yml:678);examples/oneapi/dpc/BUILDexists but no CI command references it.release-dpconly aftersource /opt/intel/oneapi/setvars.sh, which setsMKLROOTand repoints@mklat system oneAPI; Azure only does--nobuild. The pinned package is therefore never link-tested (this is how bazel: fix DPC++ linking against oneMKL (order and CPU dispatch kernels) #3801's two defects survived).BUILD:42-58emits only host.pcfiles;deploy/pkg-config/pkg-config.cpphas no dpc/sycl handling) and no oneMKL SYCL runtime, so a DPC consumer must supply a version-matched oneMKL itself.Downstream and ABI validation
abi_check.shand both sklearnex lanes consume Make artifacts exclusively; no Bazel-produced library is ABI-checked or exercised downstream.^[A-Z][A-Z0-9_]+(_64)?$), all_ZNSt/_ZStlibstdc++ symbols, the whole_ZN4daalnamespace forlibonedal_dpc.so, and silently excludes any file whose suffix is in neitherTEXT_SUFFIXESnorBINARY_SUFFIXESfrom the level-3 content comparison. Measured effect on x86/gcc: the ignore lists hide nothing (raw symbol sets are equal except three linker-synthesized__bss_start/_edata/_end), but the uppercase rule is far broader than its stated MKL/Fortran intent.mkl_linkage_testpasses today.)DT_NEEDED, RPATH/RUNPATH and static archive symbols separately — bazel: compare release library linkage, not just exported symbols #3800.CI wiring and correctness
dev/bazel/tests/release_structure_test.shis wired into no CI job. Onlymkl_linkage_test,isa_coverage_testandparameters_layout_test.shrun (ci.yml:449,531,536). It is the only check covering thelibonedal_core.so→.so.4→.so.4.0chain, whichcompare_release_trees.py:367-376documents as its own blind spot. It passes 20/20 on a fresh release, so wiring it up is free..github/workflows/ci-aarch64.yml:341(CI AArch64status job) is not fork-guarded while both of its dependencies are, so on a fork it reports success with nothing having run.release_staticexample link mode; Make exercises bothlibanddll.Documentation
dev/bazel/README.md:213documents--cpu="avx2,avx512", butdev/bazel/config/config.bzl:164splits on whitespace, so the comma form is a hard analysis failure in_check_cpu_extensions. Space-separated lists andall/auto/modernwork.README.md:793mapsPLAT=<isa>to--cpu=<isa>;PLATis platform selection andREQCPUis the CPU-list knob.//:releaseenables all ISAs and DPC++; document the CPU-list separator and distinguishcpu=autofrom the//:releasetransition; remove Bazelisk version drift between documentation/Azure and the Windows helper.dev/bazel/config/config.bzl:308-317instead of read frommakefile.ver— silent drift at the next version bump.Needed, lower urgency
REQPROFILE=yes/ ITT profiler integrationnone/TBB).nupkgproduction and documentation-package targets, if literal Make target parity requires them-j96: clean 122.3 s Make vs 66.6 s Bazel; null 12.0 s vs 1.1 s (warm server); touch one.cpp10.0 s vs 5.1 s; touch one.hwith 14 users 11.5 s vs 5.5 s — Bazel wins every case while building strictly more (Make target is libraries, Bazel target is the staged release tree). Both build systems are bit-for-bit reproducible (985/985 identical sha256 across independent builds), so there is no reproducibility regression at cutover.PATH, system include directories and the shell environment are consumed, and Windows usesINCLUDE/LIB. Either package and register pinned compilers, sysroots and link tools, or narrow the goal and document which environment inputs are part of the build contract.CHECK_DLL_SIG,BULLSEYEROOT/COVFILE,SYSROOT,WORKDIR,RELEASEDIR,BUILDREV, a named/validatedOPTFLAGandLINKER,make help.Candidates for explicit de-scoping
Maintainer decision required so that cutover is not blocked on them: Bullseye coverage,
CHECK_DLL_SIG,WORKDIR/RELEASEDIRrelocation,make help, and literal one-to-one target names (daal_c,onedal_c,_release_c, …) where a flag already expresses the same thing.Note on test targets: Make has no test goals at all (
makefilegoals are only daal/oneapi/release/clean); all 325*_testtargets are Bazel-only. Unit-test coverage cannot regress at cutover — Bazel is a strict superset.Definition of done
Close this tracker only when: