From: Thomas De Schampheleire <patrickdepinguin+buildroot@gmail.com>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCH 2 of 3 v2] dependencies: build a host-tar if no suitable tar can be found
Date: Wed, 23 Nov 2011 14:59:59 +0100 [thread overview]
Message-ID: <d4b15640ce2d3ab89835.1322053785@devws108> (raw)
In-Reply-To: <patchbomb.1322053783@devws108>
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 <thomas.de.schampheleire@gmail.com>
Reviewed-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
---
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
next prev parent reply other threads:[~2011-11-23 13:59 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-23 13:59 [Buildroot] [PATCH 0 of 3 v2] dependencies: some improvements Thomas De Schampheleire
2011-11-23 13:59 ` [Buildroot] [PATCH 1 of 3 v2] dependencies: add function suitable-host-package Thomas De Schampheleire
2011-12-06 17:12 ` Arnout Vandecappelle
2011-12-08 9:56 ` Thomas De Schampheleire
2011-11-23 13:59 ` Thomas De Schampheleire [this message]
2011-11-23 14:24 ` [Buildroot] [PATCH 2 of 3 v2] dependencies: build a host-tar if no suitable tar can be found Thomas Petazzoni
2011-11-23 15:05 ` Michael S. Zick
2011-11-23 15:09 ` Thomas De Schampheleire
2011-12-06 17:07 ` Arnout Vandecappelle
2011-12-08 10:41 ` Thomas De Schampheleire
2011-12-08 14:13 ` Michael S. Zick
2011-12-08 15:05 ` Michael S. Zick
2011-12-09 7:00 ` Thomas De Schampheleire
[not found] ` <201112090811.09604.minimod@morethan.org>
2011-12-10 9:06 ` Thomas De Schampheleire
2011-12-06 17:23 ` Arnout Vandecappelle
2011-12-08 10:06 ` Thomas De Schampheleire
2011-12-08 14:19 ` Michael S. Zick
2011-11-23 14:00 ` [Buildroot] [PATCH 3 of 3 v2] Move toolchain/dependencies to support/dependencies Thomas De Schampheleire
2011-11-23 14:25 ` Thomas Petazzoni
2011-12-06 16:59 ` Arnout Vandecappelle
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d4b15640ce2d3ab89835.1322053785@devws108 \
--to=patrickdepinguin+buildroot@gmail.com \
--cc=buildroot@busybox.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox