* [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support
@ 2010-12-03 19:16 Thomas Petazzoni
2010-12-03 19:16 ` [Buildroot] [PATCH 1/1] ccache: rework ccache management Thomas Petazzoni
2010-12-05 22:40 ` [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support Peter Korsgaard
0 siblings, 2 replies; 13+ messages in thread
From: Thomas Petazzoni @ 2010-12-03 19:16 UTC (permalink / raw)
To: buildroot
Hello,
[ Sorry, previous pull request had some mistakes. ]
Here is a patch that reworks the ccache support to make it work and
make it useful. It is now a "Build options" rather than a "Toolchain
option". I have tested it with both internal toolchain and external
toolchain. The principle is simply to build ccache as early as
possible in the build process, and then use it to cache host and
target compiled files.
The ccache cache is kept in ~/.buildroot-ccache/, so that it can be
shared between different builds.
I'm not using the symlink technique that was used in the past, but
rather prefixing all invocation to host gcc and target gcc with
"$(HOST_DIR)/usr/bin/ccache".
Here are some speed-up results :
*) First test on my laptop (dual core, 2 GB of RAM), using an ARM
external toolchain, building Busybox and a couple of packages.
-> ccache disabled: 5 minutes 29 seconds
-> ccache enabled, cold cache: 5 minutes 47 seconds
-> ccache enabled, hot cache: 3 minutes 40 seconds
The test with "cold cache" is done after removing
~/.buildroot-ccache/. The test with "hot cache" is done after
cleaning up the Buildroot build tree, but keeping the cache of the
previous build.
Here we see that ccache has a little cost, but that once the cache
is hot from previous builds, the build speed-up is interesting.
*) Second test on my build server (quad core i7, 12 GB of RAM), using
an ARM internal toolchain, building Busybox and an ext2
filesystem.
-> ccache disabled: 7 minutes 10 seconds
-> ccache enabled, cold cache: 5 minutes 43 seconds
-> ccache enabled, hot cache: 4 minutes 24 seconds
In this case we see that even when the cache is cold, ccache is
useful. It's probably because gcc gets recompiled twice during the
toolchain build process.
Regards,
Thomas
The following changes since commit 7e9c3a387820154fd1355f23c2669072c0c3a5f7:
Peter Korsgaard (1):
docs/news.html: add 2010.11 announce link
are available in the git repository at:
git://git.busybox.net/~tpetazzoni/git/buildroot for-2011.02/fix-ccache-support
Thomas Petazzoni (1):
ccache: rework ccache management
Config.in | 8 ++
Makefile | 27 +++-
docs/buildroot.html | 26 ++++
package/Config.in | 2 +-
package/Makefile.in | 10 ++-
package/ccache/Config.in | 5 +
package/ccache/ccache.mk | 32 +++++
toolchain/ccache/Config.in | 16 ---
toolchain/ccache/Config.in.2 | 13 --
toolchain/ccache/ccache.mk | 196 ------------------------------
toolchain/dependencies/dependencies.sh | 2 +-
toolchain/toolchain-buildroot.mk | 1 -
toolchain/toolchain-buildroot/Config.in | 1 -
toolchain/toolchain-crosstool-ng.mk | 1 -
toolchain/toolchain-external.mk | 1 -
toolchain/toolchain-external/ext-tool.mk | 2 +-
16 files changed, 103 insertions(+), 240 deletions(-)
create mode 100644 package/ccache/Config.in
create mode 100644 package/ccache/ccache.mk
delete mode 100644 toolchain/ccache/Config.in
delete mode 100644 toolchain/ccache/Config.in.2
delete mode 100644 toolchain/ccache/ccache.mk
Thanks,
--
Thomas Petazzoni
^ permalink raw reply [flat|nested] 13+ messages in thread* [Buildroot] [PATCH 1/1] ccache: rework ccache management 2010-12-03 19:16 [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support Thomas Petazzoni @ 2010-12-03 19:16 ` Thomas Petazzoni 2010-12-05 22:47 ` Peter Korsgaard 2010-12-05 22:40 ` [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support Peter Korsgaard 1 sibling, 1 reply; 13+ messages in thread From: Thomas Petazzoni @ 2010-12-03 19:16 UTC (permalink / raw) To: buildroot * ccache is now a normal package (both for the host and the target). * ccache option is now part of the "Build options" menu. It will automatically build ccache for the host before building anything, and will use it to cache builds for both host compilations and target compilations. * bump ccache to 3.1.3 Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> --- Config.in | 8 ++ Makefile | 27 +++- docs/buildroot.html | 26 ++++ package/Config.in | 2 +- package/Makefile.in | 10 ++- package/ccache/Config.in | 5 + package/ccache/ccache.mk | 32 +++++ toolchain/ccache/Config.in | 16 --- toolchain/ccache/Config.in.2 | 13 -- toolchain/ccache/ccache.mk | 196 ------------------------------ toolchain/dependencies/dependencies.sh | 2 +- toolchain/toolchain-buildroot.mk | 1 - toolchain/toolchain-buildroot/Config.in | 1 - toolchain/toolchain-crosstool-ng.mk | 1 - toolchain/toolchain-external.mk | 1 - toolchain/toolchain-external/ext-tool.mk | 2 +- 16 files changed, 103 insertions(+), 240 deletions(-) create mode 100644 package/ccache/Config.in create mode 100644 package/ccache/ccache.mk delete mode 100644 toolchain/ccache/Config.in delete mode 100644 toolchain/ccache/Config.in.2 delete mode 100644 toolchain/ccache/ccache.mk diff --git a/Config.in b/Config.in index a41cd3e..f6e894e 100644 --- a/Config.in +++ b/Config.in @@ -94,6 +94,14 @@ config BR2_JLEVEL help Number of jobs to run simultaneously +config BR2_CCACHE + bool "Enable compiler cache" + help + This option will enable the use of ccache, a compiler + cache. It will cache the result of previous builds to speed + up future builds. The cache is stored in + $HOME/.buildroot-ccache. + config BR2_DEPRECATED bool "Show packages that are deprecated or obsolete" help diff --git a/Makefile b/Makefile index 596470f..f811cbf 100644 --- a/Makefile +++ b/Makefile @@ -125,10 +125,13 @@ HOSTAS:=as endif ifndef HOSTCC HOSTCC:=gcc -else +HOSTCC:=$(shell which $(HOSTCC) || type -p $(HOSTCC) || echo gcc) +HOSTCC_NOCCACHE:=$(HOSTCC) endif ifndef HOSTCXX HOSTCXX:=g++ +HOSTCXX:=$(shell which $(HOSTCXX) || type -p $(HOSTCXX) || echo g++) +HOSTCXX_NOCCACHE:=$(HOSTCXX) endif ifndef HOSTFC HOSTFC:=gfortran @@ -147,15 +150,13 @@ HOSTNM:=nm endif HOSTAR:=$(shell which $(HOSTAR) || type -p $(HOSTAR) || echo ar) HOSTAS:=$(shell which $(HOSTAS) || type -p $(HOSTAS) || echo as) -HOSTCC:=$(shell which $(HOSTCC) || type -p $(HOSTCC) || echo gcc) -HOSTCXX:=$(shell which $(HOSTCXX) || type -p $(HOSTCXX) || echo g++) HOSTFC:=$(shell which $(HOSTLD) || type -p $(HOSTLD) || echo || which g77 || type -p g77 || echo gfortran) HOSTCPP:=$(shell which $(HOSTCPP) || type -p $(HOSTCPP) || echo cpp) HOSTLD:=$(shell which $(HOSTLD) || type -p $(HOSTLD) || echo ld) HOSTLN:=$(shell which $(HOSTLN) || type -p $(HOSTLN) || echo ln) HOSTNM:=$(shell which $(HOSTNM) || type -p $(HOSTNM) || echo nm) -export HOSTAR HOSTAS HOSTCC HOSTCXX HOSTFC HOSTLD +export HOSTAR HOSTAS HOSTCC HOSTCXX HOSTFC HOSTLD HOSTCC_NOCCACHE # bash prints the name of the directory on 'cd <dir>' if CDPATH is # set, so unset it here to not cause problems. Notice that the export @@ -231,10 +232,15 @@ PREFERRED_LIB_FLAGS:=--enable-static --enable-shared # along with the packages to build for the target. # ############################################################## + +ifeq ($(BR2_CCACHE),y) +BASE_TARGETS += host-ccache +endif + ifeq ($(BR2_TOOLCHAIN_BUILDROOT),y) -BASE_TARGETS:=uclibc-configured binutils cross_compiler uclibc-target-utils kernel-headers +BASE_TARGETS += uclibc-configured binutils cross_compiler uclibc-target-utils kernel-headers else -BASE_TARGETS:=uclibc +BASE_TARGETS += uclibc endif TARGETS:= @@ -276,6 +282,13 @@ TARGET_SKELETON=$(TOPDIR)/fs/skeleton BR2_DEPENDS_DIR=$(BUILD_DIR)/buildroot-config +ifeq ($(BR2_CCACHE),y) +CCACHE:=$(HOST_DIR)/usr/bin/ccache +CCACHE_CACHE_DIR=$(HOME)/.buildroot-ccache +HOSTCC := $(CCACHE) $(HOSTCC) +HOSTCXX := $(CCACHE) $(HOSTCXX) +endif + include toolchain/Makefile.in include package/Makefile.in @@ -480,7 +493,7 @@ export HOSTCFLAGS $(BUILD_DIR)/buildroot-config/%onf: mkdir -p $(@D)/lxdialog - $(MAKE) CC="$(HOSTCC)" obj=$(@D) -C $(CONFIG) -f Makefile.br $(@F) + $(MAKE) CC="$(HOSTCC_NOCCACHE)" HOSTCC="$(HOSTCC_NOCCACHE)" obj=$(@D) -C $(CONFIG) -f Makefile.br $(@F) COMMON_CONFIG_ENV = \ KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \ diff --git a/docs/buildroot.html b/docs/buildroot.html index f471962..6d7ee17 100644 --- a/docs/buildroot.html +++ b/docs/buildroot.html @@ -29,6 +29,7 @@ <li><a href="#buildroot_innards">How Buildroot works</a></li> <li><a href="#using_toolchain">Using the uClibc toolchain outside Buildroot</a></li> <li><a href="#external_toolchain">Use an external toolchain</a></li> + <li><a href="#ccache-support">Using <code>ccache</code> in Buildroot</li> <li><a href="#downloaded_packages">Location of downloaded packages</a></li> <li><a href="#add_packages">Adding new packages to Buildroot</a></li> <li><a href="#board_support">Creating your own board support</a></li> @@ -681,6 +682,31 @@ endif Build options -> Toolchain and header file location</code> options. This could be useful if the toolchain must be shared with other users.</p> + <h2 id="ccache-support">Using <code>ccache</code> in Buildroot</h2> + + <p><a href="http://ccache.samba.org">ccache</a> is a compiler + cache. It stores the object files resulting from each compilation + process, and is able to skip future compilation of the same source + file (with same compiler and same arguments) by using the + pre-existing object files. When doing almost identical builds from + scratch a number of times, it can divide the build time by a + factor of two.</p> + + <p><code>ccache</code> support is integrated in Buildroot. You + just have to enable <code>Enable compiler cache</code> + in <code>Build options</code>. This will automatically build + <code>ccache</code> and use it for every host and target + compilation.</p> + + <p>The cache is located + in <code>$HOME/.buildroot-ccache</code>. It is stored outside of + Buildroot output directory so that it can be shared by separate + Buildroot builds. If you want to get rid of the cache, simply + remove this directory.</p> + + <p>You can get statistics on the cache (its size, number of hits, + misses, etc.) by running <code>make ccache-stats</code>.</p> + <h2 id="downloaded_packages">Location of downloaded packages</h2> <p>It might be useful to know that the various tarballs that are diff --git a/package/Config.in b/package/Config.in index 03e580a..e551c0c 100644 --- a/package/Config.in +++ b/package/Config.in @@ -35,7 +35,7 @@ source "package/autoconf/Config.in" source "package/automake/Config.in" source "package/bison/Config.in" source "package/bsdiff/Config.in" -source "toolchain/ccache/Config.in.2" +source "package/ccache/Config.in" if BR2_PACKAGE_BUSYBOX_SHOW_OTHERS source "package/coreutils/Config.in" endif diff --git a/package/Makefile.in b/package/Makefile.in index 2ca8c31..d448a7e 100644 --- a/package/Makefile.in +++ b/package/Makefile.in @@ -142,6 +142,14 @@ TARGET_RANLIB = $(TARGET_CROSS)ranlib TARGET_OBJCOPY = $(TARGET_CROSS)objcopy TARGET_OBJDUMP = $(TARGET_CROSS)objdump +TARGET_CC_NOCCACHE := $(TARGET_CC) +TARGET_CXX_NOCCACHE := $(TARGET_CXX) + +ifeq ($(BR2_CCACHE),y) +TARGET_CC := $(CCACHE) $(TARGET_CC) +TARGET_CXX := $(CCACHE) $(TARGET_CXX) +endif + ifeq ($(BR2_STRIP_strip),y) STRIP_DISCARD_ALL:=--discard-all STRIP_STRIP_UNNEEDED:=--strip-unneeded @@ -175,7 +183,7 @@ HOST_LDFLAGS += -L$(HOST_DIR)/lib -L$(HOST_DIR)/usr/lib -Wl,-rpath,$(HOST_DIR)/ HOST_PATH=$(HOST_DIR)/bin:$(HOST_DIR)/usr/bin:$(PATH) # hostcc version as an integer - E.G. 4.3.2 => 432 -HOSTCC_VERSION:=$(shell $(HOSTCC) --version | \ +HOSTCC_VERSION:=$(shell $(HOSTCC_NOCCACHE) --version | \ sed -n 's/^.* \([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)[ ]*.*$$/\1\2\3/p') TARGET_CONFIGURE_OPTS=PATH=$(TARGET_PATH) \ diff --git a/package/ccache/Config.in b/package/ccache/Config.in new file mode 100644 index 0000000..a81e699 --- /dev/null +++ b/package/ccache/Config.in @@ -0,0 +1,5 @@ +config BR2_PACKAGE_CCACHE + bool "ccache" + help + Compiler Cache + http://samba.org/ftp/ccache \ No newline at end of file diff --git a/package/ccache/ccache.mk b/package/ccache/ccache.mk new file mode 100644 index 0000000..aed62d7 --- /dev/null +++ b/package/ccache/ccache.mk @@ -0,0 +1,32 @@ +############################################################# +# +# ccache +# +############################################################# + +CCACHE_VERSION = 3.1.3 +CCACHE_SITE = http://samba.org/ftp/ccache +CCACHE_SOURCE = ccache-$(CCACHE_VERSION).tar.bz2 + +# When ccache is being built for the host, ccache is not yet +# available, so we have to use the special C compiler without the +# cache. +HOST_CCACHE_CONF_ENV = \ + CC="$(HOSTCC_NOCCACHE)" + +# We directly hardcode the cache location into the binary, as it is +# much easier to handle than passing an environment variable. +define HOST_CCACHE_FIX_CCACHE_DIR + sed -i 's,getenv("CCACHE_DIR"),"$(CCACHE_CACHE_DIR)",' $(@D)/ccache.c +endef + +HOST_CCACHE_POST_CONFIGURE_HOOKS += \ + HOST_CCACHE_FIX_CCACHE_DIR + +$(eval $(call AUTOTARGETS,package,ccache)) +$(eval $(call AUTOTARGETS,package,ccache,host)) + +ifeq ($(BR2_CCACHE),y) +ccache-stats: host-ccache + $(Q)$(CCACHE) -s +endif \ No newline at end of file diff --git a/toolchain/ccache/Config.in b/toolchain/ccache/Config.in deleted file mode 100644 index 6f36650..0000000 --- a/toolchain/ccache/Config.in +++ /dev/null @@ -1,16 +0,0 @@ -# - -comment "Ccache Options" - -config BR2_CCACHE - bool "Enable ccache support?" - help - Enable ccache support? - -config BR2_CCACHE_DIR - string "ccache dir location?" - depends on BR2_CCACHE - default "$(TOOLCHAIN_DIR)/ccache-$(CCACHE_VER)/cache" - help - Where ccache should store cached files. - diff --git a/toolchain/ccache/Config.in.2 b/toolchain/ccache/Config.in.2 deleted file mode 100644 index 6a6c789..0000000 --- a/toolchain/ccache/Config.in.2 +++ /dev/null @@ -1,13 +0,0 @@ -# - -config BR2_PACKAGE_CCACHE_TARGET - bool "ccache" - depends on BR2_PACKAGE_GCC_TARGET - help - ccache is a compiler cache. It speeds up recompilation of - C/C++ code by caching previous compiles and detecting when - the same compile is being done again. - - http://ccache.samba.org - - diff --git a/toolchain/ccache/ccache.mk b/toolchain/ccache/ccache.mk deleted file mode 100644 index 8e414b2..0000000 --- a/toolchain/ccache/ccache.mk +++ /dev/null @@ -1,196 +0,0 @@ -############################################################# -# -# build ccache to make recompiles faster on the build system -# -############################################################# -CCACHE_VER:=2.4 -CCACHE_SITE:=http://samba.org/ftp/ccache -CCACHE_SOURCE:=ccache-$(CCACHE_VER).tar.gz -CCACHE_DIR1:=$(TOOLCHAIN_DIR)/ccache-$(CCACHE_VER) -CCACHE_DIR2:=$(BUILD_DIR)/ccache-$(CCACHE_VER) -CCACHE_CAT:=$(ZCAT) -CCACHE_BINARY:=ccache -CCACHE_TARGET_BINARY:=usr/bin/ccache - -$(DL_DIR)/$(CCACHE_SOURCE): - $(call DOWNLOAD,$(CCACHE_SITE),$(CCACHE_SOURCE)) - -$(CCACHE_DIR1)/.unpacked: $(DL_DIR)/$(CCACHE_SOURCE) - $(CCACHE_CAT) $(DL_DIR)/$(CCACHE_SOURCE) | tar -C $(TOOLCHAIN_DIR) $(TAR_OPTIONS) - - touch $@ - -$(CCACHE_DIR1)/.patched: $(CCACHE_DIR1)/.unpacked - # WARNING - this will break if the toolchain is moved. - # Should probably patch things to use a relative path. - $(SED) "s,getenv(\"CCACHE_PATH\"),\"$(STAGING_DIR)/usr/bin-ccache\",g" \ - $(CCACHE_DIR1)/execute.c - # WARNING - this will break if the toolchain build dir is deleted - # when using the default cache dir location. - $(SED) "s,getenv(\"CCACHE_DIR\"),\"$(BR2_CCACHE_DIR)\",g" \ - $(CCACHE_DIR1)/ccache.c - mkdir -p $(CCACHE_DIR1)/cache - $(CONFIG_UPDATE) $(@D) - touch $@ - -$(CCACHE_DIR1)/.configured: $(CCACHE_DIR1)/.patched - mkdir -p $(CCACHE_DIR1) - (cd $(CCACHE_DIR1); rm -rf config.cache; \ - CC="$(HOSTCC)" \ - $(CCACHE_DIR1)/configure $(QUIET) \ - --target=$(GNU_HOST_NAME) \ - --host=$(GNU_HOST_NAME) \ - --build=$(GNU_HOST_NAME) \ - --prefix=/usr \ - $(QUIET) \ - ) - touch $@ - -$(CCACHE_DIR1)/$(CCACHE_BINARY): $(CCACHE_DIR1)/.configured - $(MAKE) CC="$(HOSTCC)" -C $(CCACHE_DIR1) - -$(STAGING_DIR)/$(CCACHE_TARGET_BINARY): $(CCACHE_DIR1)/$(CCACHE_BINARY) - mkdir -p $(STAGING_DIR)/usr/bin - cp $(CCACHE_DIR1)/ccache $(STAGING_DIR)/usr/bin - # Keep the actual toolchain binaries in a directory at the same level. - # Otherwise, relative paths for include dirs break. - mkdir -p $(STAGING_DIR)/usr/bin-ccache - (cd $(STAGING_DIR)/usr/bin-ccache; \ - ln -fs $(REAL_GNU_TARGET_NAME)-gcc $(GNU_TARGET_NAME)-gcc; \ - ln -fs $(REAL_GNU_TARGET_NAME)-gcc $(GNU_TARGET_NAME)-cc; \ - ln -fs $(REAL_GNU_TARGET_NAME)-gcc $(REAL_GNU_TARGET_NAME)-cc; \ - ) - [ -f $(STAGING_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)-gcc ] && \ - mv $(STAGING_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)-gcc \ - $(STAGING_DIR)/usr/bin-ccache/ - (cd $(STAGING_DIR)/usr/bin; \ - ln -fs ccache $(GNU_TARGET_NAME)-cc; \ - ln -fs ccache $(GNU_TARGET_NAME)-gcc; \ - ln -fs ccache $(REAL_GNU_TARGET_NAME)-cc; \ - ln -fs ccache $(REAL_GNU_TARGET_NAME)-gcc; \ - ) -ifeq ($(BR2_INSTALL_LIBSTDCPP),y) - [ -f $(STAGING_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)-c++ ] && \ - mv $(STAGING_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)-c++ \ - $(STAGING_DIR)/usr/bin-ccache/ - [ -f $(STAGING_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)-g++ ] && \ - mv $(STAGING_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)-g++ \ - $(STAGING_DIR)/usr/bin-ccache/ - (cd $(STAGING_DIR)/usr/bin; \ - ln -fs ccache $(GNU_TARGET_NAME)-c++; \ - ln -fs ccache $(GNU_TARGET_NAME)-g++;\ - ln -fs ccache $(REAL_GNU_TARGET_NAME)-c++; \ - ln -fs ccache $(REAL_GNU_TARGET_NAME)-g++; \ - ) - (cd $(STAGING_DIR)/usr/bin-ccache; \ - ln -fs $(REAL_GNU_TARGET_NAME)-c++ $(GNU_TARGET_NAME)-c++; \ - ln -fs $(REAL_GNU_TARGET_NAME)-g++ $(GNU_TARGET_NAME)-g++; \ - ) -endif - -ccache: gcc $(STAGING_DIR)/$(CCACHE_TARGET_BINARY) - -ccache-clean: - rm -rf $(STAGING_DIR)/usr/bin/$(GNU_TARGET_NAME)-cc - rm -rf $(STAGING_DIR)/usr/bin/$(GNU_TARGET_NAME)-gcc - rm -rf $(STAGING_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)-cc - rm -rf $(STAGING_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)-gcc - if [ -f $(STAGING_DIR)/usr/bin-ccache/$(REAL_GNU_TARGET_NAME)-gcc ]; then \ - mv $(STAGING_DIR)/usr/bin-ccache/$(REAL_GNU_TARGET_NAME)-gcc \ - $(STAGING_DIR)/usr/bin/; \ - (cd $(STAGING_DIR)/usr/bin; \ - ln -fs $(REAL_GNU_TARGET_NAME)-gcc \ - $(REAL_GNU_TARGET_NAME)-cc; \ - ln -fs $(REAL_GNU_TARGET_NAME)-gcc \ - $(GNU_TARGET_NAME)-cc; \ - ln -fs $(REAL_GNU_TARGET_NAME)-gcc \ - $(GNU_TARGET_NAME)-gcc; \ - ); \ - fi - if [ -f $(STAGING_DIR)/usr/bin-ccache/$(REAL_GNU_TARGET_NAME)-c++ ]; then \ - rm -f $(STAGING_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)-c++; \ - mv $(STAGING_DIR)/usr/bin-ccache/$(REAL_GNU_TARGET_NAME)-c++ \ - $(STAGING_DIR)/usr/bin/; \ - fi - if [ -f $(STAGING_DIR)/usr/bin-ccache/$(REAL_GNU_TARGET_NAME)-g++ ]; then \ - rm -f $(STAGING_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)-g++; \ - mv $(STAGING_DIR)/usr/bin-ccache/$(REAL_GNU_TARGET_NAME)-g++ \ - $(STAGING_DIR)/usr/bin/; \ - fi - rm -rf $(STAGING_DIR)/usr/bin-ccache/* - (cd $(STAGING_DIR)/usr/bin; \ - ln -fs $(REAL_GNU_TARGET_NAME)-g++ $(GNU_TARGET_NAME)-c++; \ - ln -fs $(REAL_GNU_TARGET_NAME)-g++ $(GNU_TARGET_NAME)-g++; \ - ln -fs $(REAL_GNU_TARGET_NAME)-g++ $(REAL_GNU_TARGET_NAME)-c++; \ - ) - -$(MAKE) -C $(CCACHE_DIR1) clean - -ccache-dirclean: - rm -rf $(CCACHE_DIR1) - - - - -############################################################# -# -# build ccache for use on the target system -# -############################################################# - -$(CCACHE_DIR2)/.unpacked: $(DL_DIR)/$(CCACHE_SOURCE) - $(CCACHE_CAT) $(DL_DIR)/$(CCACHE_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - - touch $@ - -$(CCACHE_DIR2)/.patched: $(CCACHE_DIR2)/.unpacked - touch $@ - -$(CCACHE_DIR2)/.configured: $(CCACHE_DIR2)/.patched - mkdir -p $(CCACHE_DIR2) - (cd $(CCACHE_DIR2); rm -rf config.cache; \ - $(TARGET_CONFIGURE_OPTS) \ - $(CCACHE_DIR2)/configure $(QUIET) \ - --target=$(GNU_TARGET_NAME) \ - --host=$(GNU_TARGET_NAME) \ - --build=$(GNU_HOST_NAME) \ - --prefix=/usr \ - --sysconfdir=/etc \ - $(DISABLE_NLS) \ - $(QUIET) \ - ) - touch $@ - -$(CCACHE_DIR2)/$(CCACHE_BINARY): $(CCACHE_DIR2)/.configured - $(MAKE) -C $(CCACHE_DIR2) CFLAGS="$(TARGET_CFLAGS)" - -$(TARGET_DIR)/$(CCACHE_TARGET_BINARY): $(CCACHE_DIR2)/$(CCACHE_BINARY) - $(MAKE) DESTDIR=$(TARGET_DIR) -C $(CCACHE_DIR2) install - # put a bunch of symlinks into /bin, since that is earlier - # in the default PATH than /usr/bin where gcc lives - (cd $(TARGET_DIR)/bin; \ - ln -fs /usr/bin/ccache cc; \ - ln -fs /usr/bin/ccache gcc; \ - ln -fs /usr/bin/ccache c++; \ - ln -fs /usr/bin/ccache g++; \ - ) - -ccache_target: uclibc $(TARGET_DIR)/$(CCACHE_TARGET_BINARY) - -ccache_target-sources: $(DL_DIR)/$(CCACHE_SOURCE) - -ccache_target-clean: - rm -f $(TARGET_DIR)/$(CCACHE_TARGET_BINARY) \ - $(addprefix $(TARGET_DIR)/bin/,cc gcc c++ g++) - -$(MAKE) -C $(CCACHE_DIR2) clean - -ccache_target-dirclean: - rm -rf $(CCACHE_DIR2) -############################################################# -# -# Toplevel Makefile options -# -############################################################# -ifeq ($(BR2_CCACHE),y) -TARGETS+=ccache -endif -ifeq ($(BR2_PACKAGE_CCACHE_TARGET),y) -TARGETS+=ccache_target -endif diff --git a/toolchain/dependencies/dependencies.sh b/toolchain/dependencies/dependencies.sh index ee21b37..1aa013f 100755 --- a/toolchain/dependencies/dependencies.sh +++ b/toolchain/dependencies/dependencies.sh @@ -79,7 +79,7 @@ if [ $MAKE_MAJOR -lt 3 ] || [ $MAKE_MAJOR -eq 3 -a $MAKE_MINOR -lt 81 ] ; then fi; # Check host gcc -COMPILER=$(which $HOSTCC 2> /dev/null) +COMPILER=$(which $HOSTCC_NOCCACHE 2> /dev/null) if [ -z "$COMPILER" ] ; then COMPILER=$(which cc 2> /dev/null) fi; diff --git a/toolchain/toolchain-buildroot.mk b/toolchain/toolchain-buildroot.mk index d879697..44044d7 100644 --- a/toolchain/toolchain-buildroot.mk +++ b/toolchain/toolchain-buildroot.mk @@ -2,7 +2,6 @@ include toolchain/dependencies/dependencies.mk include toolchain/binutils/binutils.mk -include toolchain/ccache/ccache.mk include toolchain/elf2flt/elf2flt.mk include toolchain/gcc/gcc-uclibc-4.x.mk include toolchain/gdb/gdb.mk diff --git a/toolchain/toolchain-buildroot/Config.in b/toolchain/toolchain-buildroot/Config.in index a9dd192..c458251 100644 --- a/toolchain/toolchain-buildroot/Config.in +++ b/toolchain/toolchain-buildroot/Config.in @@ -5,5 +5,4 @@ source "toolchain/kernel-headers/Config.in" source "toolchain/uClibc/Config.in" source "toolchain/binutils/Config.in" source "toolchain/gcc/Config.in" -source "toolchain/ccache/Config.in" endif diff --git a/toolchain/toolchain-crosstool-ng.mk b/toolchain/toolchain-crosstool-ng.mk index 81fce18..1c80300 100644 --- a/toolchain/toolchain-crosstool-ng.mk +++ b/toolchain/toolchain-crosstool-ng.mk @@ -3,7 +3,6 @@ # Explicit ordering: include toolchain/helpers.mk include toolchain/binutils/binutils.mk -include toolchain/ccache/ccache.mk include toolchain/dependencies/dependencies.mk include toolchain/elf2flt/elf2flt.mk include toolchain/gcc/gcc-uclibc-4.x.mk diff --git a/toolchain/toolchain-external.mk b/toolchain/toolchain-external.mk index 6f1f641..f90b6f1 100644 --- a/toolchain/toolchain-external.mk +++ b/toolchain/toolchain-external.mk @@ -2,7 +2,6 @@ include toolchain/helpers.mk include toolchain/binutils/binutils.mk -include toolchain/ccache/ccache.mk include toolchain/dependencies/dependencies.mk include toolchain/elf2flt/elf2flt.mk include toolchain/gcc/gcc-uclibc-4.x.mk diff --git a/toolchain/toolchain-external/ext-tool.mk b/toolchain/toolchain-external/ext-tool.mk index 7e4645d..53ad636 100644 --- a/toolchain/toolchain-external/ext-tool.mk +++ b/toolchain/toolchain-external/ext-tool.mk @@ -62,7 +62,7 @@ endif # ! no threads # could select a multilib variant as we want the "main" sysroot, which # contains all variants of the C library in the case of multilib # toolchains. -TARGET_CC_NO_SYSROOT=$(filter-out --sysroot=%,$(TARGET_CC)) +TARGET_CC_NO_SYSROOT=$(filter-out --sysroot=%,$(TARGET_CC_NOCCACHE)) SYSROOT_DIR=$(shell $(TARGET_CC_NO_SYSROOT) -print-sysroot 2>/dev/null) ifeq ($(SYSROOT_DIR),) SYSROOT_DIR=$(shell readlink -f $$(LANG=C $(TARGET_CC_NO_SYSROOT) -print-file-name=libc.a) |sed -r -e 's:usr/lib/libc\.a::;') -- 1.7.0.4 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [Buildroot] [PATCH 1/1] ccache: rework ccache management 2010-12-03 19:16 ` [Buildroot] [PATCH 1/1] ccache: rework ccache management Thomas Petazzoni @ 2010-12-05 22:47 ` Peter Korsgaard 0 siblings, 0 replies; 13+ messages in thread From: Peter Korsgaard @ 2010-12-05 22:47 UTC (permalink / raw) To: buildroot >>>>> "Thomas" == Thomas Petazzoni <thomas.petazzoni@free-electrons.com> writes: Hi, Thomas> * ccache is now a normal package (both for the host and the target). Besides the general comments, I have a few specific ones as well: Thomas> +++ b/docs/buildroot.html Thomas> @@ -681,6 +682,31 @@ endif Thomas> Build options -> Toolchain and header file location</code> options. Thomas> This could be useful if the toolchain must be shared with other users.</p> Thomas> + <h2 id="ccache-support">Using <code>ccache</code> in Buildroot</h2> Thomas> + Thomas> + <p><a href="http://ccache.samba.org">ccache</a> is a compiler Thomas> + cache. It stores the object files resulting from each compilation Thomas> + process, and is able to skip future compilation of the same source Thomas> + file (with same compiler and same arguments) by using the Thomas> + pre-existing object files. When doing almost identical builds from Thomas> + scratch a number of times, it can divide the build time by a Thomas> + factor of two.</p> The improvement depends quite a lot on the configuration / use case, so I think we should simpluy write something like 'it can significantly speed up the build process.' rather than specifically saying x2. Thomas> +++ b/package/ccache/Config.in Thomas> @@ -0,0 +1,5 @@ Thomas> +config BR2_PACKAGE_CCACHE Thomas> + bool "ccache" Thomas> + help Thomas> + Compiler Cache Thomas> + http://samba.org/ftp/ccache Thomas> \ No newline at end of file You forgot the missing newline here and for the .mk. We normally have an empty line before the website. The official website is afaik also http://ccache.samba.org, rather than this download URL. Doesn't ccache need zlib? -- Bye, Peter Korsgaard ^ permalink raw reply [flat|nested] 13+ messages in thread
* [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support 2010-12-03 19:16 [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support Thomas Petazzoni 2010-12-03 19:16 ` [Buildroot] [PATCH 1/1] ccache: rework ccache management Thomas Petazzoni @ 2010-12-05 22:40 ` Peter Korsgaard 2010-12-06 9:44 ` Bjørn Forsman 2010-12-06 23:14 ` Thomas Petazzoni 1 sibling, 2 replies; 13+ messages in thread From: Peter Korsgaard @ 2010-12-05 22:40 UTC (permalink / raw) To: buildroot >>>>> "Thomas" == Thomas Petazzoni <thomas.petazzoni@free-electrons.com> writes: Thomas> Hello, Thomas> [ Sorry, previous pull request had some mistakes. ] Thomas> Here is a patch that reworks the ccache support to make it work and Thomas> make it useful. It is now a "Build options" rather than a "Toolchain Thomas> option". I have tested it with both internal toolchain and external Thomas> toolchain. The principle is simply to build ccache as early as Thomas> possible in the build process, and then use it to cache host and Thomas> target compiled files. Thanks, looks interesting. Thomas> The ccache cache is kept in ~/.buildroot-ccache/, so that it can be Thomas> shared between different builds. Why here and not in the default ~/.ccache? Is the ~/.ccache directory content ccache-version dependent? Thomas> I'm not using the symlink technique that was used in the past, but Thomas> rather prefixing all invocation to host gcc and target gcc with Thomas> "$(HOST_DIR)/usr/bin/ccache". Is that working everywhere? I remember we had some problems back when we added --sysroot= to TARGET_CC. The qt package in particular is stripping the --sysroot argument because of this. -- Bye, Peter Korsgaard ^ permalink raw reply [flat|nested] 13+ messages in thread
* [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support 2010-12-05 22:40 ` [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support Peter Korsgaard @ 2010-12-06 9:44 ` Bjørn Forsman 2010-12-06 15:08 ` Peter Korsgaard 2010-12-06 19:22 ` Thomas Petazzoni 2010-12-06 23:14 ` Thomas Petazzoni 1 sibling, 2 replies; 13+ messages in thread From: Bjørn Forsman @ 2010-12-06 9:44 UTC (permalink / raw) To: buildroot Hi, On 5 December 2010 23:40, Peter Korsgaard <jacmet@uclibc.org> wrote: >>>>>> "Thomas" == Thomas Petazzoni <thomas.petazzoni@free-electrons.com> writes: [snip] > ?Thomas> I'm not using the symlink technique that was used in the past, but > ?Thomas> rather prefixing all invocation to host gcc and target gcc with > ?Thomas> "$(HOST_DIR)/usr/bin/ccache". > > Is that working everywhere? I remember we had some problems back when we > added --sysroot= to TARGET_CC. The qt package in particular is stripping > the --sysroot argument because of this. The cdrkit package also strips off --sysroot because its build system CMake doesn't like it when --sysroot is part of the compiler path. Actually, I am currently working on a CMAKETARGETS macro (similar to AUTOTARGETS) and decided to write a patch that takes --sysroot out of TARGET_CC and move it to the {C,CXX}FLAGS variables, to make CMake happy. I've been meaning to post the patch series but I don't feel it's ready to be merged yet. How do the Buildroot developers feel about a) moving --sysroot from TARGET_CC to {C,CXX}FLAGS b) add CMAKETARGETS infrastructure If this sounds interesting I can post the patches for review. Best regards, Bj?rn Forsman ^ permalink raw reply [flat|nested] 13+ messages in thread
* [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support 2010-12-06 9:44 ` Bjørn Forsman @ 2010-12-06 15:08 ` Peter Korsgaard 2010-12-06 19:24 ` Thomas Petazzoni 2010-12-06 19:22 ` Thomas Petazzoni 1 sibling, 1 reply; 13+ messages in thread From: Peter Korsgaard @ 2010-12-06 15:08 UTC (permalink / raw) To: buildroot >>>>> "Bj?rn" == Bj?rn Forsman <bjorn.forsman@gmail.com> writes: Hi, Bj?rn> Actually, I am currently working on a CMAKETARGETS macro (similar to Bj?rn> AUTOTARGETS) and decided to write a patch that takes --sysroot out of Bj?rn> TARGET_CC and move it to the {C,CXX}FLAGS variables, to make CMake Bj?rn> happy. I've been meaning to post the patch series but I don't feel Bj?rn> it's ready to be merged yet. How do the Buildroot developers feel Bj?rn> about Bj?rn> a) moving --sysroot from TARGET_CC to {C,CXX}FLAGS It afaik got moved in the first place to fix issues with external toolchains (E.G. where sysroot is important) and various configure scripts not using CFLAGS, so I don't think this will work. Perhaps we should simply bite the bullet and add simple shell wrappers in HOST_DIR / STAGING_DIR for gcc/g++/ld which add --sysroot when we're using an external toolchain, and then get rid of --sysroot in TARGET_CC. Bj?rn> b) add CMAKETARGETS infrastructure Sounds good! Bj?rn> If this sounds interesting I can post the patches for review. Yes, please. -- Bye, Peter Korsgaard ^ permalink raw reply [flat|nested] 13+ messages in thread
* [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support 2010-12-06 15:08 ` Peter Korsgaard @ 2010-12-06 19:24 ` Thomas Petazzoni 0 siblings, 0 replies; 13+ messages in thread From: Thomas Petazzoni @ 2010-12-06 19:24 UTC (permalink / raw) To: buildroot On Mon, 06 Dec 2010 16:08:17 +0100 Peter Korsgaard <jacmet@uclibc.org> wrote: > It afaik got moved in the first place to fix issues with external > toolchains (E.G. where sysroot is important) and various configure > scripts not using CFLAGS, so I don't think this will work. Yes. > Perhaps we should simply bite the bullet and add simple shell wrappers > in HOST_DIR / STAGING_DIR for gcc/g++/ld which add --sysroot when > we're using an external toolchain, and then get rid of --sysroot in > TARGET_CC. Maybe. But for the moment, I think doing the little mungling done in cdrkit.mk that fixes all CMake-based packages is quite reasonable. Thomas -- Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com ^ permalink raw reply [flat|nested] 13+ messages in thread
* [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support 2010-12-06 9:44 ` Bjørn Forsman 2010-12-06 15:08 ` Peter Korsgaard @ 2010-12-06 19:22 ` Thomas Petazzoni 2010-12-07 0:04 ` Bjørn Forsman 1 sibling, 1 reply; 13+ messages in thread From: Thomas Petazzoni @ 2010-12-06 19:22 UTC (permalink / raw) To: buildroot Hello, On Mon, 6 Dec 2010 10:44:40 +0100 Bj?rn Forsman <bjorn.forsman@gmail.com> wrote: > The cdrkit package also strips off --sysroot because its build system > CMake doesn't like it when --sysroot is part of the compiler path. Yes. > Actually, I am currently working on a CMAKETARGETS macro (similar to > AUTOTARGETS) and decided to write a patch that takes --sysroot out of > TARGET_CC and move it to the {C,CXX}FLAGS variables, to make CMake > happy. I've been meaning to post the patch series but I don't feel > it's ready to be merged yet. How do the Buildroot developers feel > about > > a) moving --sysroot from TARGET_CC to {C,CXX}FLAGS No, please don't do that :-) There are other packages that need this. See efb1d8d3f40281645c178c150d992601c8042c1a. commit efb1d8d3f40281645c178c150d992601c8042c1a Author: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Date: Fri Jun 25 15:04:08 2010 +0200 Cleanup TARGET_CONFIGURE_OPTS The definition of CC, LD, GCC, CPP, CXX and FC shouldn't contain the CFLAGS/LDFLAGS/CXXFLAGS, those should be passed through the appropriate variables. However, the --sysroot option is a particular case here: it needs to be part of the CC/LD/GCC/etc. definitions otherwise libtool strips it from the CFLAGS/LDFLAGS. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> The current choice has been fairly hard to get to, we made a number of different tries before finding a solution that seems to work relatively fine for most packages. Therefore, I'd prefer to keep the TARGET_CC/TARGET_CFLAGS as they are today, even if the CMAKETARGETS infrastructure needs to do the same kind of mungling as cdrkit.mk is doing. If you really want to be convinced that having --sysroot in TARGET_CFLAGS causes problems, I can probably trigger a particular configuration to exhibit the issue. > b) add CMAKETARGETS infrastructure Yes, that would be great. We're likely to see more CMake-based packages in the future. Note that some people in the Armadeus project are working on a different thing related to CMake and Buildroot: generate automatically a CMake toolchain description file, to make it easy to build CMake-based applications outside of Buildroot, using the toolchain and staging directory of Buildroot. Regards, Thomas -- Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com ^ permalink raw reply [flat|nested] 13+ messages in thread
* [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support 2010-12-06 19:22 ` Thomas Petazzoni @ 2010-12-07 0:04 ` Bjørn Forsman 2010-12-07 19:53 ` Thomas Petazzoni 0 siblings, 1 reply; 13+ messages in thread From: Bjørn Forsman @ 2010-12-07 0:04 UTC (permalink / raw) To: buildroot Hi Thomas, 2010/12/6 Thomas Petazzoni <thomas.petazzoni@free-electrons.com>: > Hello, > > On Mon, 6 Dec 2010 10:44:40 +0100 > Bj?rn Forsman <bjorn.forsman@gmail.com> wrote: >> Actually, I am currently working on a CMAKETARGETS macro (similar to >> AUTOTARGETS) and decided to write a patch that takes --sysroot out of >> TARGET_CC and move it to the {C,CXX}FLAGS variables, to make CMake >> happy. I've been meaning to post the patch series but I don't feel >> it's ready to be merged yet. How do the Buildroot developers feel >> about >> >> a) moving --sysroot from TARGET_CC to {C,CXX}FLAGS > > No, please don't do that :-) > > There are other packages that need this. See > efb1d8d3f40281645c178c150d992601c8042c1a. > > commit efb1d8d3f40281645c178c150d992601c8042c1a > Author: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> > Date: ? Fri Jun 25 15:04:08 2010 +0200 > > ? ?Cleanup TARGET_CONFIGURE_OPTS > > ? ?The definition of CC, LD, GCC, CPP, CXX and FC shouldn't contain the > ? ?CFLAGS/LDFLAGS/CXXFLAGS, those should be passed through the > ? ?appropriate variables. > > ? ?However, the --sysroot option is a particular case here: it needs to > ? ?be part of the CC/LD/GCC/etc. definitions otherwise libtool strips it > ? ?from the CFLAGS/LDFLAGS. > > ? ?Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> > > The current choice has been fairly hard to get to, we made a number of > different tries before finding a solution that seems to work relatively > fine for most packages. Therefore, I'd prefer to keep the > TARGET_CC/TARGET_CFLAGS as they are today, even if the CMAKETARGETS > infrastructure needs to do the same kind of mungling as cdrkit.mk is > doing. > > If you really want to be convinced that having --sysroot in > TARGET_CFLAGS causes problems, I can probably trigger a particular > configuration to exhibit the issue. Are many packages affected? If many, I'll just take your word for it and leave TARGET_CC and xFLAGS variables be, but if there is only a few packages affected, maybe we can fix them instead? >> b) add CMAKETARGETS infrastructure > > Yes, that would be great. We're likely to see more CMake-based packages > in the future. > > Note that some people in the Armadeus project are working on a > different thing related to CMake and Buildroot: generate automatically > a CMake toolchain description file, to make it easy to build > CMake-based applications outside of Buildroot, using the toolchain and > staging directory of Buildroot. Yes, I'd like to get this CMake toolchain file feature into Buildroot as well. How about appending a toolchain file target to $(2)_DEPENDENCIES in Makefile.cmake.in? And place the toolchain file in output/? Best regards, Bj?rn Forsman ^ permalink raw reply [flat|nested] 13+ messages in thread
* [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support 2010-12-07 0:04 ` Bjørn Forsman @ 2010-12-07 19:53 ` Thomas Petazzoni 2010-12-08 10:24 ` Bjørn Forsman 0 siblings, 1 reply; 13+ messages in thread From: Thomas Petazzoni @ 2010-12-07 19:53 UTC (permalink / raw) To: buildroot Hello, On Tue, 7 Dec 2010 01:04:41 +0100 Bj?rn Forsman <bjorn.forsman@gmail.com> wrote: > Are many packages affected? I don't remember. > If many, I'll just take your word for it and leave TARGET_CC and > xFLAGS variables be, but if there is only a few packages affected, > maybe we can fix them instead? The problem was related to libtool. And unfortunately "fix problem" and "libtool" in the same sentence is fairly hard to have :-) Honestly, I've spent quite a bit of time at this moment trying to find the solution for the --sysroot option that would work with most packages, without requiring to do horrible things. As things are working today, I'm not really willing to spend more time on this, but if others want, I of course won't prevent them from doing so. I'll just ask for some heavy testing to be done before accepting changes on this :-) > Yes, I'd like to get this CMake toolchain file feature into Buildroot > as well. How about appending a toolchain file target to > $(2)_DEPENDENCIES in Makefile.cmake.in? Hum, why ? Do you want to use the toolchain file even to build the CMake-based packages in Buildroot ? Or just provide it for users to build external softwares outside of Buildroot ? > And place the toolchain file in output/? As it should be part of the SDK, it should probably be located in $(HOST_DIR) somewhere. But I'm not really clear yet on what the organization of the SDK should be. In the mean time, just assume you can put it in $(O), moving it to some other place won't be hard. Thanks! Thomas -- Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com ^ permalink raw reply [flat|nested] 13+ messages in thread
* [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support 2010-12-07 19:53 ` Thomas Petazzoni @ 2010-12-08 10:24 ` Bjørn Forsman 0 siblings, 0 replies; 13+ messages in thread From: Bjørn Forsman @ 2010-12-08 10:24 UTC (permalink / raw) To: buildroot Hi Thomas, 2010/12/7 Thomas Petazzoni <thomas.petazzoni@free-electrons.com>: > Hello, > > On Tue, 7 Dec 2010 01:04:41 +0100 > Bj?rn Forsman <bjorn.forsman@gmail.com> wrote: > >> Are many packages affected? > > I don't remember. > >> If many, I'll just take your word for it and leave TARGET_CC and >> xFLAGS variables be, but if there is only a few packages affected, >> maybe we can fix them instead? > > The problem was related to libtool. And unfortunately "fix problem" and > "libtool" in the same sentence is fairly hard to have :-) > > Honestly, I've spent quite a bit of time at this moment trying to find > the solution for the --sysroot option that would work with most > packages, without requiring to do horrible things. As things are > working today, I'm not really willing to spend more time on this, but > if others want, I of course won't prevent them from doing so. I'll just > ask for some heavy testing to be done before accepting changes on > this :-) Ok. I'll just leave --sysroot the way it is. >> Yes, I'd like to get this CMake toolchain file feature into Buildroot >> as well. How about appending a toolchain file target to >> $(2)_DEPENDENCIES in Makefile.cmake.in? > > Hum, why ? Do you want to use the toolchain file even to build the > CMake-based packages in Buildroot ? Or just provide it for users to > build external softwares outside of Buildroot ? I haven't really decided whether to use the toolchain file internally or not. If using it internally reduces code duplication, then maybe yes :-) And adding the target to $(2)_DEPENDENCIES in Makefile.cmake.in was just the first place that I thought of. I guess the toolchain file should be generated earlier, and be generated even if the user doesn't select any CMake packages inside Buildroot, but I don't know where the right 'hook' in Buildroot would be for that. Maybe when the .config file is written? >> And place the toolchain file in output/? > > As it should be part of the SDK, it should probably be located in > $(HOST_DIR) somewhere. But I'm not really clear yet on what the > organization of the SDK should be. In the mean time, just assume you > can put it in $(O), moving it to some other place won't be hard. Ok. So until the SDK is ready I'll just put the toolchain file in $(O) and don't use it internally so it will be easy to change later. I'll post the patch series once I've rebased. Best regards, Bj?rn Forsman ^ permalink raw reply [flat|nested] 13+ messages in thread
* [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support 2010-12-05 22:40 ` [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support Peter Korsgaard 2010-12-06 9:44 ` Bjørn Forsman @ 2010-12-06 23:14 ` Thomas Petazzoni 2010-12-07 12:26 ` Peter Korsgaard 1 sibling, 1 reply; 13+ messages in thread From: Thomas Petazzoni @ 2010-12-06 23:14 UTC (permalink / raw) To: buildroot Hello, On Sun, 05 Dec 2010 23:40:14 +0100 Peter Korsgaard <jacmet@uclibc.org> wrote: > Thomas> The ccache cache is kept in ~/.buildroot-ccache/, so that it can be > Thomas> shared between different builds. > > Why here and not in the default ~/.ccache? Is the ~/.ccache directory > content ccache-version dependent? I don't know how ccache-version dependent are the contents of the cache directory. In the previous ccache integration, the cache was inside Buildroot build directory (which I thought was stupid since you then couldn't share the cache between different Buildroot builds), but I kept the idea of having a Buildroot-specific location for the cache. I don't have strong opinion/arguments on that, so if you say we should use the default cache location, I'll just do it. > Is that working everywhere? Everywhere I don't know, I obviously haven't compiled all our packages with ccache support enabled. > I remember we had some problems back when we added --sysroot= to TARGET_CC. > The qt package in particular is stripping the --sysroot argument because > of this. I just tried Qt, and it built fine. It does not use ccache for the parts compiled for the host (since we don't tell Qt about $(HOSTCXX)), but it definitely uses the cache for parts compiled for the target. Here are the results for a Busybox + Qt build, with a CodeSourcery glibc ARM external toolchain. Cold cache ========== real 7m41.319s user 37m53.620s sys 1m31.660s Hot cache ========= real 3m4.738s user 5m34.480s sys 0m36.160s And in the hot cache case, a quite significant time is spent rebuilding the host tools, as ccache is not used there. So we could probably speed this up a bit further. I am not strongly advocating the usage of the "ccache /path/to/gcc" solution compared to the symbolic link solutions, but if the first solution works, I find it better because: 1) it's nicer and 2) it's easier to implement with external toolchains. Regards, Thomas -- Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com ^ permalink raw reply [flat|nested] 13+ messages in thread
* [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support 2010-12-06 23:14 ` Thomas Petazzoni @ 2010-12-07 12:26 ` Peter Korsgaard 0 siblings, 0 replies; 13+ messages in thread From: Peter Korsgaard @ 2010-12-07 12:26 UTC (permalink / raw) To: buildroot >>>>> "Thomas" == Thomas Petazzoni <thomas.petazzoni@free-electrons.com> writes: Hi, >> Why here and not in the default ~/.ccache? Is the ~/.ccache >> directory content ccache-version dependent? Thomas> I don't know how ccache-version dependent are the contents of Thomas> the cache directory. In the previous ccache integration, the Thomas> cache was inside Buildroot build directory (which I thought was Thomas> stupid since you then couldn't share the cache between Thomas> different Buildroot builds), but I kept the idea of having a Thomas> Buildroot-specific location for the cache. Thomas> I don't have strong opinion/arguments on that, so if you say we Thomas> should use the default cache location, I'll just do it. Ok, me neither - Just keep it where it is. It just wasn't clear to me from the commit message if there was any deeper reason behind it. >> I remember we had some problems back when we added --sysroot= to TARGET_CC. >> The qt package in particular is stripping the --sysroot argument because >> of this. Thomas> I just tried Qt, and it built fine. It does not use ccache for the Thomas> parts compiled for the host (since we don't tell Qt about $(HOSTCXX)), Thomas> but it definitely uses the cache for parts compiled for the target. Ok, thanks. Thomas> Here are the results for a Busybox + Qt build, with a Thomas> CodeSourcery glibc ARM external toolchain. Thomas> Cold cache Thomas> ========== Thomas> real 7m41.319s Thomas> user 37m53.620s Thomas> sys 1m31.660s Thomas> Hot cache Thomas> ========= Thomas> real 3m4.738s Thomas> user 5m34.480s Thomas> sys 0m36.160s Nice! Thomas> I am not strongly advocating the usage of the "ccache /path/to/gcc" Thomas> solution compared to the symbolic link solutions, but if the first Thomas> solution works, I find it better because: 1) it's nicer and 2) it's Thomas> easier to implement with external toolchains. Ok, fine by me if it works. Care to send a new pull request with the few issues I pointed out fixed, then I'll commit it? -- Bye, Peter Korsgaard ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2010-12-08 10:24 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-12-03 19:16 [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support Thomas Petazzoni 2010-12-03 19:16 ` [Buildroot] [PATCH 1/1] ccache: rework ccache management Thomas Petazzoni 2010-12-05 22:47 ` Peter Korsgaard 2010-12-05 22:40 ` [Buildroot] [pull request v2] Pull request for branch for-2011.02/fix-ccache-support Peter Korsgaard 2010-12-06 9:44 ` Bjørn Forsman 2010-12-06 15:08 ` Peter Korsgaard 2010-12-06 19:24 ` Thomas Petazzoni 2010-12-06 19:22 ` Thomas Petazzoni 2010-12-07 0:04 ` Bjørn Forsman 2010-12-07 19:53 ` Thomas Petazzoni 2010-12-08 10:24 ` Bjørn Forsman 2010-12-06 23:14 ` Thomas Petazzoni 2010-12-07 12:26 ` Peter Korsgaard
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox