Buildroot Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [PATCH] core: allow host-cmake to be built with ccache
@ 2026-09-30 20:37 Thomas Devoogdt
  0 siblings, 0 replies; only message in thread
From: Thomas Devoogdt @ 2026-09-30 20:37 UTC (permalink / raw)
  To: buildroot; +Cc: Thomas Petazzoni, Thomas Devoogdt

host-cmake takes a long time to build, but it is never built with
ccache: host-ccache is a cmake package, so when no suitable cmake is
available on the build host, host-ccache depends on host-cmake, and
host-cmake cannot depend on host-ccache.

However, the packages in the host-ccache dependency chain (ccache,
hiredis, blake3) only need cmake 3.18, while BR2_HOST_CMAKE_AT_LEAST
may be much higher, e.g. 4.3 for mosquitto. So a cmake from the build
host is often suitable to build host-ccache, even if it is not
suitable for the other packages.

Thus, when BR2_CCACHE is enabled, look for a separate cmake of at
least 3.18, exposed as BR2_CMAKE_NOCCACHE and
BR2_CMAKE_NOCCACHE_HOST_DEPENDENCY, and use it in pkg-cmake.mk for
all packages that set <PKG>_ADD_CCACHE_DEPENDENCY = NO, as those can
by definition not depend on a host-cmake built with ccache.

When that cmake is found on the build host, host-cmake depends on
host-ccache, and uses it for both the bootstrap (--enable-ccache) and
the main build (CMAKE_<LANG>_COMPILER_LAUNCHER). Otherwise, host-cmake
is built without ccache, as before.

Additionally, when BR2_PACKAGE_HOST_CMAKE is enabled, use host-cmake
for all cmake packages instead of the one from the build host.

Tested with a system cmake 3.28, and without one (by passing
BR2_CMAKE_CANDIDATES=nonexistent):
 - system cmake, host-cmake enabled: host-ccache is built with the
   system cmake and host-cmake with ccache; a rebuild of host-cmake
   with a warm cache takes 2m06s, with 1502/1736 cache hits;
 - no system cmake: host-cmake is built without ccache and is used to
   build host-ccache, no circular dependency;
 - system cmake too old for BR2_HOST_CMAKE_AT_LEAST (mosquitto
   enabled): host-ccache still uses the system cmake.

Signed-off-by: Thomas Devoogdt <thomas@devoogdt.com>
---
 docs/manual/ccache-support.adoc          |  5 +++++
 package/cmake/Config.in.host             |  3 +++
 package/cmake/cmake.mk                   | 15 ++++++++++++---
 package/pkg-cmake.mk                     | 21 ++++++++++++++-------
 support/dependencies/check-host-cmake.mk | 24 ++++++++++++++++++++++++
 5 files changed, 58 insertions(+), 10 deletions(-)

diff --git a/docs/manual/ccache-support.adoc b/docs/manual/ccache-support.adoc
index 86cb4a150dc..45af6dfd41d 100644
--- a/docs/manual/ccache-support.adoc
+++ b/docs/manual/ccache-support.adoc
@@ -15,6 +15,11 @@ speed up the build process.
 +Enable compiler cache+ in +Build options+. This will automatically
 build +ccache+ and use it for every host and target compilation.
 
+Since +ccache+ is built with CMake, a suitable CMake from the build
+machine (at least 3.18) is used for +ccache+ and its dependencies. This
+allows +host-cmake+, if needed, to be built with +ccache+ as well.
+Without such a CMake, +host-cmake+ is built first, without +ccache+.
+
 The cache is located in the directory defined by the +BR2_CCACHE_DIR+
 configuration option, which defaults to
 +$HOME/.buildroot-ccache+. This default location is outside of
diff --git a/package/cmake/Config.in.host b/package/cmake/Config.in.host
index b8221a7d222..f4dea749e12 100644
--- a/package/cmake/Config.in.host
+++ b/package/cmake/Config.in.host
@@ -8,6 +8,9 @@ config BR2_PACKAGE_HOST_CMAKE
 	  generate native makefiles and workspaces that can be used in
 	  the compiler environment of your choice.
 
+	  When enabled, this cmake is used to build all CMake
+	  packages, instead of a cmake from the build machine.
+
 	  http://www.cmake.org/
 
 # The minimum system cmake version we expect if 3.18 as provided by
diff --git a/package/cmake/cmake.mk b/package/cmake/cmake.mk
index 098f6e91582..632fa2bf781 100644
--- a/package/cmake/cmake.mk
+++ b/package/cmake/cmake.mk
@@ -12,8 +12,15 @@ CMAKE_LICENSE = BSD-3-Clause
 CMAKE_LICENSE_FILES = LICENSE.rst
 CMAKE_CPE_ID_VALID = YES
 
-# The package is a dependency to ccache so ccache cannot be a dependency
+# host-cmake can only use ccache when host-ccache is built with a system cmake
+ifeq ($(BR2_CCACHE):$(BR2_CMAKE_NOCCACHE_HOST_DEPENDENCY),y:)
+HOST_CMAKE_BOOTSTRAP_OPTS = --enable-ccache
+HOST_CMAKE_CCACHE_OPTS = \
+	-DCMAKE_C_COMPILER_LAUNCHER=$(CCACHE) \
+	-DCMAKE_CXX_COMPILER_LAUNCHER=$(CCACHE)
+else
 HOST_CMAKE_ADD_CCACHE_DEPENDENCY = NO
+endif
 
 # CMake is a particular package:
 # * CMake can be built using the generic infrastructure or the cmake one.
@@ -43,7 +50,7 @@ CMAKE_CONF_OPTS = \
 HOST_CMAKE_CFLAGS = $(shell echo $(HOST_CFLAGS) | sed -r "s%$(HOST_CPPFLAGS)%%")
 HOST_CMAKE_CXXFLAGS = $(shell echo $(HOST_CXXFLAGS) | sed -r "s%$(HOST_CPPFLAGS)%%")
 
-# We may be a ccache dependency, so we can't use ccache
+# ccache is enabled via bootstrap options, not via CC/CXX
 HOST_CMAKE_CONFIGURE_OPTS = \
 	$(HOST_CONFIGURE_OPTS) \
 	CC="$(HOSTCC_NOCCACHE)" \
@@ -55,7 +62,9 @@ define HOST_CMAKE_CONFIGURE_CMDS
 		$(HOST_CMAKE_CONFIGURE_OPTS) \
 		CFLAGS="$(HOST_CMAKE_CFLAGS)" \
 		./bootstrap --prefix=$(HOST_DIR) \
-			--parallel=$(PARALLEL_JOBS) -- \
+			--parallel=$(PARALLEL_JOBS) \
+			$(HOST_CMAKE_BOOTSTRAP_OPTS) -- \
+			$(HOST_CMAKE_CCACHE_OPTS) \
 			-DCMAKE_C_FLAGS="$(HOST_CMAKE_CFLAGS)" \
 			-DCMAKE_CXX_FLAGS="$(HOST_CMAKE_CXXFLAGS)" \
 			-DCMAKE_EXE_LINKER_FLAGS="$(HOST_LDFLAGS)" \
diff --git a/package/pkg-cmake.mk b/package/pkg-cmake.mk
index f572bdebb3d..d205f6c5dcc 100644
--- a/package/pkg-cmake.mk
+++ b/package/pkg-cmake.mk
@@ -103,7 +103,7 @@ define $(2)_CONFIGURE_CMDS
 	rm -f CMakeCache.txt && \
 	PATH=$$(BR_PATH) \
 	$$(if $$(BR2_INSTALL_LIBSTDCPP),,CXX=/bin/false) \
-	$$($$(PKG)_CONF_ENV) $$(BR2_CMAKE) $$($$(PKG)_SRCDIR) \
+	$$($$(PKG)_CONF_ENV) $$($$(PKG)_CMAKE) $$($$(PKG)_SRCDIR) \
 		-G$$($$(PKG)_GENERATOR) \
 		-DCMAKE_MAKE_PROGRAM="$$($$(PKG)_GENERATOR_PROGRAM)" \
 		-DCMAKE_TOOLCHAIN_FILE="$$(HOST_DIR)/share/buildroot/toolchainfile.cmake" \
@@ -135,7 +135,7 @@ define $(2)_CONFIGURE_CMDS
 	PKG_CONFIG_LIBDIR="$$(HOST_DIR)/lib/pkgconfig:$$(HOST_DIR)/share/pkgconfig" \
 	PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 \
 	PKG_CONFIG_ALLOW_SYSTEM_LIBS=1 \
-	$$($$(PKG)_CONF_ENV) $$(BR2_CMAKE) $$($$(PKG)_SRCDIR) \
+	$$($$(PKG)_CONF_ENV) $$($$(PKG)_CMAKE) $$($$(PKG)_SRCDIR) \
 		-G$$($$(PKG)_GENERATOR) \
 		-DCMAKE_MAKE_PROGRAM="$$($$(PKG)_GENERATOR_PROGRAM)" \
 		-DCMAKE_INSTALL_SO_NO_EXE=0 \
@@ -174,7 +174,14 @@ endif
 # primitives to find {C,LD}FLAGS, add it to the dependency list.
 $(2)_DEPENDENCIES += host-pkgconf
 
+# Packages that host-ccache depends on can't use a host-cmake built with ccache
+ifeq ($$($(2)_ADD_CCACHE_DEPENDENCY),NO)
+$(2)_CMAKE = $$(BR2_CMAKE_NOCCACHE)
+$(2)_DEPENDENCIES += $(BR2_CMAKE_NOCCACHE_HOST_DEPENDENCY)
+else
+$(2)_CMAKE = $$(BR2_CMAKE)
 $(2)_DEPENDENCIES += $(BR2_CMAKE_HOST_DEPENDENCY)
+endif
 
 #
 # Build step. Only define it if not already defined by the package .mk
@@ -183,11 +190,11 @@ $(2)_DEPENDENCIES += $(BR2_CMAKE_HOST_DEPENDENCY)
 ifndef $(2)_BUILD_CMDS
 ifeq ($(4),target)
 define $(2)_BUILD_CMDS
-	$$(TARGET_MAKE_ENV) $$($$(PKG)_BUILD_ENV) $$(BR2_CMAKE) --build $$($$(PKG)_BUILDDIR) -j$(PARALLEL_JOBS) $$($$(PKG)_BUILD_OPTS)
+	$$(TARGET_MAKE_ENV) $$($$(PKG)_BUILD_ENV) $$($$(PKG)_CMAKE) --build $$($$(PKG)_BUILDDIR) -j$(PARALLEL_JOBS) $$($$(PKG)_BUILD_OPTS)
 endef
 else
 define $(2)_BUILD_CMDS
-	$$(HOST_MAKE_ENV) $$($$(PKG)_BUILD_ENV) $$(BR2_CMAKE) --build $$($$(PKG)_BUILDDIR) -j$(PARALLEL_JOBS) $$($$(PKG)_BUILD_OPTS)
+	$$(HOST_MAKE_ENV) $$($$(PKG)_BUILD_ENV) $$($$(PKG)_CMAKE) --build $$($$(PKG)_BUILDDIR) -j$(PARALLEL_JOBS) $$($$(PKG)_BUILD_OPTS)
 endef
 endif
 endif
@@ -198,7 +205,7 @@ endif
 #
 ifndef $(2)_INSTALL_CMDS
 define $(2)_INSTALL_CMDS
-	$$(HOST_MAKE_ENV) $$($$(PKG)_BUILD_ENV) $$(BR2_CMAKE) --install $$($$(PKG)_BUILDDIR) $$($$(PKG)_INSTALL_OPTS)
+	$$(HOST_MAKE_ENV) $$($$(PKG)_BUILD_ENV) $$($$(PKG)_CMAKE) --install $$($$(PKG)_BUILDDIR) $$($$(PKG)_INSTALL_OPTS)
 endef
 endif
 
@@ -208,7 +215,7 @@ endif
 #
 ifndef $(2)_INSTALL_STAGING_CMDS
 define $(2)_INSTALL_STAGING_CMDS
-	$$(TARGET_MAKE_ENV) $$($$(PKG)_BUILD_ENV) DESTDIR=$$(STAGING_DIR) $$(BR2_CMAKE) --install $$($$(PKG)_BUILDDIR) $$($$(PKG)_INSTALL_STAGING_OPTS)
+	$$(TARGET_MAKE_ENV) $$($$(PKG)_BUILD_ENV) DESTDIR=$$(STAGING_DIR) $$($$(PKG)_CMAKE) --install $$($$(PKG)_BUILDDIR) $$($$(PKG)_INSTALL_STAGING_OPTS)
 endef
 endif
 
@@ -218,7 +225,7 @@ endif
 #
 ifndef $(2)_INSTALL_TARGET_CMDS
 define $(2)_INSTALL_TARGET_CMDS
-	$$(TARGET_MAKE_ENV) $$($$(PKG)_BUILD_ENV) DESTDIR=$$(TARGET_DIR) $$(BR2_CMAKE) --install $$($$(PKG)_BUILDDIR) $$($$(PKG)_INSTALL_TARGET_OPTS)
+	$$(TARGET_MAKE_ENV) $$($$(PKG)_BUILD_ENV) DESTDIR=$$(TARGET_DIR) $$($$(PKG)_CMAKE) --install $$($$(PKG)_BUILDDIR) $$($$(PKG)_INSTALL_TARGET_OPTS)
 endef
 endif
 
diff --git a/support/dependencies/check-host-cmake.mk b/support/dependencies/check-host-cmake.mk
index e3676903198..52ea9271a56 100644
--- a/support/dependencies/check-host-cmake.mk
+++ b/support/dependencies/check-host-cmake.mk
@@ -8,9 +8,33 @@
 BR2_CMAKE_VERSION_MIN = $(BR2_HOST_CMAKE_AT_LEAST)
 
 BR2_CMAKE_CANDIDATES ?= cmake cmake3
+
+# When host-cmake is enabled, use it for all packages.
+ifeq ($(BR2_PACKAGE_HOST_CMAKE),y)
+BR2_CMAKE = $(HOST_DIR)/bin/cmake
+BR2_CMAKE_HOST_DEPENDENCY = host-cmake
+else
 BR2_CMAKE ?= $(call suitable-host-package,cmake,\
 	$(BR2_CMAKE_VERSION_MIN) $(BR2_CMAKE_CANDIDATES))
 ifeq ($(BR2_CMAKE),)
 BR2_CMAKE = $(HOST_DIR)/bin/cmake
 BR2_CMAKE_HOST_DEPENDENCY = host-cmake
 endif
+endif
+
+# cmake for packages that host-ccache depends on (<PKG>_ADD_CCACHE_DEPENDENCY
+# = NO). A suitable system cmake is preferred, so host-cmake can then itself
+# be built with ccache. The minimum is the one required by ccache.
+BR2_CMAKE_NOCCACHE_VERSION_MIN = 3.18
+
+ifeq ($(BR2_CCACHE),y)
+BR2_CMAKE_NOCCACHE ?= $(call suitable-host-package,cmake,\
+	$(BR2_CMAKE_NOCCACHE_VERSION_MIN) $(BR2_CMAKE_CANDIDATES))
+ifeq ($(BR2_CMAKE_NOCCACHE),)
+BR2_CMAKE_NOCCACHE = $(HOST_DIR)/bin/cmake
+BR2_CMAKE_NOCCACHE_HOST_DEPENDENCY = host-cmake
+endif
+else
+BR2_CMAKE_NOCCACHE = $(BR2_CMAKE)
+BR2_CMAKE_NOCCACHE_HOST_DEPENDENCY = $(BR2_CMAKE_HOST_DEPENDENCY)
+endif
-- 
2.43.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2026-09-30 20:37 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-30 20:37 [Buildroot] [PATCH] core: allow host-cmake to be built with ccache Thomas Devoogdt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox