X-Git-Url: https://rtime.felk.cvut.cz/gitweb/coffee/buildroot.git/blobdiff_plain/8efa2d8de920228130235ad6c0a2aeb19a6ae4be..d5a63f48d71c519736e6378cadedd4f639de16fe:/Makefile diff --git a/Makefile b/Makefile index cceae92a26..5fe3a34c47 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # # Copyright (C) 1999-2005 by Erik Andersen # Copyright (C) 2006-2014 by the Buildroot developers -# Copyright (C) 2014-2017 by the Buildroot developers +# Copyright (C) 2014-2018 by the Buildroot developers # # 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-git +export BR2_VERSION := 2018.02-rc3 # Actual time the release is cut (for reproducible builds) -BR2_VERSION_EPOCH = 1488315000 +BR2_VERSION_EPOCH = 1519768000 # 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 \ @@ -253,7 +254,7 @@ 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)) +export SOURCE_DATE_EPOCH ?= $(if $(wildcard $(TOPDIR)/.git),$(BR2_VERSION_GIT_EPOCH),$(BR2_VERSION_EPOCH)) DEPENDENCIES_HOST_PREREQ += host-fakedate endif @@ -439,14 +440,14 @@ TAR_OPTIONS = $(call qstrip,$(BR2_TAR_OPTIONS)) -xf HOST_DIR := $(call qstrip,$(BR2_HOST_DIR)) # 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 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 +479,17 @@ 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 +PACKAGES += $(DEPENDENCIES_HOST_PREREQ) + +include $(sort $(wildcard toolchain/*.mk)) +include $(sort $(wildcard toolchain/*/*.mk)) # Include the package override file if one has been provided in the # configuration. @@ -538,19 +542,37 @@ $(foreach pkg,$(call UPPERCASE,$(PACKAGES)),\ endif +.PHONY: dirs dirs: $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) \ - $(HOST_DIR) $(BINARIES_DIR) + $(HOST_DIR) $(HOST_DIR)/usr $(HOST_DIR)/lib $(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 + echo $(HOST_DIR) > $(HOST_DIR)/share/buildroot/sdk-location + +# Compatibility symlink in case a post-build script still uses $(HOST_DIR)/usr +$(HOST_DIR)/usr: $(HOST_DIR) + @ln -snf . $@ + +$(HOST_DIR)/lib: $(HOST_DIR) + @mkdir -p $@ + @case $(HOSTARCH) in \ + (*64) ln -snf lib $(@D)/lib64;; \ + (*) ln -snf lib $(@D)/lib32;; \ + esac # Populating the staging with the base directories is handled by the skeleton package $(STAGING_DIR): @@ -604,7 +626,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 +676,13 @@ endif $(TARGETS_ROOTFS): target-finalize +.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 +729,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 +745,35 @@ endif $(call MESSAGE,"Executing post-build script $(s)"); \ $(EXTRA_ENV) $(s) $(TARGET_DIR) $(call qstrip,$(BR2_ROOTFS_POST_SCRIPT_ARGS))$(sep)) +.PHONY: target-post-image target-post-image: $(TARGETS_ROOTFS) target-finalize @$(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),GPLv2+,COPYING,not saved,not saved,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,9 +788,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 \ @@ -768,10 +807,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)"; \ @@ -781,6 +822,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) \ @@ -788,13 +830,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) @@ -846,50 +896,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) - @$(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) +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 -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 +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 \ - $< --randconfig $(CONFIG_CONFIG_IN) + $< --$(subst package,,$@) $(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 - @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) - @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) @@ -919,6 +939,7 @@ savedefconfig: $(BUILD_DIR)/buildroot-config/conf prepare-kconfig # 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) @@ -935,18 +956,24 @@ $(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)), \ - $(info $V=$($V) ($(value $V))))) + $(if $(QUOTED_VARS),\ + $(info $V='$(subst ','\'',$(if $(RAW_VARS),$(value $V),$($V)))'), \ + $(info $V=$(if $(RAW_VARS),$(value $V),$($V)))))) +# ' Syntax colouring... +.PHONY: clean clean: rm -rf $(TARGET_DIR) $(BINARIES_DIR) $(HOST_DIR) \ $(BUILD_DIR) $(BASE_DIR)/staging \ $(LEGAL_INFO_DIR) $(GRAPHS_DIR) +.PHONY: distclean distclean: clean ifeq ($(O),$(CURDIR)/output) rm -rf $(O) @@ -954,6 +981,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' @@ -962,6 +990,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' @@ -977,6 +1006,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' @@ -1015,9 +1045,9 @@ 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' @echo @echo ' make V=0|1 - 0 => quiet build (default), 1 => verbose build' @echo ' make O=dir - Locate all output files in "dir", including .config' @@ -1049,6 +1079,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),\ @@ -1071,11 +1102,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)