]> rtime.felk.cvut.cz Git - coffee/buildroot.git/blobdiff - Makefile
lrzsz: install symlinks for XMODEM and YMODEM
[coffee/buildroot.git] / Makefile
index 95ecf3c653d6784b5a08c4f7eb354322e4825028..3415f994bd198a218db21451434e02735f1602b6 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
 #
 # Copyright (C) 1999-2005 by Erik Andersen <andersen@codepoet.org>
 # Copyright (C) 2006-2014 by the Buildroot developers <buildroot@uclibc.org>
-# Copyright (C) 2014-2017 by the Buildroot developers <buildroot@buildroot.org>
+# Copyright (C) 2014-2018 by the Buildroot developers <buildroot@buildroot.org>
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -84,11 +84,12 @@ else # umask / $(CURDIR) / $(O)
 
 # This is our default rule, so must come first
 all:
+.PHONY: all
 
 # Set and export the version string
-export BR2_VERSION := 2017.05-rc1
+export BR2_VERSION := 2018.05-rc2
 # Actual time the release is cut (for reproducible builds)
-BR2_VERSION_EPOCH = 1494230000
+BR2_VERSION_EPOCH = 1527024000
 
 # Save running make version since it's clobbered by the make package
 RUNNING_MAKE_VERSION := $(MAKE_VERSION)
@@ -125,11 +126,11 @@ DATE := $(shell date +%Y%m%d)
 # Need to export it, so it can be got from environment in children (eg. mconf)
 export BR2_VERSION_FULL := $(BR2_VERSION)$(shell $(TOPDIR)/support/scripts/setlocalversion)
 
+# List of targets and target patterns for which .config doesn't need to be read in
 noconfig_targets := menuconfig nconfig gconfig xconfig config oldconfig randconfig \
-       defconfig %_defconfig allyesconfig allnoconfig silentoldconfig release \
+       defconfig %_defconfig allyesconfig allnoconfig alldefconfig silentoldconfig release \
        randpackageconfig allyespackageconfig allnopackageconfig \
-       print-version olddefconfig distclean manual manual-html manual-split-html \
-       manual-pdf manual-text manual-epub
+       print-version olddefconfig distclean manual manual-%
 
 # Some global targets do not trigger a build, but are used to collect
 # metadata, or do various checks. When such targets are triggered,
@@ -140,7 +141,7 @@ noconfig_targets := menuconfig nconfig gconfig xconfig config oldconfig randconf
 # We're building in two situations: when MAKECMDGOALS is empty
 # (default target is to build), or when MAKECMDGOALS contains
 # something else than one of the nobuild_targets.
-nobuild_targets := source %-source source-check \
+nobuild_targets := source %-source \
        legal-info %-legal-info external-deps _external-deps \
        clean distclean help show-targets graph-depends \
        %-graph-depends %-show-depends %-show-version \
@@ -214,7 +215,10 @@ BR_GRAPH_OUT := $(or $(BR2_GRAPH_OUT),pdf)
 
 BUILD_DIR := $(BASE_DIR)/build
 BINARIES_DIR := $(BASE_DIR)/images
-TARGET_DIR := $(BASE_DIR)/target
+# The target directory is common to all packages,
+# but there is one that is specific to each filesystem.
+BASE_TARGET_DIR := $(BASE_DIR)/target
+TARGET_DIR = $(if $(ROOTFS),$(ROOTFS_$(ROOTFS)_TARGET_DIR),$(BASE_TARGET_DIR))
 # initial definition so that 'make clean' works for most users, even without
 # .config. HOST_DIR will be overwritten later when .config is included.
 HOST_DIR := $(BASE_DIR)/host
@@ -230,15 +234,6 @@ LEGAL_MANIFEST_CSV_HOST = $(LEGAL_INFO_DIR)/host-manifest.csv
 LEGAL_WARNINGS = $(LEGAL_INFO_DIR)/.warnings
 LEGAL_REPORT = $(LEGAL_INFO_DIR)/README
 
-################################################################################
-#
-# staging and target directories do NOT list these as
-# dependencies anywhere else
-#
-################################################################################
-$(BUILD_DIR) $(TARGET_DIR) $(HOST_DIR) $(BINARIES_DIR) $(LEGAL_INFO_DIR) $(REDIST_SOURCES_DIR_TARGET) $(REDIST_SOURCES_DIR_HOST):
-       @mkdir -p $@
-
 BR2_CONFIG = $(CONFIG_DIR)/.config
 
 # Pull in the user's configuration file
@@ -252,9 +247,6 @@ export TZ = UTC
 export LANG = C
 export LC_ALL = C
 export GZIP = -n
-BR2_VERSION_GIT_EPOCH = $(shell GIT_DIR=$(TOPDIR)/.git $(GIT) log -1 --format=%at)
-export SOURCE_DATE_EPOCH = $(if $(wildcard $(TOPDIR)/.git),$(BR2_VERSION_GIT_EPOCH),$(BR2_VERSION_EPOCH))
-DEPENDENCIES_HOST_PREREQ += host-fakedate
 endif
 
 # To put more focus on warnings, be less verbose as default
@@ -362,6 +354,22 @@ ifneq ($(firstword $(HOSTCC_VERSION)),4)
 HOSTCC_VERSION := $(firstword $(HOSTCC_VERSION))
 endif
 
+ifeq ($(BR2_NEEDS_HOST_UTF8_LOCALE),y)
+# First, we try to use the user's configured locale (as that's the
+# language they'd expect messages to be displayed), then we favour
+# a non language-specific locale like C.UTF-8 if one is available,
+# so we sort with the C locale to get it at the top.
+# This is guaranteed to not be empty, because of the check in
+# support/dependencies/dependencies.sh
+HOST_UTF8_LOCALE := $(shell \
+                       ( echo $${LC_ALL:-$${LC_MESSAGES:-$${LANG}}}; \
+                         locale -a 2>/dev/null | LC_ALL=C sort \
+                       ) \
+                       | grep -i -E 'utf-?8$$' \
+                       | head -n 1)
+HOST_UTF8_LOCALE_ENV := LC_ALL=$(HOST_UTF8_LOCALE)
+endif
+
 # Make sure pkg-config doesn't look outside the buildroot tree
 HOST_PKG_CONFIG_PATH := $(PKG_CONFIG_PATH)
 unexport PKG_CONFIG_PATH
@@ -421,7 +429,6 @@ KERNEL_ARCH := $(shell echo "$(ARCH)" | sed -e "s/-.*//" \
        -e s/arceb/arc/ \
        -e s/arm.*/arm/ -e s/sa110/arm/ \
        -e s/aarch64.*/arm64/ \
-       -e s/bfin/blackfin/ \
        -e s/or1k/openrisc/ \
        -e s/parisc64/parisc/ \
        -e s/powerpc64.*/powerpc/ \
@@ -438,15 +445,21 @@ TAR_OPTIONS = $(call qstrip,$(BR2_TAR_OPTIONS)) -xf
 # packages compiled for the host go here
 HOST_DIR := $(call qstrip,$(BR2_HOST_DIR))
 
+ifneq ($(HOST_DIR),$(BASE_DIR)/host)
+HOST_DIR_SYMLINK = $(BASE_DIR)/host
+$(HOST_DIR_SYMLINK): $(BASE_DIR)
+       ln -snf $(HOST_DIR) $(BASE_DIR)/host
+endif
+
 # Quotes are needed for spaces and all in the original PATH content.
-BR_PATH = "$(HOST_DIR)/bin:$(HOST_DIR)/sbin:$(HOST_DIR)/usr/bin:$(HOST_DIR)/usr/sbin:$(PATH)"
+BR_PATH = "$(HOST_DIR)/bin:$(HOST_DIR)/sbin:$(PATH)"
 
 # Location of a file giving a big fat warning that output/target
 # should not be used as the root filesystem.
-TARGET_DIR_WARNING_FILE = $(TARGET_DIR)/THIS_IS_NOT_YOUR_ROOT_FILESYSTEM
+TARGET_DIR_WARNING_FILE = $(BASE_TARGET_DIR)/THIS_IS_NOT_YOUR_ROOT_FILESYSTEM
 
 ifeq ($(BR2_CCACHE),y)
-CCACHE := $(HOST_DIR)/usr/bin/ccache
+CCACHE := $(HOST_DIR)/bin/ccache
 BR_CACHE_DIR ?= $(call qstrip,$(BR2_CCACHE_DIR))
 export BR_CACHE_DIR
 HOSTCC := $(CCACHE) $(HOSTCC)
@@ -478,14 +491,23 @@ all: world
 # may rely on it.
 include Makefile.legacy
 
+include system/system.mk
 include package/Makefile.in
 # arch/arch.mk.* must be after package/Makefile.in because it may need to
 # complement variables defined therein, like BR_NO_CHECK_HASH_FOR.
--include $(wildcard arch/arch.mk.*)
+-include $(sort $(wildcard arch/arch.mk.*))
 include support/dependencies/dependencies.mk
 
-include toolchain/*.mk
-include toolchain/*/*.mk
+include $(sort $(wildcard toolchain/*.mk))
+include $(sort $(wildcard toolchain/*/*.mk))
+
+ifeq ($(BR2_REPRODUCIBLE),y)
+# If SOURCE_DATE_EPOCH has not been set then use the commit date, or the last
+# release date if the source tree is not within a Git repository.
+# See: https://reproducible-builds.org/specs/source-date-epoch/
+BR2_VERSION_GIT_EPOCH := $(shell $(GIT) log -1 --format=%at 2> /dev/null)
+export SOURCE_DATE_EPOCH ?= $(or $(BR2_VERSION_GIT_EPOCH),$(BR2_VERSION_EPOCH))
+endif
 
 # Include the package override file if one has been provided in the
 # configuration.
@@ -538,19 +560,27 @@ $(foreach pkg,$(call UPPERCASE,$(PACKAGES)),\
 
 endif
 
-dirs: $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) \
-       $(HOST_DIR) $(BINARIES_DIR)
+.PHONY: dirs
+dirs: $(BUILD_DIR) $(STAGING_DIR) $(BASE_TARGET_DIR) \
+       $(HOST_DIR) $(HOST_DIR_SYMLINK) $(BINARIES_DIR)
 
 $(BUILD_DIR)/buildroot-config/auto.conf: $(BR2_CONFIG)
        $(MAKE1) $(EXTRAMAKEARGS) HOSTCC="$(HOSTCC_NOCCACHE)" HOSTCXX="$(HOSTCXX_NOCCACHE)" silentoldconfig
 
+.PHONY: prepare
 prepare: $(BUILD_DIR)/buildroot-config/auto.conf
 
+.PHONY: world
 world: target-post-image
 
-.PHONY: all world toolchain dirs clean distclean source outputmakefile \
-       legal-info legal-info-prepare legal-info-clean printvars help \
-       list-defconfigs target-finalize target-post-image source-check
+.PHONY: sdk
+sdk: world
+       @$(call MESSAGE,"Rendering the SDK relocatable")
+       $(TOPDIR)/support/scripts/fix-rpath host
+       $(TOPDIR)/support/scripts/fix-rpath staging
+       $(INSTALL) -m 755 $(TOPDIR)/support/misc/relocate-sdk.sh $(HOST_DIR)/relocate-sdk.sh
+       mkdir -p $(HOST_DIR)/share/buildroot
+       echo $(HOST_DIR) > $(HOST_DIR)/share/buildroot/sdk-location
 
 # Populating the staging with the base directories is handled by the skeleton package
 $(STAGING_DIR):
@@ -604,7 +634,7 @@ define GENERATE_GLIBC_LOCALES
                fi ; \
                echo "Generating locale $${inputfile}.$${charmap}" ; \
                I18NPATH=$(STAGING_DIR)/usr/share/i18n:/usr/share/i18n \
-               $(HOST_DIR)/usr/bin/localedef \
+               $(HOST_DIR)/bin/localedef \
                        --prefix=$(TARGET_DIR) \
                        --$(call LOWERCASE,$(BR2_ENDIAN))-endian \
                        -i $${inputfile} -f $${charmap} \
@@ -654,8 +684,16 @@ endif
 
 $(TARGETS_ROOTFS): target-finalize
 
+# Avoid the rootfs name leaking down the dependency chain
+target-finalize: ROOTFS=
+
+.PHONY: target-finalize
 target-finalize: $(PACKAGES)
        @$(call MESSAGE,"Finalizing target directory")
+       # Check files that are touched by more than one package
+       ./support/scripts/check-uniq-files -t target $(BUILD_DIR)/packages-file-list.txt
+       ./support/scripts/check-uniq-files -t staging $(BUILD_DIR)/packages-file-list-staging.txt
+       ./support/scripts/check-uniq-files -t host $(BUILD_DIR)/packages-file-list-host.txt
        $(foreach hook,$(TARGET_FINALIZE_HOOKS),$($(hook))$(sep))
        rm -rf $(TARGET_DIR)/usr/include $(TARGET_DIR)/usr/share/aclocal \
                $(TARGET_DIR)/usr/lib/pkgconfig $(TARGET_DIR)/usr/share/pkgconfig \
@@ -702,7 +740,11 @@ endif
                echo "ID=buildroot"; \
                echo "VERSION_ID=$(BR2_VERSION)"; \
                echo "PRETTY_NAME=\"Buildroot $(BR2_VERSION)\"" \
-       ) >  $(TARGET_DIR)/etc/os-release
+       ) >  $(TARGET_DIR)/usr/lib/os-release
+       ln -sf ../usr/lib/os-release $(TARGET_DIR)/etc
+
+       @$(call MESSAGE,"Sanitizing RPATH in target tree")
+       $(TOPDIR)/support/scripts/fix-rpath target
 
        @$(foreach d, $(call qstrip,$(BR2_ROOTFS_OVERLAY)), \
                $(call MESSAGE,"Copying overlay $(d)"); \
@@ -714,32 +756,38 @@ endif
                $(call MESSAGE,"Executing post-build script $(s)"); \
                $(EXTRA_ENV) $(s) $(TARGET_DIR) $(call qstrip,$(BR2_ROOTFS_POST_SCRIPT_ARGS))$(sep))
 
+       touch $(TARGET_DIR)/usr
+
+.PHONY: target-post-image
 target-post-image: $(TARGETS_ROOTFS) target-finalize
+       @rm -f $(ROOTFS_COMMON_TAR)
        @$(foreach s, $(call qstrip,$(BR2_ROOTFS_POST_IMAGE_SCRIPT)), \
                $(call MESSAGE,"Executing post-image script $(s)"); \
                $(EXTRA_ENV) $(s) $(BINARIES_DIR) $(call qstrip,$(BR2_ROOTFS_POST_SCRIPT_ARGS))$(sep))
 
+.PHONY: source
 source: $(foreach p,$(PACKAGES),$(p)-all-source)
 
+.PHONY: _external-deps external-deps
 _external-deps: $(foreach p,$(PACKAGES),$(p)-all-external-deps)
 external-deps:
        @$(MAKE1) -Bs $(EXTRAMAKEARGS) _external-deps | sort -u
 
-# check if download URLs are outdated
-source-check: $(foreach p,$(PACKAGES),$(p)-all-source-check)
-
+.PHONY: legal-info-clean
 legal-info-clean:
        @rm -fr $(LEGAL_INFO_DIR)
 
+.PHONY: legal-info-prepare
 legal-info-prepare: $(LEGAL_INFO_DIR)
-       @$(call MESSAGE,"Collecting legal info")
-       @$(call legal-license-file,buildroot,COPYING,COPYING,HOST)
+       @$(call MESSAGE,"Buildroot $(BR2_VERSION_FULL) Collecting legal info")
+       @$(call legal-license-file,buildroot,buildroot,support/legal-info,COPYING,COPYING,HOST)
        @$(call legal-manifest,PACKAGE,VERSION,LICENSE,LICENSE FILES,SOURCE ARCHIVE,SOURCE SITE,TARGET)
        @$(call legal-manifest,PACKAGE,VERSION,LICENSE,LICENSE FILES,SOURCE ARCHIVE,SOURCE SITE,HOST)
        @$(call legal-manifest,buildroot,$(BR2_VERSION_FULL),GPL-2.0+,COPYING,not saved,not saved,HOST)
        @$(call legal-warning,the Buildroot source code has not been saved)
        @cp $(BR2_CONFIG) $(LEGAL_INFO_DIR)/buildroot.config
 
+.PHONY: legal-info
 legal-info: dirs legal-info-clean legal-info-prepare $(foreach p,$(PACKAGES),$(p)-all-legal-info) \
                $(REDIST_SOURCES_DIR_TARGET) $(REDIST_SOURCES_DIR_HOST)
        @cat support/legal-info/README.header >>$(LEGAL_REPORT)
@@ -754,11 +802,14 @@ legal-info: dirs legal-info-clean legal-info-prepare $(foreach p,$(PACKAGES),$(p
                mv .legal-info.sha256 legal-info.sha256)
        @echo "Legal info produced in $(LEGAL_INFO_DIR)"
 
+.PHONY: show-targets
 show-targets:
-       @echo $(PACKAGES) $(TARGETS_ROOTFS)
+       @echo $(sort $(PACKAGES)) $(sort $(TARGETS_ROOTFS))
 
+.PHONY: show-build-order
 show-build-order: $(patsubst %,%-show-build-order,$(PACKAGES))
 
+.PHONY: graph-build
 graph-build: $(O)/build/build-time.log
        @install -d $(GRAPHS_DIR)
        $(foreach o,name build duration,./support/scripts/graph-build-time \
@@ -770,10 +821,12 @@ graph-build: $(O)/build/build-time.log
                                   --output=$(GRAPHS_DIR)/build.pie-$(t).$(BR_GRAPH_OUT) \
                                   $(if $(BR2_GRAPH_ALT),--alternate-colors)$(sep))
 
+.PHONY: graph-depends-requirements
 graph-depends-requirements:
        @dot -? >/dev/null 2>&1 || \
                { echo "ERROR: The 'dot' program from Graphviz is needed for graph-depends" >&2; exit 1; }
 
+.PHONY: graph-depends
 graph-depends: graph-depends-requirements
        @$(INSTALL) -d $(GRAPHS_DIR)
        @cd "$(CONFIG_DIR)"; \
@@ -783,6 +836,7 @@ graph-depends: graph-depends-requirements
                -o $(GRAPHS_DIR)/$(@).$(BR_GRAPH_OUT) \
                $(GRAPHS_DIR)/$(@).dot
 
+.PHONY: graph-size
 graph-size:
        $(Q)mkdir -p $(GRAPHS_DIR)
        $(Q)$(TOPDIR)/support/scripts/size-stats --builddir $(BASE_DIR) \
@@ -790,13 +844,21 @@ graph-size:
                --file-size-csv $(GRAPHS_DIR)/file-size-stats.csv \
                --package-size-csv $(GRAPHS_DIR)/package-size-stats.csv
 
+.PHONY: check-dependencies
 check-dependencies:
        @cd "$(CONFIG_DIR)"; \
        $(TOPDIR)/support/scripts/graph-depends -C
 
 else # ifeq ($(BR2_HAVE_DOT_CONFIG),y)
 
-all: menuconfig
+# Some subdirectories are also package names. To avoid that "make linux"
+# on an unconfigured tree produces "Nothing to be done", add an explicit
+# rule for it.
+# Also for 'all' we error out and ask the user to configure first.
+.PHONY: linux toolchain
+linux toolchain all: outputmakefile
+       $(error Please configure Buildroot first (e.g. "make menuconfig"))
+       @exit 1
 
 endif # ifeq ($(BR2_HAVE_DOT_CONFIG),y)
 
@@ -848,50 +910,20 @@ config: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
 # no values are set for the legacy options so a subsequent oldconfig
 # will query them. Therefore, run an additional olddefconfig.
 
-oldconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
-       @$(COMMON_CONFIG_ENV) $< --oldconfig $(CONFIG_CONFIG_IN)
-
-randconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
-       @$(COMMON_CONFIG_ENV) SKIP_LEGACY=y $< --randconfig $(CONFIG_CONFIG_IN)
+randconfig allyesconfig alldefconfig allnoconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
+       @$(COMMON_CONFIG_ENV) SKIP_LEGACY=y $< --$@ $(CONFIG_CONFIG_IN)
        @$(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN) >/dev/null
 
-allyesconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
-       @$(COMMON_CONFIG_ENV) SKIP_LEGACY=y $< --allyesconfig $(CONFIG_CONFIG_IN)
-       @$(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN) >/dev/null
-
-allnoconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
-       @$(COMMON_CONFIG_ENV) SKIP_LEGACY=y $< --allnoconfig $(CONFIG_CONFIG_IN)
-       @$(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN) >/dev/null
-
-randpackageconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
-       @grep -v BR2_PACKAGE_ $(BR2_CONFIG) > $(CONFIG_DIR)/.config.nopkg
-       @$(COMMON_CONFIG_ENV) SKIP_LEGACY=y \
-               KCONFIG_ALLCONFIG=$(CONFIG_DIR)/.config.nopkg \
-               $< --randconfig $(CONFIG_CONFIG_IN)
-       @rm -f $(CONFIG_DIR)/.config.nopkg
-       @$(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN) >/dev/null
-
-allyespackageconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
-       @grep -v BR2_PACKAGE_ $(BR2_CONFIG) > $(CONFIG_DIR)/.config.nopkg
-       @$(COMMON_CONFIG_ENV) SKIP_LEGACY=y \
-               KCONFIG_ALLCONFIG=$(CONFIG_DIR)/.config.nopkg \
-               $< --allyesconfig $(CONFIG_CONFIG_IN)
-       @rm -f $(CONFIG_DIR)/.config.nopkg
-       @$(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN) >/dev/null
-
-allnopackageconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
+randpackageconfig allyespackageconfig allnopackageconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
        @grep -v BR2_PACKAGE_ $(BR2_CONFIG) > $(CONFIG_DIR)/.config.nopkg
        @$(COMMON_CONFIG_ENV) SKIP_LEGACY=y \
                KCONFIG_ALLCONFIG=$(CONFIG_DIR)/.config.nopkg \
-               $< --allnoconfig $(CONFIG_CONFIG_IN)
+               $< --$(subst package,,$@) $(CONFIG_CONFIG_IN)
        @rm -f $(CONFIG_DIR)/.config.nopkg
        @$(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN) >/dev/null
 
-silentoldconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
-       $(COMMON_CONFIG_ENV) $< --silentoldconfig $(CONFIG_CONFIG_IN)
-
-olddefconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
-       $(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN)
+oldconfig silentoldconfig olddefconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
+       @$(COMMON_CONFIG_ENV) $< --$@ $(CONFIG_CONFIG_IN)
 
 defconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
        @$(COMMON_CONFIG_ENV) $< --defconfig$(if $(DEFCONFIG),=$(DEFCONFIG)) $(CONFIG_CONFIG_IN)
@@ -918,9 +950,15 @@ savedefconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig
 #
 ################################################################################
 
+# staging and target directories do NOT list these as
+# dependencies anywhere else
+$(BUILD_DIR) $(BASE_TARGET_DIR) $(HOST_DIR) $(BINARIES_DIR) $(LEGAL_INFO_DIR) $(REDIST_SOURCES_DIR_TARGET) $(REDIST_SOURCES_DIR_HOST):
+       @mkdir -p $@
+
 # outputmakefile generates a Makefile in the output directory, if using a
 # separate output directory. This allows convenient use of make in the
 # output directory.
+.PHONY: outputmakefile
 outputmakefile:
 ifeq ($(NEED_WRAPPER),y)
        $(Q)$(TOPDIR)/support/scripts/mkmakefile $(TOPDIR) $(O)
@@ -937,8 +975,9 @@ $(BUILD_DIR)/.br2-external.in: $(BUILD_DIR)
 # Makefiles. Alternatively, if a non-empty VARS variable is passed,
 # only the variables matching the make pattern passed in VARS are
 # displayed.
+.PHONY: printvars
 printvars:
-       @$(foreach V, \
+       @:$(foreach V, \
                $(sort $(if $(VARS),$(filter $(VARS),$(.VARIABLES)),$(.VARIABLES))), \
                $(if $(filter-out environment% default automatic, \
                                $(origin $V)), \
@@ -947,11 +986,13 @@ printvars:
                        $(info $V=$(if $(RAW_VARS),$(value $V),$($V))))))
 # ' Syntax colouring...
 
+.PHONY: clean
 clean:
-       rm -rf $(TARGET_DIR) $(BINARIES_DIR) $(HOST_DIR) \
+       rm -rf $(BASE_TARGET_DIR) $(BINARIES_DIR) $(HOST_DIR) $(HOST_DIR_SYMLINK) \
                $(BUILD_DIR) $(BASE_DIR)/staging \
                $(LEGAL_INFO_DIR) $(GRAPHS_DIR)
 
+.PHONY: distclean
 distclean: clean
 ifeq ($(O),$(CURDIR)/output)
        rm -rf $(O)
@@ -959,6 +1000,7 @@ endif
        rm -rf $(TOPDIR)/dl $(BR2_CONFIG) $(CONFIG_DIR)/.config.old $(CONFIG_DIR)/..config.tmp \
                $(CONFIG_DIR)/.auto.deps $(BR2_EXTERNAL_FILE)
 
+.PHONY: help
 help:
        @echo 'Cleaning:'
        @echo '  clean                  - delete all files created by build'
@@ -967,6 +1009,7 @@ help:
        @echo 'Build:'
        @echo '  all                    - make world'
        @echo '  toolchain              - build toolchain'
+       @echo '  sdk                    - build relocatable SDK'
        @echo
        @echo 'Configuration:'
        @echo '  menuconfig             - interactive curses-based configurator'
@@ -982,6 +1025,7 @@ help:
        @echo '  savedefconfig          - Save current config to BR2_DEFCONFIG (minimal config)'
        @echo '  allyesconfig           - New config where all options are accepted with yes'
        @echo '  allnoconfig            - New config where all options are answered with no'
+       @echo '  alldefconfig           - New config where all options are set to default'
        @echo '  randpackageconfig      - New config with random answer to package options'
        @echo '  allyespackageconfig    - New config where pkg options are accepted with yes'
        @echo '  allnopackageconfig     - New config where package options are answered with no'
@@ -996,6 +1040,10 @@ help:
        @echo '  <pkg>-build            - Build <pkg> up to the build step'
        @echo '  <pkg>-show-depends     - List packages on which <pkg> depends'
        @echo '  <pkg>-show-rdepends    - List packages which have <pkg> as a dependency'
+       @echo '  <pkg>-show-recursive-depends'
+       @echo '                         - Recursively list packages on which <pkg> depends'
+       @echo '  <pkg>-show-recursive-rdepends'
+       @echo '                         - Recursively list packages which have <pkg> as a dependency'
        @echo '  <pkg>-graph-depends    - Generate a graph of <pkg>'\''s dependencies'
        @echo '  <pkg>-graph-rdepends   - Generate a graph of <pkg>'\''s reverse dependencies'
        @echo '  <pkg>-dirclean         - Remove <pkg> build directory'
@@ -1020,7 +1068,6 @@ help:
        @echo
        @echo 'Miscellaneous:'
        @echo '  source                 - download all sources needed for offline-build'
-       @echo '  source-check           - check selected packages for valid download URLs'
        @echo '  external-deps          - list external packages used'
        @echo '  legal-info             - generate info about license compliance'
        @echo '  printvars              - dump all the internal variables'
@@ -1055,6 +1102,7 @@ endef
 
 # We iterate over BR2_EXTERNAL_NAMES rather than BR2_EXTERNAL_DIRS,
 # because we want to display the name of the br2-external tree.
+.PHONY: list-defconfigs
 list-defconfigs:
        $(call list-defconfigs,$(TOPDIR))
        $(foreach name,$(BR2_EXTERNAL_NAMES),\
@@ -1077,11 +1125,14 @@ release:
 print-version:
        @echo $(BR2_VERSION_FULL)
 
-.gitlab-ci.yml: .gitlab-ci.yml.in configs/*_defconfig
-       (cd configs; LC_ALL=C ls -1 *_defconfig) | sed 's/$$/: *defconfig/' | cat $< - > $@
+.PHONY: .gitlab-ci.yml
+.gitlab-ci.yml: .gitlab-ci.yml.in
+       cp $< $@
+       (cd configs; LC_ALL=C ls -1 *_defconfig) | sed 's/$$/: *defconfig/' >> $@
+       ./support/testing/run-tests -l 2>&1 | sed -r -e '/^test_run \((.*)\).*/!d; s//\1: *runtime_test/' | LC_ALL=C sort >> $@
 
 include docs/manual/manual.mk
--include $(foreach dir,$(BR2_EXTERNAL_DIRS),$(dir)/docs/*/*.mk)
+-include $(foreach dir,$(BR2_EXTERNAL_DIRS),$(sort $(wildcard $(dir)/docs/*/*.mk)))
 
 .PHONY: $(noconfig_targets)