build: improve ccache support
authorRoman Yeryomin <roman@advem.lv>
Fri, 12 Jun 2020 18:43:46 +0000 (21:43 +0300)
committerPetr Štetiar <ynezz@true.cz>
Sat, 11 Jul 2020 13:19:53 +0000 (15:19 +0200)
Set CCACHE_DIR to $(TOPDIR)/.ccache and CCACHE_BASEDIR to $(TOPDIR).
This allows to do clean and dirclean. Cache hit rate for test build
after dirclean is ~65%.
If CCACHE is enabled stats are printed out at the end of building process.
CCACHE_DIR config variable allows to override default, which could be useful
when sharing cache with many builds.
cacheclean make target allows to clean the cache.

Changes from v1:
- remove ccache directory using CCACHE_DIR variable
- remove ccache leftovers from sdk and toolchain make files
- introduce CONFIG_CCACHE_DIR variable
- introduce cacheclean make target

Signed-off-by: Roman Yeryomin <roman@advem.lv>
.gitignore
Makefile
config/Config-devel.in
include/host-build.mk
include/package.mk
include/toplevel.mk
rules.mk
target/sdk/Makefile
target/toolchain/Makefile

index 6549af83be8a28587f07fa23a0298e030d396171..b6bfe1a5254b727e112a74e5e520786082ac6d1a 100644 (file)
@@ -28,3 +28,4 @@ TAGS*~
 git-src
 .project
 .cproject
+.ccache
index 32c050bb486091387d4b7cef8d71d3239610c8bc..24f5955c906652e62880bf2c001de32d0c065219 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -62,6 +62,11 @@ dirclean: clean
        rm -rf $(TMP_DIR)
        $(MAKE) -C $(TOPDIR)/scripts/config clean
 
+cacheclean:
+ifneq ($(CONFIG_CCACHE),)
+       rm -rf $(if $(call qstrip,$(CONFIG_CCACHE_DIR)),$(call qstrip,$(CONFIG_CCACHE_DIR)),$(TOPDIR)/.ccache)
+endif
+
 ifndef DUMP_TARGET_DB
 $(BUILD_DIR)/.prepared: Makefile
        @mkdir -p $$(dirname $@)
@@ -119,6 +124,9 @@ world: prepare $(target/stamp-compile) $(package/stamp-compile) $(package/stamp-
        $(_SINGLE)$(SUBMAKE) -r package/index
        $(_SINGLE)$(SUBMAKE) -r json_overview_image_info
        $(_SINGLE)$(SUBMAKE) -r checksum
+ifneq ($(CONFIG_CCACHE),)
+       $(STAGING_DIR_HOST)/bin/ccache -s
+endif
 
 .PHONY: clean dirclean prereq prepare world package/symlinks package/symlinks-install package/symlinks-clean
 
index 70ec0ce9a7728f8c99517e9114c07928153a5e33..11741c70708d1da820ccce714e91eae8af6dd9d3 100644 (file)
@@ -69,6 +69,13 @@ menuconfig DEVEL
                help
                  Compiler cache; see https://ccache.samba.org/
 
+       config CCACHE_DIR
+               string "Set ccache directory" if CCACHE
+               default ""
+               help
+                 Store ccache in this directory.
+                 If not set, uses './.ccache'
+
        config EXTERNAL_KERNEL_TREE
                string "Use external kernel tree" if DEVEL
                default ""
index 9fc14241c64b69bd3a3a4ad39ca1c301b01139a4..7d84ab0f5fc443dedc103d80928a13a09f0f7199 100644 (file)
@@ -132,7 +132,9 @@ define Host/Exports/Default
   $(1) : export STAGING_PREFIX=$$(HOST_BUILD_PREFIX)
   $(1) : export PKG_CONFIG_PATH=$$(STAGING_DIR_HOST)/lib/pkgconfig:$$(HOST_BUILD_PREFIX)/lib/pkgconfig
   $(1) : export PKG_CONFIG_LIBDIR=$$(HOST_BUILD_PREFIX)/lib/pkgconfig
-  $(if $(CONFIG_CCACHE),$(1) : export CCACHE_DIR:=$(STAGING_DIR_HOST)/ccache)
+  $(if $(CONFIG_CCACHE),$(1) : export CCACHE_BASEDIR:=$(TOPDIR))
+  $(if $(CONFIG_CCACHE),$(1) : export CCACHE_DIR:=$(if $(call qstrip,$(CONFIG_CCACHE_DIR)),$(call qstrip,$(CONFIG_CCACHE_DIR)),$(TOPDIR)/.ccache))
+  $(if $(CONFIG_CCACHE),$(1) : export CCACHE_COMPILERCHECK:=%compiler% -dumpmachine; %compiler% -dumpversion)
   $(if $(HOST_CONFIG_SITE),$(1) : export CONFIG_SITE:=$(HOST_CONFIG_SITE))
   $(if $(IS_PACKAGE_BUILD),$(1) : export PATH=$$(TARGET_PATH_PKG))
 endef
index 057569274251805b58a08314b2a5478e31ffd4f1..a93d6b78f3261f27b72d940dda52ef6b16ca5653 100644 (file)
@@ -173,7 +173,9 @@ define Build/Exports/Default
   $(1) : export CONFIG_SITE:=$$(CONFIG_SITE)
   $(1) : export PKG_CONFIG_PATH:=$$(PKG_CONFIG_PATH)
   $(1) : export PKG_CONFIG_LIBDIR:=$$(PKG_CONFIG_PATH)
-  $(if $(CONFIG_CCACHE),$(1) : export CCACHE_DIR:=$(STAGING_DIR)/ccache)
+  $(if $(CONFIG_CCACHE),$(1) : export CCACHE_BASEDIR:=$(TOPDIR))
+  $(if $(CONFIG_CCACHE),$(1) : export CCACHE_DIR:=$(if $(call qstrip,$(CONFIG_CCACHE_DIR)),$(call qstrip,$(CONFIG_CCACHE_DIR)),$(TOPDIR)/.ccache))
+  $(if $(CONFIG_CCACHE),$(1) : export CCACHE_COMPILERCHECK:=%compiler% -dumpmachine; %compiler% -dumpversion)
 endef
 Build/Exports=$(Build/Exports/Default)
 
index 8564a4de73f6a82f7e04f615b8e71107ee821da7..0a64afe153c002210cc812aa0db8de7953cb4a38 100644 (file)
@@ -262,7 +262,7 @@ package/symlinks-clean:
 help:
        cat README
 
-distclean:
+distclean: cacheclean
        rm -rf bin build_dir .config* dl feeds key-build* logs package/feeds package/openwrt-packages staging_dir tmp
        @$(_SINGLE)$(SUBMAKE) -C scripts/config clean
 
index 66ddea288306e1a89f3b5588050a9469e94efe2a..e734b4a582939cb192724f931d2b1492eb3d85bb 100644 (file)
--- a/rules.mk
+++ b/rules.mk
@@ -298,6 +298,9 @@ ifneq ($(CONFIG_CCACHE),)
   TARGET_CXX:= ccache_cxx
   HOSTCC:= ccache $(HOSTCC)
   HOSTCXX:= ccache $(HOSTCXX)
+  export CCACHE_BASEDIR:=$(TOPDIR)
+  export CCACHE_DIR:=$(if $(call qstrip,$(CONFIG_CCACHE_DIR)),$(call qstrip,$(CONFIG_CCACHE_DIR)),$(TOPDIR)/.ccache)
+  export CCACHE_COMPILERCHECK:=%compiler% -dumpmachine; %compiler% -dumpversion
 endif
 
 TARGET_CONFIGURE_OPTS = \
index 6d818347204a3cce0aecaa5fda55ac0f97b83cc9..d3552b47eb894a1934f33efc390bf7794cba02c8 100644 (file)
@@ -20,7 +20,7 @@ STAGING_SUBDIR_HOST := staging_dir/host
 STAGING_SUBDIR_TARGET := staging_dir/$(TARGET_DIR_NAME)
 STAGING_SUBDIR_TOOLCHAIN := staging_dir/toolchain-$(ARCH)$(ARCH_SUFFIX)_gcc-$(GCCV)_$(LIBC)$(if $(CONFIG_arm),_eabi)
 
-EXCLUDE_DIRS:=*/ccache/* \
+EXCLUDE_DIRS:= \
        */stamp \
        */stampfiles \
        */man \
@@ -135,11 +135,7 @@ $(BIN_DIR)/$(SDK_NAME).tar.xz: clean
                $(TOPDIR)/package/kernel/linux \
                $(SDK_BUILD_DIR)/package/
 
-       -rm -rf \
-               $(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/ccache \
-               $(SDK_BUILD_DIR)/$(STAGING_SUBDIR_TARGET)/ccache \
-               $(SDK_BUILD_DIR)/$(STAGING_SUBDIR_TOOLCHAIN)/ccache \
-               $(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/.prereq-build
+       -rm -rf $(SDK_BUILD_DIR)/$(STAGING_SUBDIR_HOST)/.prereq-build
 
        -rm -f $(SDK_BUILD_DIR)/feeds.conf.default
        $(if $(BASE_FEED),echo "$(BASE_FEED)" > $(SDK_BUILD_DIR)/feeds.conf.default)
index ef2dc68a97e433917f8e9e8f6727e5b28d60c262..5002ff7835b22618fa802fbb8a0312f07de92e0f 100644 (file)
@@ -15,7 +15,7 @@ override MAKEFLAGS=
 
 TOOLCHAIN_NAME:=$(VERSION_DIST_SANITIZED)-toolchain-$(if $(CONFIG_VERSION_FILENAMES),$(VERSION_NUMBER)-)$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET))_gcc-$(GCCV)$(DIR_SUFFIX).$(HOST_OS)-$(HOST_ARCH)
 TOOLCHAIN_BUILD_DIR:=$(BUILD_DIR)/$(TOOLCHAIN_NAME)
-EXCLUDE_DIRS:=*/ccache \
+EXCLUDE_DIRS:= \
        */initial \
        */stamp \
        */stampfiles \