nixos-conf/todo.md

4.3 KiB

Todo

Sccache Stdenv Direction

  • Goal: move sccache to the same structural layer as ccacheStdenv, meaning between the Nix cc-wrapper and the real compiler, instead of wrapping the cc-wrapper script itself.
  • Reason: this should preserve normal compiler identity and wrapper semantics while still allowing cached compilations.
  • Constraint: prefer direct local-disk cache access for sandboxed builds and avoid depending on the external sccache client/server socket model.

Current Implementation State

  • Added a local patch to sccache so its GCC/Clang parser treats -cxx-isystem <dir> like -isystem <dir>.
  • Added sccache.links, modeled after nixpkgs ccache.links, to generate cc/c++/gcc/g++/clang/clang++ wrappers that call sccache with the real compiler path.
  • Added sccacheWrapper, modeled after nixpkgs ccacheWrapper.
  • Added sccacheStdenv, modeled after nixpkgs ccacheStdenv.
  • Reworked mkSccacheStdenv to delegate to sccacheWrapper instead of patching cc-wrapper scripts directly.
  • Kept direct-disk cache configuration through generated SCCACHE_CONF and SCCACHE_NO_DAEMON=1.
  • Adjusted the wrapper override helper so it can handle both normal cc-wrappers (cc = ...) and Intel SYCL wrappers (llvm = ...).
  • Forwarded Intel-expected outputs/attrs like .dev, .lib, and .rsrc through sccache.links.

Verified Findings

  • The previous direct insertion into cc-wrapper final exec did not break hello-world compilation.
  • That previous attempt was not cache-effective because sccache interpreted wrapper-emitted -cxx-isystem arguments as extra input files and returned multiple input files.
  • The exact problematic arguments were confirmed with a direct sccache clang ... probe using the wrapper-emitted argv.
  • The new ccache-style sccacheWrapper / sccacheStdenv path evaluates successfully.
  • intel-sycl.stdenv.cc now also evaluates successfully with the ccache-style sccache.links replacement in place.
  • The custom kernel helper now normalizes config-only kernelPatches entries to { patch = null; ... } before calling buildLinux, which fixes devenv shell -- build failing during kernel evaluation.
  • The kernel build does invoke sccache during live builds, but relying on the in-sandbox wrapper to create /var/cache/sccache/nix-builds/kernel made host-side observation ambiguous.
  • The host NixOS config should create and expose /var/cache/sccache/nix-builds/{packages,kernel} explicitly so sandboxed builds and host-side inspection see the same cache paths.
  • The kernel fentry failure was caused by tracing options being enabled indirectly. Forcing TRACING, FTRACE, FUNCTION_TRACER, FUNCTION_GRAPH_TRACER, DYNAMIC_FTRACE, FUNCTION_PROFILER, CONTEXT_SWITCH_TRACER, SCHED_TRACER, and STACK_TRACER to no got the build past the old Compiler does not support fentry? stop and into real kernel compilation.

Next Checks

  • electron-real-clang-base should stay store-pure: synthesize its output tree from symlinks only and never cp/rm against copied toolchain store content.
  • mkCmakeSccacheAttrs should not force raw compilers into CMake; the sccache.links wrappers should bypass CMake probe invocations while keeping the normal wrapper-selected compiler environment.
  • The probe bypass must inspect @responseFile arguments as well, because the cc-wrapper often hides CMakeFiles/CompilerId paths inside response files before the inner wrapped-sccache sees them.
  • For CMake packages, the practical fallback is to export SCCACHE_WRAPPED_COMPILER_PASSTHROUGH=1 for the whole configurePhase and unset it in postConfigure; caching matters in buildPhase, not in compiler-ID probes.
  • Apply the shared CMake helper to stalled subpackages too, not just top-level wrappers. oneapi-math-sycl-blas is one such case.
  • The same helper may also be needed on the outer package if the subpackage is fixed but the wrapper package then stalls at its own CMake configure.
  • Run a minimal hello-world derivation with the new sccacheStdenv and confirm repeated compiles produce cache hits.
  • If that works, switch current consumers to the ccache-style path and remove obsolete wrapper-patching logic.
  • After the host Nix daemon picks up the new sandbox path config, re-check kernel cache growth under /var/cache/sccache/nix-builds/kernel during a bounded kernel build.