diff --git a/crates/pixi-build-cmake/src/build_script.j2 b/crates/pixi-build-cmake/src/build_script.j2 index 7e8e650..c525072 100644 --- a/crates/pixi-build-cmake/src/build_script.j2 +++ b/crates/pixi-build-cmake/src/build_script.j2 @@ -1,5 +1,14 @@ ninja --version cmake --version +{% if has_sccache -%} +sccache --version + +{% if build_platform == "windows" -%} +set EXTRA_CMAKE_ARGS=-DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache +{% else -%} +export EXTRA_CMAKE_ARGS="-DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache" +{% endif -%} +{% endif -%} {# Windows #} {% if build_platform == "windows" -%} @@ -10,6 +19,7 @@ if not exist %SRC_DIR%\..\build\CMakeCache.txt ( -DCMAKE_INSTALL_PREFIX=%LIBRARY_PREFIX% ^ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ^ -DBUILD_SHARED_LIBS=ON ^ + %EXTRA_CMAKE_ARGS% ^ {{ extra_args | join(" ") }} ^ -B %SRC_DIR%\..\build ^ -S "{{ source_dir }}" @@ -27,6 +37,7 @@ if [ ! -f "$SRC_DIR/../build/CMakeCache.txt" ]; then -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ -DBUILD_SHARED_LIBS=ON \ + $EXTRA_CMAKE_ARGS \ {{ extra_args | join(" ") }} \ -B $SRC_DIR/../build \ -S "{{ source_dir }}" @@ -37,3 +48,7 @@ cmake --build $SRC_DIR/../build --target install {% if build_platform == "windows" -%} @if errorlevel 1 exit 1 {% endif %} + +{% if has_sccache -%} +sccache --show-stats +{% endif %} diff --git a/crates/pixi-build-cmake/src/build_script.rs b/crates/pixi-build-cmake/src/build_script.rs index 11146e7..1bbe9b5 100644 --- a/crates/pixi-build-cmake/src/build_script.rs +++ b/crates/pixi-build-cmake/src/build_script.rs @@ -6,6 +6,7 @@ pub struct BuildScriptContext { pub build_platform: BuildPlatform, pub source_dir: String, pub extra_args: Vec, + pub has_sccache: bool, } #[derive(Serialize)] diff --git a/crates/pixi-build-cmake/src/cmake.rs b/crates/pixi-build-cmake/src/cmake.rs index b882690..d99dd60 100644 --- a/crates/pixi-build-cmake/src/cmake.rs +++ b/crates/pixi-build-cmake/src/cmake.rs @@ -111,7 +111,14 @@ impl CMakeBuildBackend

{ let noarch_type = NoArchType::none(); - let requirements = self.requirements(host_platform, channel_config, variant)?; + let mut requirements = self.requirements(host_platform, channel_config, variant)?; + + let has_sccache = std::env::vars().any(|(key, _)| key.starts_with("SCCACHE")); + if has_sccache { + requirements + .build + .push(Dependency::Spec("sccache".parse().unwrap())); + } let build_platform = Platform::current(); let build_number = 0; @@ -124,6 +131,7 @@ impl CMakeBuildBackend

{ }, source_dir: self.manifest_root.display().to_string(), extra_args: self.config.extra_args.clone(), + has_sccache, } .render();