ccache: rework ccache management

* 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>
Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
This commit is contained in:
Thomas Petazzoni 2010-12-07 21:09:56 +01:00 committed by Peter Korsgaard
parent 3bbf1c2ea6
commit 17b66affdf
17 changed files with 113 additions and 242 deletions

View File

@ -1,5 +1,8 @@
2011.02, Not yet released:
Ccache support reworked. Now used for both host and target
compilation, and cache is stored in ~/.buildroot-ccache.
Updated/fixed packages: cloop, m4, openssh, xz
New packages: lsuio

View File

@ -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

View File

@ -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,8 +150,6 @@ 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)
@ -156,6 +157,7 @@ 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 HOSTCC_NOCCACHE HOSTCXX_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 +233,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 +283,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 +494,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 \

View File

@ -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>
@ -523,9 +524,8 @@ $(ZLIB_DIR)/libz.a: $(ZLIB_DIR)/.configured
<ul>
<li><b>toolchain</b> (in the <code>toolchain/</code> directory) contains
the Makefiles and associated files for all software related to the
cross-compilation toolchain: <code>binutils</code>, <code>ccache</code>,
<code>gcc</code>, <code>gdb</code>, <code>kernel-headers</code> and
<code>uClibc</code>.</li>
cross-compilation toolchain: <code>binutils</code>, <code>gcc</code>,
<code>gdb</code>, <code>kernel-headers</code> and <code>uClibc</code>.</li>
<li><b>package</b> (in the <code>package/</code> directory) contains the
Makefiles and associated files for all user-space tools that Buildroot
@ -681,6 +681,31 @@ endif
Build options -&gt; 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 nicely speed up the build
process.</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

View File

@ -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

View File

@ -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) \

9
package/ccache/Config.in Normal file
View File

@ -0,0 +1,9 @@
config BR2_PACKAGE_CCACHE
bool "ccache"
help
ccache is a compiler cache. It speeds up recompilation by
caching previous compilations and detecting when the same
compilation is being done again
http://samba.ccache.org

33
package/ccache/ccache.mk Normal file
View File

@ -0,0 +1,33 @@
#############################################################
#
# 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

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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::;')