Commit fd10b42a authored by Thomas De Schampheleire's avatar Thomas De Schampheleire Committed by Peter Korsgaard
Browse files

dependencies: build a host-tar if no suitable tar can be found



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.

host-tar is download and extracted as cpio.gz instead of tar.gz, to prevent
chicken-egg problem.

Signed-off-by: default avatarThomas De Schampheleire <thomas.de.schampheleire@gmail.com>
v4 Acked-by: default avatarArnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Signed-off-by: default avatarPeter Korsgaard <jacmet@sunsite.dk>
parent 1bbf39bd
Loading
Loading
Loading
Loading
+0 −12
Original line number Diff line number Diff line
@@ -299,18 +299,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
+13 −0
Original line number Diff line number Diff line
@@ -10,6 +10,19 @@ TAR_SITE = $(BR2_GNU_MIRROR)/tar
# Prefer full-blown tar over buybox's version
ifeq ($(BR2_PACKAGE_BUSYBOX),y)
TAR_DEPENDENCIES += busybox
HOST_TAR_DEPENDENCIES =
endif

$(eval $(call AUTOTARGETS))

# host-tar: use cpio.gz instead of tar.gz to prevent chicken-egg problem
# of needing tar to build tar.
HOST_TAR_SOURCE = tar-$(TAR_VERSION).cpio.gz
define HOST_TAR_EXTRACT_CMDS
	mkdir -p $(@D)
	cd $(@D) && \
		$(INFLATE.gz) $(DL_DIR)/$(HOST_TAR_SOURCE) | cpio -i
	mv $(@D)/tar-$(TAR_VERSION)/* $(@D)
	rmdir $(@D)/tar-$(TAR_VERSION)
endef
$(eval $(call AUTOTARGETS,host))
+9 −0
Original line number Diff line number Diff line
TAR ?= tar

ifeq (,$(call suitable-host-package,tar,$(TAR)))
  DEPENDENCIES_HOST_PREREQ += host-tar
  TAR = $(HOST_DIR)/usr/bin/tar
endif

# Since TAR is at least 1.17, it will certainly support --strip-components
TAR_STRIP_COMPONENTS = --strip-components
+35 −0
Original line number Diff line number Diff line
#!/bin/sh

candidate="$1"

tar=`which $candidate`
if [ ! -x "$tar" ]; then
	tar=`which tar`
	if [ ! -x "$tar" ]; then
		# echo nothing: no suitable tar found
		exit 1
	fi
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
		# echo nothing: no suitable tar found
		exit 1
	fi
fi