From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas De Schampheleire Date: Wed, 23 Nov 2011 14:59:59 +0100 Subject: [Buildroot] [PATCH 2 of 3 v2] dependencies: build a host-tar if no suitable tar can be found In-Reply-To: References: Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: buildroot@busybox.net Some toolchains, like the one built with buildroot itself, use hardlinks (for example to link between the c++ and g++ binary). Unpacking such a toolchain with the --strip-components options does not work correctly if the system tar is too old (<1.17). Even recent releases of RedHat/CentOS still ship with tar 1.15. This patch checks for a suitable tar version (tar 1.17+) on the host system, and adds host-tar to the host dependencies if none can be found. TAR is redefined to HOST_TAR, except when extracting host-tar (this is a chicken-and-egg problem), so that all packages use the host-tar if no suitable tar was found. Signed-off-by: Thomas De Schampheleire Reviewed-by: Arnout Vandecappelle (Essensium/Mind) --- package/Makefile.package.in | 12 ------------ package/tar/tar.mk | 6 ++++++ toolchain/dependencies/check-host-tar.mk | 32 ++++++++++++++++++++++++++++++++ toolchain/dependencies/check-host-tar.sh | 29 +++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 12 deletions(-) diff --git a/package/Makefile.package.in b/package/Makefile.package.in --- a/package/Makefile.package.in +++ b/package/Makefile.package.in @@ -235,18 +235,6 @@ define DOWNLOAD exit 1 endef -# Utility programs used to build packages -TAR ?= tar - -# Automatically detect tar --strip-path/components option -TAR_STRIP_COMPONENTS := \ - $(shell $(TAR) --help | grep strip-path > /dev/null ; \ - if test $$? = 0 ; then \ - echo '--strip-path' ; \ - else \ - echo '--strip-components' ; \ - fi) - # Needed for the foreach loops to loop over the list of hooks, so that # each hook call is properly separated by a newline. define sep diff --git a/package/tar/tar.mk b/package/tar/tar.mk --- a/package/tar/tar.mk +++ b/package/tar/tar.mk @@ -13,3 +13,9 @@ TAR_DEPENDENCIES += busybox endif $(eval $(call AUTOTARGETS)) + +TAR = $(SYSTEM_TAR) # We need a real tar to extract tar +TAR_STRIP_COMPONENTS = $(SYSTEM_TAR_STRIP_COMPONENTS) +$(eval $(call AUTOTARGETS,host)) +TAR = $(HOST_TAR) +TAR_STRIP_COMPONENTS = $(HOST_TAR_STRIP_COMPONENTS) diff --git a/toolchain/dependencies/check-host-tar.mk b/toolchain/dependencies/check-host-tar.mk new file mode 100644 --- /dev/null +++ b/toolchain/dependencies/check-host-tar.mk @@ -0,0 +1,32 @@ +TAR ?= tar + +# To extract tar, we always need a real (system) tar. Provide the necessary +# definitions here to avoid cluttering package/tar/tar.mk . +# TAR will be overridden again when the tar .mk file is included, so we must +# finalize the value of SYSTEM_TAR by using := +SYSTEM_TAR := $(TAR) +# Automatically detect tar --strip-path/components option +# --strip-path was renamed to --strip-components in tar 1.15 +SYSTEM_TAR_STRIP_COMPONENTS := \ + $(shell $(SYSTEM_TAR) --help | grep strip-path > /dev/null ; \ + if test $$? = 0 ; then \ + echo '--strip-path' ; \ + else \ + echo '--strip-components' ; \ + fi) + +# Determine correct HOST_TAR +ifneq (,$(call suitable-host-package,tar)) + HOST_TAR = $(SYSTEM_TAR) +else + DEPENDENCIES_HOST_PREREQ += host-tar + HOST_TAR = $(HOST_DIR)/usr/bin/tar +endif + +# Since HOST_TAR is at least 1.17, it will certainly support --strip-components +HOST_TAR_STRIP_COMPONENTS = --strip-components + +# Set definitions used by all .mk files included after this one and before +# package/tar/tar.mk +TAR = $(HOST_TAR) +TAR_STRIP_COMPONENTS = $(HOST_TAR_STRIP_COMPONENTS) diff --git a/toolchain/dependencies/check-host-tar.sh b/toolchain/dependencies/check-host-tar.sh new file mode 100755 --- /dev/null +++ b/toolchain/dependencies/check-host-tar.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +tar=`which tar` +if [ -z "$tar" ]; then + return +fi + +# Output of 'tar --version' examples: +# tar (GNU tar) 1.15.1 +# tar (GNU tar) 1.25 +version=`$tar --version | head -n 1 | sed 's/^.*\s\([0-9]\+\.\S\+\).*$/\1/'` +major=`echo "$version" | cut -d. -f1` +minor=`echo "$version" | cut -d. -f2` +bugfix=`echo "$version" | cut -d. -f3` + +# Minimal version = 1.17 (previous versions do not correctly unpack archives +# containing hard-links if the --strip-components option is used). +major_min=1 +minor_min=17 +if [ $major -gt $major_min ]; then + echo $tar +else + if [ $major -eq $major_min -a $minor -ge $minor_min ]; then + echo $tar + else + false + # echo nothing: no suitable tar found + fi +fi