[Buildroot] [RFCv1 10/11] toolchain-external: convert to the package infrastructure

Thomas De Schampheleire patrickdepinguin at gmail.com
Mon Sep 16 13:29:36 UTC 2013


Hi Thomas,

On Thu, Sep 5, 2013 at 11:27 PM, Thomas Petazzoni
<thomas.petazzoni at free-electrons.com> wrote:
> This commit converts the 'toolchain-external' logic to the package
> infrastructure.
>
> The TOOLCHAIN_EXTERNAL_DIR variable (which points to where the
> toolchain is located) is renamed to TOOLCHAIN_EXTERNAL_INSTALL_DIR,
> because the former conflicts with the package infrastructure (which
> defines the <pkg>_DIR variable for each package as pointing to its
> build directory).
>
> The new _SOURCE_ADDONS mechanism is used for Blackfin toolchains.
>
> The extract, configuration and installation steps are converted inside
> the <pkg>_EXTRACT_CMDS, <pkg>_CONFIGURE_CMDS and
> <pkg>_INSTALL_STAGING_CMDS.
>
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
> ---
[..]

>
> +TOOLCHAIN_EXTERNAL_INSTALL_STAGING = YES
> +
> +ifeq ($(BR2_TOOLCHAIN_EXTERNAL_BLACKFIN_UCLINUX_2012R1)$(BR2_TOOLCHAIN_EXTERNAL_BLACKFIN_UCLINUX_2012R2),y)
>  # Special handling for Blackfin toolchain, because of the split in two
>  # tarballs, and the organization of tarball contents. The tarballs
>  # contain ./opt/uClinux/{bfin-uclinux,bfin-linux-uclibc} directories,
>  # which themselves contain the toolchain. This is why we strip more
>  # components than usual.
> -ifeq ($(BR2_TOOLCHAIN_EXTERNAL_BLACKFIN_UCLINUX_2012R1)$(BR2_TOOLCHAIN_EXTERNAL_BLACKFIN_UCLINUX_2012R2),y)
> -$(DL_DIR)/$(TOOLCHAIN_EXTERNAL_SOURCE_1):
> -       $(call DOWNLOAD,$(TOOLCHAIN_EXTERNAL_SITE_1:/=)/$(TOOLCHAIN_EXTERNAL_SOURCE_1))
> -
> -$(DL_DIR)/$(TOOLCHAIN_EXTERNAL_SOURCE_2):
> -       $(call DOWNLOAD,$(TOOLCHAIN_EXTERNAL_SITE_2:/=)/$(TOOLCHAIN_EXTERNAL_SOURCE_2))
> -
> -$(TOOLCHAIN_EXTERNAL_DIR)/.extracted: $(DL_DIR)/$(TOOLCHAIN_EXTERNAL_SOURCE_1) $(DL_DIR)/$(TOOLCHAIN_EXTERNAL_SOURCE_2)
> -       mkdir -p $(@D)
> -       $(INFLATE$(suffix $(TOOLCHAIN_EXTERNAL_SOURCE_1))) $(DL_DIR)/$(TOOLCHAIN_EXTERNAL_SOURCE_1) | \
> -               $(TAR) $(TAR_STRIP_COMPONENTS)=3 --hard-dereference -C $(@D) $(TAR_OPTIONS) -
> -       $(INFLATE$(suffix $(TOOLCHAIN_EXTERNAL_SOURCE_2))) $(DL_DIR)/$(TOOLCHAIN_EXTERNAL_SOURCE_2) | \
> -               $(TAR) $(TAR_STRIP_COMPONENTS)=3 --hard-dereference -C $(@D) $(TAR_OPTIONS) -
> -       $(Q)touch $@
> -else
> -# Download and extraction of a toolchain
> -$(DL_DIR)/$(TOOLCHAIN_EXTERNAL_SOURCE):
> -       $(call DOWNLOAD,$(TOOLCHAIN_EXTERNAL_SITE)$(TOOLCHAIN_EXTERNAL_SOURCE),$(TOOLCHAIN_EXTERNAL_SOURCE))
> -
> -$(TOOLCHAIN_EXTERNAL_DIR)/.extracted: $(DL_DIR)/$(TOOLCHAIN_EXTERNAL_SOURCE)
> -       mkdir -p $(@D)
> -       $(INFLATE$(suffix $(TOOLCHAIN_EXTERNAL_SOURCE))) $^ | \
> -               $(TAR) $(TAR_STRIP_COMPONENTS)=1 --exclude='usr/lib/locale/*' -C $(@D) $(TAR_OPTIONS) -
> +define TOOLCHAIN_EXTERNAL_EXTRACT_CMDS
> +       mkdir -p $(TOOLCHAIN_EXTERNAL_INSTALL_DIR)
> +       $(INFLATE$(suffix $(TOOLCHAIN_EXTERNAL_SOURCE))) $(DL_DIR)/$(TOOLCHAIN_EXTERNAL_SOURCE) | \
> +               $(TAR) $(TAR_STRIP_COMPONENTS)=3 --hard-dereference -C $(TOOLCHAIN_EXTERNAL_INSTALL_DIR) $(TAR_OPTIONS) -
> +       $(INFLATE$(suffix $(TOOLCHAIN_EXTERNAL_SOURCE_ADDONS))) $(DL_DIR)/$(TOOLCHAIN_EXTERNAL_SOURCE_ADDONS) | \
> +               $(TAR) $(TAR_STRIP_COMPONENTS)=3 --hard-dereference -C $(TOOLCHAIN_EXTERNAL_INSTALL_DIR) $(TAR_OPTIONS) -
> +endef
> +else ifneq ($(TOOLCHAIN_EXTERNAL_SOURCE),)
> +# Normal handling of toolchain tarball extraction.
> +define TOOLCHAIN_EXTERNAL_EXTRACT_CMDS
> +       mkdir -p $(TOOLCHAIN_EXTERNAL_INSTALL_DIR)
> +       $(INFLATE$(suffix $(TOOLCHAIN_EXTERNAL_SOURCE))) $(DL_DIR)/$(TOOLCHAIN_EXTERNAL_SOURCE) | \
> +               $(TAR) $(TAR_STRIP_COMPONENTS)=1 --exclude='usr/lib/locale/*' -C $(TOOLCHAIN_EXTERNAL_INSTALL_DIR) $(TAR_OPTIONS) -
>         $(TOOLCHAIN_EXTERNAL_FIXUP_CMDS)
> -       $(Q)touch $@
> +endef
>  endif

Given that the extract commands are now very similar between blackfin
and non-blackfin, wouldn't it make more sense to define it once and
tweak it based on a variable?
Something like (quick and untested):

ifeq ($(BR2_TOOLCHAIN_EXTERNAL_BLACKFIN_UCLINUX_2012R1)$(BR2_TOOLCHAIN_EXTERNAL_BLACKFIN_UCLINUX_2012R2),y)
TOOLCHAIN_EXTERNAL_TAR_OPTIONS = $(TAR_STRIP_COMPONENTS)=3 --hard-dereference
else
TOOLCHAIN_EXTERNAL_TAR_OPTIONS = $(TAR_STRIP_COMPONENTS)=1
--exclude='usr/lib/locale/*'
endif

define TOOLCHAIN_EXTERNAL_EXTRACT_CMDS
       mkdir -p $(TOOLCHAIN_EXTERNAL_INSTALL_DIR)
       $(INFLATE$(suffix $(TOOLCHAIN_EXTERNAL_SOURCE)))
$(DL_DIR)/$(TOOLCHAIN_EXTERNAL_SOURCE) | \
               $(TAR) $(TOOLCHAIN_EXTERNAL_TAR_OPTIONS) -C
$(TOOLCHAIN_EXTERNAL_INSTALL_DIR) $(TAR_OPTIONS) -
       if [ -n "$(TOOLCHAIN_EXTERNAL_SOURCE_ADDONS)" ]; then \
           $(INFLATE$(suffix $(TOOLCHAIN_EXTERNAL_SOURCE_ADDONS)))
$(DL_DIR)/$(TOOLCHAIN_EXTERNAL_SOURCE_ADDONS) | \
                   $(TAR) $(TOOLCHAIN_EXTERNAL_TAR_OPTIONS) -C
$(TOOLCHAIN_EXTERNAL_INSTALL_DIR) $(TAR_OPTIONS) - \
       fi
endef


One can even wonder why the 'exclude=' couldn't be used for blackfin,
and why the --hard-dereference couldn't be used for non-blackfin. This
would make the only difference the strip-components.


Best regards,
Thomas



More information about the buildroot mailing list