Как изменить опцию компилятора G CC? - PullRequest
1 голос
/ 05 мая 2020

Я наблюдаю с помощью следующей команды:

$ gcc -v

Что мой компилятор по умолчанию генерирует P IE (независимый от позиции исполняемый файл). Я хочу отключить эту опцию, потому что моя ОС неверно определяет ELF-файл, когда эта опция включена. Кто-нибудь знает как это сделать ? Вот Makefile из сборки root 2020.02.01 Я использую

.SUFFIXES:
SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
     else if [ -x /bin/bash ]; then echo /bin/bash; \
     else echo sh; fi; fi)

ifneq ("$(origin O)", "command line")
O := $(CURDIR)/output
endif

override O := $(patsubst %/,%,$(patsubst %.,%,$(O)))
CANONICAL_O := $(shell mkdir -p $(O) >/dev/null 2>&1)$(realpath $(O))

ifneq ($(findstring @,$(CANONICAL_O)),)
$(error The build directory can not contain a '@')
endif

CANONICAL_CURDIR = $(realpath $(CURDIR))

REQ_UMASK = 0022

EXTRAMAKEARGS := O=$(CANONICAL_O)

ifneq ($(shell umask):$(CURDIR):$(O),$(REQ_UMASK):$(CANONICAL_CURDIR):$(CANONICAL_O))
.PHONY: _all $(MAKECMDGOALS)

$(MAKECMDGOALS): _all
    @:

_all:
    @umask $(REQ_UMASK) && \
        $(MAKE) -C $(CANONICAL_CURDIR) --no-print-directory \
            $(MAKECMDGOALS) $(EXTRAMAKEARGS)

else
all:
.PHONY: all

export BR2_VERSION := 2020.02.1
BR2_VERSION_EPOCH = 1586551000

RUNNING_MAKE_VERSION := $(MAKE_VERSION)
MIN_MAKE_VERSION = 3.81
ifneq ($(firstword $(sort $(RUNNING_MAKE_VERSION) $(MIN_MAKE_VERSION))),$(MIN_MAKE_VERSION))
$(error You have make '$(RUNNING_MAKE_VERSION)' installed. GNU make >= $(MIN_MAKE_VERSION) is required)
endif
TOPDIR := $(CURDIR)
CONFIG_CONFIG_IN = Config.in
CONFIG = support/kconfig
DATE := $(shell date +%Y%m%d)

export BR2_VERSION_FULL := $(BR2_VERSION)$(shell $(TOPDIR)/support/scripts/setlocalversion)

noconfig_targets := menuconfig nconfig gconfig xconfig config oldconfig randconfig \
    defconfig %_defconfig allyesconfig allnoconfig alldefconfig syncconfig release \
    randpackageconfig allyespackageconfig allnopackageconfig \
    print-version olddefconfig distclean manual manual-% check-package

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 \
    graph-build graph-size list-defconfigs \
    savedefconfig update-defconfig printvars
ifeq ($(MAKECMDGOALS),)
BR_BUILDING = y
else ifneq ($(filter-out $(nobuild_targets),$(MAKECMDGOALS)),)
BR_BUILDING = y
endif

MAKEOVERRIDES :=


include support/misc/utils.mk


ifeq ($(O),$(CURDIR)/output)
CONFIG_DIR := $(CURDIR)
NEED_WRAPPER =
else
CONFIG_DIR := $(O)
NEED_WRAPPER = y
endif

export CDPATH :=

BASE_DIR := $(CANONICAL_O)
$(if $(BASE_DIR),, $(error output directory "$(O)" does not exist))


BR2_EXTERNAL_FILE = $(BASE_DIR)/.br2-external.mk
-include $(BR2_EXTERNAL_FILE)
$(shell support/scripts/br2-external -d '$(BASE_DIR)' $(BR2_EXTERNAL))
BR2_EXTERNAL_ERROR =
include $(BR2_EXTERNAL_FILE)
ifneq ($(BR2_EXTERNAL_ERROR),)
$(error $(BR2_EXTERNAL_ERROR))
endif


$(BASE_DIR)/.br2-external.mk:;

ifneq ($(BR2_DL_DIR),)
DL_DIR := $(BR2_DL_DIR)
endif
ifneq ($(BR2_CCACHE_DIR),)
BR_CACHE_DIR := $(BR2_CCACHE_DIR)
endif

BR_GRAPH_OUT := $(or $(BR2_GRAPH_OUT),pdf)

BUILD_DIR := $(BASE_DIR)/build
BINARIES_DIR := $(BASE_DIR)/images
BASE_TARGET_DIR := $(BASE_DIR)/target
PER_PACKAGE_DIR := $(BASE_DIR)/per-package
HOST_DIR := $(BASE_DIR)/host
GRAPHS_DIR := $(BASE_DIR)/graphs

LEGAL_INFO_DIR = $(BASE_DIR)/legal-info
REDIST_SOURCES_DIR_TARGET = $(LEGAL_INFO_DIR)/sources
REDIST_SOURCES_DIR_HOST = $(LEGAL_INFO_DIR)/host-sources
LICENSE_FILES_DIR_TARGET = $(LEGAL_INFO_DIR)/licenses
LICENSE_FILES_DIR_HOST = $(LEGAL_INFO_DIR)/host-licenses
LEGAL_MANIFEST_CSV_TARGET = $(LEGAL_INFO_DIR)/manifest.csv
LEGAL_MANIFEST_CSV_HOST = $(LEGAL_INFO_DIR)/host-manifest.csv
LEGAL_WARNINGS = $(LEGAL_INFO_DIR)/.warnings
LEGAL_REPORT = $(LEGAL_INFO_DIR)/README

CUSTOM_DIR = $(call qstrip,$(BR2_CUSTOM_DIR))

BR2_CONFIG = $(CONFIG_DIR)/.config

ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)
-include $(BR2_CONFIG)
endif

ifeq ($(BR2_PER_PACKAGE_DIRECTORIES),)
.NOTPARALLEL:
endif


ifeq ($(BR2_REPRODUCIBLE),y)
export TZ = UTC
export LANG = C
export LC_ALL = C
endif


ifeq ("$(origin V)", "command line")
  KBUILD_VERBOSE = $(V)
endif
ifndef KBUILD_VERBOSE
  KBUILD_VERBOSE = 0
endif

ifeq ($(KBUILD_VERBOSE),1)
  Q =
ifndef VERBOSE
  VERBOSE = 1
endif
export VERBOSE
else
  Q = @
endif


CONFIG_SHELL := $(SHELL)

export SHELL CONFIG_SHELL Q KBUILD_VERBOSE

ifndef HOSTAR
HOSTAR := ar
endif
ifndef HOSTAS
HOSTAS := as
endif
ifndef HOSTCC
HOSTCC := gcc
HOSTCC := $(shell which $(HOSTCC) || type -p $(HOSTCC) || echo gcc)
endif
HOSTCC_NOCCACHE := $(HOSTCC)
ifndef HOSTCXX
HOSTCXX := g++
HOSTCXX := $(shell which $(HOSTCXX) || type -p $(HOSTCXX) || echo g++)
endif
HOSTCXX_NOCCACHE := $(HOSTCXX)
ifndef HOSTCPP
HOSTCPP := cpp
endif
ifndef HOSTLD
HOSTLD := ld
endif
ifndef HOSTLN
HOSTLN := ln
endif
ifndef HOSTNM
HOSTNM := nm
endif
ifndef HOSTOBJCOPY
HOSTOBJCOPY := objcopy
endif
ifndef HOSTRANLIB
HOSTRANLIB := ranlib
endif
HOSTAR := $(shell which $(HOSTAR) || type -p $(HOSTAR) || echo ar)
HOSTAS := $(shell which $(HOSTAS) || type -p $(HOSTAS) || echo as)
HOSTCPP := $(shell which $(HOSTCPP) || type -p $(HOSTCPP) || echo cpp)
HOSTLD := $(shell which $(HOSTLD) || type -p $(HOSTLD) || echo ld)
HOSTLN := $(shell which $(HOSTLN) || type -p $(HOSTLN) || echo ln)
HOSTNM := $(shell which $(HOSTNM) || type -p $(HOSTNM) || echo nm)
HOSTOBJCOPY := $(shell which $(HOSTOBJCOPY) || type -p $(HOSTOBJCOPY) || echo objcopy)
HOSTRANLIB := $(shell which $(HOSTRANLIB) || type -p $(HOSTRANLIB) || echo ranlib)
SED := $(shell which sed || type -p sed) -i -e

export HOSTAR HOSTAS HOSTCC HOSTCXX HOSTLD
export HOSTCC_NOCCACHE HOSTCXX_NOCCACHE

export HOSTARCH := $(shell LC_ALL=C $(HOSTCC_NOCCACHE) -v 2>&1 | \
    sed -e '/^Target: \([^-]*\).*/!d' \
        -e 's//\1/' \
        -e 's/i.86/x86/' \
        -e 's/sun4u/sparc64/' \
        -e 's/arm.*/arm/' \
        -e 's/sa110/arm/' \
        -e 's/ppc64/powerpc64/' \
        -e 's/ppc/powerpc/' \
        -e 's/macppc/powerpc/' \
        -e 's/sh.*/sh/' )

HOSTCC_MAX_VERSION := 9

HOSTCC_VERSION := $(shell V=$$($(HOSTCC_NOCCACHE) --version | \
    sed -n -r 's/^.* ([0-9]*)\.([0-9]*)\.([0-9]*)[ ]*.*/\1 \2/p'); \
    [ "$${V%% *}" -le $(HOSTCC_MAX_VERSION) ] || V=$(HOSTCC_MAX_VERSION); \
    printf "%s" "$${V}")


ifneq ($(firstword $(HOSTCC_VERSION)),4)
HOSTCC_VERSION := $(firstword $(HOSTCC_VERSION))
endif

ifeq ($(BR2_NEEDS_HOST_UTF8_LOCALE),y)

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


HOST_PKG_CONFIG_PATH := $(PKG_CONFIG_PATH)
unexport PKG_CONFIG_PATH
unexport PKG_CONFIG_SYSROOT_DIR
unexport PKG_CONFIG_LIBDIR

unexport DESTDIR

unexport RUBYOPT

include package/pkg-utils.mk
include package/doc-asciidoc.mk

ifeq ($(BR2_HAVE_DOT_CONFIG),y)

unexport CROSS_COMPILE
unexport ARCH
unexport CC
unexport LD
unexport AR
unexport CXX
unexport CPP
unexport RANLIB
unexport CFLAGS
unexport CXXFLAGS
unexport GREP_OPTIONS
unexport TAR_OPTIONS
unexport CONFIG_SITE
unexport QMAKESPEC
unexport TERMINFO
unexport MACHINE
unexport O
unexport GCC_COLORS
unexport PLATFORM
unexport OS

GNU_HOST_NAME := $(shell support/gnuconfig/config.guess)

PACKAGES :=
PACKAGES_ALL :=

QUIET := $(if $(findstring s,$(filter-out --%,$(MAKEFLAGS))),-q)

ARCH := $(call qstrip,$(BR2_ARCH))

KERNEL_ARCH := $(shell echo "$(ARCH)" | sed -e "s/-.*//" \
    -e s/i.86/i386/ -e s/sun4u/sparc64/ \
    -e s/arcle/arc/ \
    -e s/arceb/arc/ \
    -e s/arm.*/arm/ -e s/sa110/arm/ \
    -e s/aarch64.*/arm64/ \
    -e s/nds32.*/nds32/ \
    -e s/or1k/openrisc/ \
    -e s/parisc64/parisc/ \
    -e s/powerpc64.*/powerpc/ \
    -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
    -e s/riscv.*/riscv/ \
    -e s/sh.*/sh/ \
    -e s/microblazeel/microblaze/)

ZCAT := $(call qstrip,$(BR2_ZCAT))
BZCAT := $(call qstrip,$(BR2_BZCAT))
XZCAT := $(call qstrip,$(BR2_XZCAT))
LZCAT := $(call qstrip,$(BR2_LZCAT))
TAR_OPTIONS = $(call qstrip,$(BR2_TAR_OPTIONS)) -xf

ifeq ($(BR2_PER_PACKAGE_DIRECTORIES),y)
HOST_DIR = $(if $(PKG),$(PER_PACKAGE_DIR)/$($(PKG)_NAME)/host,$(call qstrip,$(BR2_HOST_DIR)))
TARGET_DIR = $(if $(ROOTFS),$(ROOTFS_$(ROOTFS)_TARGET_DIR),$(if $(PKG),$(PER_PACKAGE_DIR)/$($(PKG)_NAME)/target,$(BASE_TARGET_DIR)))
else
HOST_DIR := $(call qstrip,$(BR2_HOST_DIR))
TARGET_DIR = $(if $(ROOTFS),$(ROOTFS_$(ROOTFS)_TARGET_DIR),$(BASE_TARGET_DIR))
endif

ifneq ($(HOST_DIR),$(BASE_DIR)/host)
HOST_DIR_SYMLINK = $(BASE_DIR)/host
$(HOST_DIR_SYMLINK): $(BASE_DIR)
    ln -snf $(HOST_DIR) $(HOST_DIR_SYMLINK)
endif

STAGING_DIR_SYMLINK = $(BASE_DIR)/staging
$(STAGING_DIR_SYMLINK): $(BASE_DIR)
    ln -snf $(STAGING_DIR) $(STAGING_DIR_SYMLINK)


BR_PATH = "$(HOST_DIR)/bin:$(HOST_DIR)/sbin:$(PATH)"

TARGET_DIR_WARNING_FILE = $(TARGET_DIR)/THIS_IS_NOT_YOUR_ROOT_FILESYSTEM

ifeq ($(BR2_CCACHE),y)
CCACHE = $(HOST_DIR)/bin/ccache
BR_CACHE_DIR ?= $(call qstrip,$(BR2_CCACHE_DIR))
export BR_CACHE_DIR
HOSTCC = $(CCACHE) $(HOSTCC_NOCCACHE)
HOSTCXX = $(CCACHE) $(HOSTCXX_NOCCACHE)
else
export BR_NO_CCACHE
endif

export BR2_CONFIG
export BR2_REPRODUCIBLE
export TARGET_DIR
export STAGING_DIR
export HOST_DIR
export BINARIES_DIR
export BASE_DIR

all: world

include Makefile.legacy

include system/system.mk
include package/Makefile.in
include arch/arch.mk
include support/dependencies/dependencies.mk

include $(sort $(wildcard toolchain/*.mk))
include $(sort $(wildcard toolchain/*/*.mk))

ifeq ($(BR2_REPRODUCIBLE),y)
ifeq ($(BR2_REPRODUCIBLE_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))
else
export SOURCE_DATE_EPOCH = $(shell date -d $(BR2_REPRODUCIBLE_SOURCE_DATE_EPOCH) +%s)
export BR2_VERSION_FULL := $(BR2_VERSION)-$(shell date -d @$(SOURCE_DATE_EPOCH) +%Y%m%d)
endif
endif

PACKAGE_OVERRIDE_FILE = $(call qstrip,$(BR2_PACKAGE_OVERRIDE_FILE))
ifneq ($(PACKAGE_OVERRIDE_FILE),)
-include $(PACKAGE_OVERRIDE_FILE)
endif

include $(sort $(wildcard package/*/*.mk))

include boot/common.mk
include linux/linux.mk
include fs/common.mk

include $(BR2_EXTERNAL_FILE)

include $(BR2_EXTERNAL_MKS)

ifeq ($(MAKECMDGOALS),)
BR_FORCE_CHECK_DEPENDENCIES = YES
endif

ifeq ($(BR_FORCE_CHECK_DEPENDENCIES),YES)

define CHECK_ONE_DEPENDENCY
ifeq ($$($(2)_TYPE),target)
ifeq ($$($(2)_IS_VIRTUAL),)
ifneq ($$($$($(2)_KCONFIG_VAR)),y)
$$(error $$($(2)_NAME) is in the dependency chain of $$($(1)_NAME) that \
has added it to its _DEPENDENCIES variable without selecting it or \
depending on it from Config.in)
endif
endif
endif
endef

$(foreach pkg,$(call UPPERCASE,$(PACKAGES)),\
    $(foreach dep,$(call UPPERCASE,$($(pkg)_FINAL_ALL_DEPENDENCIES)),\
        $(eval $(call CHECK_ONE_DEPENDENCY,$(pkg),$(dep))$(sep))))

endif

$(BUILD_DIR)/buildroot-config/auto.conf: $(BR2_CONFIG)
    $(MAKE1) $(EXTRAMAKEARGS) HOSTCC="$(HOSTCC_NOCCACHE)" HOSTCXX="$(HOSTCXX_NOCCACHE)" syncconfig

.PHONY: prepare
prepare: $(BUILD_DIR)/buildroot-config/auto.conf

.PHONY: world
world: target-post-image

.PHONY: prepare-sdk
prepare-sdk: world
    @$(call MESSAGE,"Rendering the SDK relocatable")
    PER_PACKAGE_DIR=$(PER_PACKAGE_DIR) $(TOPDIR)/support/scripts/fix-rpath host
    PER_PACKAGE_DIR=$(PER_PACKAGE_DIR) $(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

BR2_SDK_PREFIX ?= $(GNU_TARGET_NAME)_sdk-buildroot
.PHONY: sdk
sdk: prepare-sdk $(BR2_TAR_HOST_DEPENDENCY)
    @$(call MESSAGE,"Generating SDK tarball")
    $(if $(BR2_SDK_PREFIX),,$(error BR2_SDK_PREFIX can not be empty))
    $(Q)mkdir -p $(BINARIES_DIR)
    $(TAR) czf "$(BINARIES_DIR)/$(BR2_SDK_PREFIX).tar.gz" \
        --owner=0 --group=0 --numeric-owner \
        --transform='s#^$(patsubst /%,%,$(HOST_DIR))#$(BR2_SDK_PREFIX)#' \
        -C / $(patsubst /%,%,$(HOST_DIR))

RSYNC_VCS_EXCLUSIONS = \
    --exclude .svn --exclude .git --exclude .hg --exclude .bzr \
    --exclude CVS

STRIP_FIND_COMMON_CMD = \
    find $(TARGET_DIR) \
    $(if $(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS)), \
        \( $(call finddirclauses,$(TARGET_DIR),$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))) \) \
        -prune -o \
    ) \
    $(if $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES)), \
        -not \( $(call findfileclauses,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) )

STRIP_FIND_CMD = \
    $(STRIP_FIND_COMMON_CMD) \
    -type f \( -perm /111 -o -name '*.so*' \) \
    -not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko) \) \
    -print0

STRIP_FIND_SPECIAL_LIBS_CMD = \
    $(STRIP_FIND_COMMON_CMD) \
    \( -name 'ld-*.so*' -o -name 'libpthread*.so*' \) \
    -print0

ifeq ($(BR2_ECLIPSE_REGISTER),y)
define TOOLCHAIN_ECLIPSE_REGISTER
    ./support/scripts/eclipse-register-toolchain `readlink -f $(O)` \
        $(notdir $(TARGET_CROSS)) $(BR2_ARCH)
endef
TARGET_FINALIZE_HOOKS += TOOLCHAIN_ECLIPSE_REGISTER
endif

GLIBC_GENERATE_LOCALES = $(call qstrip,$(BR2_GENERATE_LOCALE))
ifneq ($(GLIBC_GENERATE_LOCALES),)
PACKAGES += host-localedef

define GENERATE_GLIBC_LOCALES
    $(Q)mkdir -p $(TARGET_DIR)/usr/lib/locale/
    $(Q)for locale in $(GLIBC_GENERATE_LOCALES) ; do \
        inputfile=`echo $${locale} | cut -f1 -d'.'` ; \
        charmap=`echo $${locale} | cut -f2 -d'.' -s` ; \
        if test -z "$${charmap}" ; then \
            charmap="UTF-8" ; \
        fi ; \
        echo "Generating locale $${inputfile}.$${charmap}" ; \
        I18NPATH=$(STAGING_DIR)/usr/share/i18n:/usr/share/i18n \
        $(HOST_DIR)/bin/localedef \
            --prefix=$(TARGET_DIR) \
            --$(call LOWERCASE,$(BR2_ENDIAN))-endian \
            -i $${inputfile} -f $${charmap} \
            $${locale} ; \
    done
endef
TARGET_FINALIZE_HOOKS += GENERATE_GLIBC_LOCALES
endif
endif

ifeq ($(BR2_ENABLE_LOCALE_PURGE),y)
LOCALE_WHITELIST = $(BUILD_DIR)/locales.nopurge
LOCALE_NOPURGE = $(call qstrip,$(BR2_ENABLE_LOCALE_WHITELIST))
define PURGE_LOCALES
    rm -f $(LOCALE_WHITELIST)
    for i in $(LOCALE_NOPURGE) locale-archive; do echo $$i >> $(LOCALE_WHITELIST); done

    for dir in $(addprefix $(TARGET_DIR),/usr/share/locale /usr/share/X11/locale /usr/lib/locale); \
    do \
        if [ ! -d $$dir ]; then continue; fi; \
        for langdir in $$dir/*; \
        do \
            if [ -e "$${langdir}" ]; \
            then \
                grep -qx "$${langdir##*/}" $(LOCALE_WHITELIST) || rm -rf $$langdir; \
            fi \
        done; \
    done
    if [ -d $(TARGET_DIR)/usr/share/X11/locale ]; \
    then \
        for lang in $(LOCALE_NOPURGE); \
        do \
            if [ -f $(TARGET_DIR)/usr/share/X11/locale/$$lang/XLC_LOCALE ]; \
            then \
                echo "$$lang/XLC_LOCALE: $$lang"; \
            fi \
        done > $(TARGET_DIR)/usr/share/X11/locale/locale.dir; \
    fi
endef
TARGET_FINALIZE_HOOKS += PURGE_LOCALES
endif

$(TARGETS_ROOTFS): target-finalize

target-finalize: ROOTFS=

TARGET_DIR_FILES_LISTS = $(sort $(wildcard $(BUILD_DIR)/*/.files-list.txt))
HOST_DIR_FILES_LISTS = $(sort $(wildcard $(BUILD_DIR)/*/.files-list-host.txt))
STAGING_DIR_FILES_LISTS = $(sort $(wildcard $(BUILD_DIR)/*/.files-list-staging.txt))

.PHONY: host-finalize
host-finalize: $(PACKAGES) $(HOST_DIR) $(HOST_DIR_SYMLINK)
    @$(call MESSAGE,"Finalizing host directory")
    $(call per-package-rsync,$(sort $(PACKAGES)),host,$(HOST_DIR))

.PHONY: staging-finalize
staging-finalize: $(STAGING_DIR_SYMLINK)

.PHONY: target-finalize
target-finalize: $(PACKAGES) $(TARGET_DIR) host-finalize
    @$(call MESSAGE,"Finalizing target directory")
    $(call per-package-rsync,$(sort $(PACKAGES)),target,$(TARGET_DIR))
    $(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 \
        $(TARGET_DIR)/usr/lib/cmake $(TARGET_DIR)/usr/share/cmake
    find $(TARGET_DIR)/usr/{lib,share}/ -name '*.cmake' -print0 | xargs -0 rm -f
    find $(TARGET_DIR)/lib/ $(TARGET_DIR)/usr/lib/ $(TARGET_DIR)/usr/libexec/ \
        \( -name '*.a' -o -name '*.la' \) -print0 | xargs -0 rm -f
ifneq ($(BR2_PACKAGE_GDB),y)
    rm -rf $(TARGET_DIR)/usr/share/gdb
endif
ifneq ($(BR2_PACKAGE_BASH),y)
    rm -rf $(TARGET_DIR)/usr/share/bash-completion
endif
ifneq ($(BR2_PACKAGE_ZSH),y)
    rm -rf $(TARGET_DIR)/usr/share/zsh
endif
    rm -rf $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/man
    rm -rf $(TARGET_DIR)/usr/info $(TARGET_DIR)/usr/share/info
    rm -rf $(TARGET_DIR)/usr/doc $(TARGET_DIR)/usr/share/doc
    rm -rf $(TARGET_DIR)/usr/share/gtk-doc
    rmdir $(TARGET_DIR)/usr/share 2>/dev/null || true
    $(STRIP_FIND_CMD) | xargs -0 $(STRIPCMD) 2>/dev/null || true
    $(STRIP_FIND_SPECIAL_LIBS_CMD) | xargs -0 -r $(STRIPCMD) $(STRIP_STRIP_DEBUG) 2>/dev/null || true
    find $(TARGET_DIR) -type f -name '*.ko' -print0 | xargs -0 -r $(KSTRIPCMD) || true

    test -f $(TARGET_DIR)/etc/ld.so.conf && \
        { echo "ERROR: we shouldn't have a /etc/ld.so.conf file"; exit 1; } || true
    test -d $(TARGET_DIR)/etc/ld.so.conf.d && \
        { echo "ERROR: we shouldn't have a /etc/ld.so.conf.d directory"; exit 1; } || true
    mkdir -p $(TARGET_DIR)/etc
    ( \
        echo "NAME=Buildroot"; \
        echo "VERSION=$(BR2_VERSION_FULL)"; \
        echo "ID=buildroot"; \
        echo "VERSION_ID=$(BR2_VERSION)"; \
        echo "PRETTY_NAME=\"Buildroot $(BR2_VERSION)\"" \
    ) >  $(TARGET_DIR)/usr/lib/os-release
    ln -sf ../usr/lib/os-release $(TARGET_DIR)/etc

    @$(call MESSAGE,"Sanitizing RPATH in target tree")
    PER_PACKAGE_DIR=$(PER_PACKAGE_DIR) $(TOPDIR)/support/scripts/fix-rpath target

ifeq ($(BR2_ROOTFS_MERGED_USR),y)

    @$(foreach d, $(call qstrip,$(BR2_ROOTFS_OVERLAY)), \
        $(call MESSAGE,"Sanity check in overlay $(d)"); \
        not_merged_dirs="$$(support/scripts/check-merged-usr.sh $(d))"; \
        test -n "$$not_merged_dirs" && { \
            echo "ERROR: The overlay in $(d) is not" \
                "using a merged /usr for the following directories:" \
                $$not_merged_dirs; \
            exit 1; \
        } || true$(sep))

endif

    @$(foreach d, $(call qstrip,$(BR2_ROOTFS_OVERLAY)), \
        $(call MESSAGE,"Copying overlay $(d)"); \
        $(call SYSTEM_RSYNC,$(d),$(TARGET_DIR))$(sep))

    $(if $(TARGET_DIR_FILES_LISTS), \
        cat $(TARGET_DIR_FILES_LISTS)) > $(BUILD_DIR)/packages-file-list.txt
    $(if $(HOST_DIR_FILES_LISTS), \
        cat $(HOST_DIR_FILES_LISTS)) > $(BUILD_DIR)/packages-file-list-host.txt
    $(if $(STAGING_DIR_FILES_LISTS), \
        cat $(STAGING_DIR_FILES_LISTS)) > $(BUILD_DIR)/packages-file-list-staging.txt

    @$(foreach s, $(call qstrip,$(BR2_ROOTFS_POST_BUILD_SCRIPT)), \
        $(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 staging-finalize
    @rm -f $(ROOTFS_COMMON_TAR)
    $(Q)mkdir -p $(BINARIES_DIR)
    @$(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

.PHONY: legal-info-clean
legal-info-clean:
    @rm -fr $(LEGAL_INFO_DIR)

.PHONY: legal-info-prepare
legal-info-prepare: $(LEGAL_INFO_DIR)
    @$(call MESSAGE,"Buildroot $(BR2_VERSION_FULL) Collecting legal info")
    @$(call legal-license-file,buildroot,buildroot,support/legal-info/buildroot.hash,COPYING,COPYING,HOST)
    @$(call legal-manifest,TARGET,PACKAGE,VERSION,LICENSE,LICENSE FILES,SOURCE ARCHIVE,SOURCE SITE,DEPENDENCIES WITH LICENSES)
    @$(call legal-manifest,HOST,PACKAGE,VERSION,LICENSE,LICENSE FILES,SOURCE ARCHIVE,SOURCE SITE,DEPENDENCIES WITH LICENSES)
    @$(call legal-manifest,HOST,buildroot,$(BR2_VERSION_FULL),GPL-2.0+,COPYING,not saved,not saved)
    @$(call legal-warning,the Buildroot source code has not been saved)
    @cp $(BR2_CONFIG) $(LEGAL_INFO_DIR)/buildroot.config

.PHONY: legal-info
legal-info: 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)
    @if [ -r $(LEGAL_WARNINGS) ]; then \
        cat support/legal-info/README.warnings-header \
            $(LEGAL_WARNINGS) >>$(LEGAL_REPORT); \
        cat $(LEGAL_WARNINGS); fi
    @rm -f $(LEGAL_WARNINGS)
    @(cd $(LEGAL_INFO_DIR); \
        find * -type f -exec sha256sum {} + | LC_ALL=C sort -k2 \
            >.legal-info.sha256; \
        mv .legal-info.sha256 legal-info.sha256)
    @echo "Legal info produced in $(LEGAL_INFO_DIR)"

.PHONY: show-targets
show-targets:
    @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 \
                    --type=histogram --order=$(o) --input=$(<) \
                    --output=$(GRAPHS_DIR)/build.hist-$(o).$(BR_GRAPH_OUT) \
                    $(if $(BR2_GRAPH_ALT),--alternate-colors)$(sep))
    $(foreach t,packages steps,./support/scripts/graph-build-time \
                   --type=pie-$(t) --input=$(<) \
                   --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)"; \
    $(TOPDIR)/support/scripts/graph-depends $(BR2_GRAPH_DEPS_OPTS) \
        --direct -o $(GRAPHS_DIR)/$(@).dot
    dot $(BR2_GRAPH_DOT_OPTS) -T$(BR_GRAPH_OUT) \
        -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) \
        --graph $(GRAPHS_DIR)/graph-size.$(BR_GRAPH_OUT) \
        --file-size-csv $(GRAPHS_DIR)/file-size-stats.csv \
        --package-size-csv $(GRAPHS_DIR)/package-size-stats.csv \
        $(BR2_GRAPH_SIZE_OPTS)

.PHONY: check-dependencies
check-dependencies:
    @cd "$(CONFIG_DIR)"; \
    $(TOPDIR)/support/scripts/graph-depends -C

.PHONY: show-info
show-info:
    @:
    $(info $(call clean-json, \
            { $(foreach p, \
                $(sort $(foreach i,$(PACKAGES) $(TARGETS_ROOTFS), \
                        $(i) \
                        $($(call UPPERCASE,$(i))_FINAL_RECURSIVE_DEPENDENCIES) \
                    ) \
                ), \
                $(call json-info,$(call UPPERCASE,$(p)))$(comma) \
            ) } \
        ) \
    )

else 
.PHONY: linux toolchain
linux toolchain all: outputmakefile
    $(error Please configure Buildroot first (e.g. "make menuconfig"))
    @exit 1

endif 

HOSTCFLAGS = $(CFLAGS_FOR_BUILD)
export HOSTCFLAGS

$(BUILD_DIR)/buildroot-config/%onf:
    mkdir -p $(@D)/lxdialog
    PKG_CONFIG_PATH="$(HOST_PKG_CONFIG_PATH)" $(MAKE) CC="$(HOSTCC_NOCCACHE)" HOSTCC="$(HOSTCC_NOCCACHE)" \
        obj=$(@D) -C $(CONFIG) -f Makefile.br $(@F)

DEFCONFIG = $(call qstrip,$(BR2_DEFCONFIG))

COMMON_CONFIG_ENV = \
    BR2_DEFCONFIG='$(call qstrip,$(value BR2_DEFCONFIG))' \
    KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
    KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
    KCONFIG_TRISTATE=$(BUILD_DIR)/buildroot-config/tristate.config \
    BR2_CONFIG=$(BR2_CONFIG) \
    HOST_GCC_VERSION="$(HOSTCC_VERSION)" \
    BASE_DIR=$(BASE_DIR) \
    SKIP_LEGACY=

xconfig: $(BUILD_DIR)/buildroot-config/qconf outputmakefile
    @$(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN)

gconfig: $(BUILD_DIR)/buildroot-config/gconf outputmakefile
    @$(COMMON_CONFIG_ENV) srctree=$(TOPDIR) $< $(CONFIG_CONFIG_IN)

menuconfig: $(BUILD_DIR)/buildroot-config/mconf outputmakefile
    @$(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN)

nconfig: $(BUILD_DIR)/buildroot-config/nconf outputmakefile
    @$(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN)

config: $(BUILD_DIR)/buildroot-config/conf outputmakefile
    @$(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN)


randconfig allyesconfig alldefconfig allnoconfig: $(BUILD_DIR)/buildroot-config/conf outputmakefile
    @$(COMMON_CONFIG_ENV) SKIP_LEGACY=y $< --$@ $(CONFIG_CONFIG_IN)
    @$(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN) >/dev/null

randpackageconfig allyespackageconfig allnopackageconfig: $(BUILD_DIR)/buildroot-config/conf outputmakefile
    @grep -v BR2_PACKAGE_ $(BR2_CONFIG) > $(CONFIG_DIR)/.config.nopkg
    @$(COMMON_CONFIG_ENV) SKIP_LEGACY=y \
        KCONFIG_ALLCONFIG=$(CONFIG_DIR)/.config.nopkg \
        $< --$(subst package,,$@) $(CONFIG_CONFIG_IN)
    @rm -f $(CONFIG_DIR)/.config.nopkg
    @$(COMMON_CONFIG_ENV) $< --olddefconfig $(CONFIG_CONFIG_IN) >/dev/null

oldconfig syncconfig olddefconfig: $(BUILD_DIR)/buildroot-config/conf outputmakefile
    @$(COMMON_CONFIG_ENV) $< --$@ $(CONFIG_CONFIG_IN)

defconfig: $(BUILD_DIR)/buildroot-config/conf outputmakefile
    @$(COMMON_CONFIG_ENV) $< --defconfig$(if $(DEFCONFIG),=$(DEFCONFIG)) $(CONFIG_CONFIG_IN)

define percent_defconfig
%_defconfig: $(BUILD_DIR)/buildroot-config/conf $(1)/configs/%_defconfig outputmakefile
    @$$(COMMON_CONFIG_ENV) BR2_DEFCONFIG=$(1)/configs/$$@ \
        $$< --defconfig=$(1)/configs/$$@ $$(CONFIG_CONFIG_IN)
endef
$(eval $(foreach d,$(call reverse,$(TOPDIR) $(BR2_EXTERNAL_DIRS)),$(call percent_defconfig,$(d))$(sep)))

%_defconfig: $(BUILD_DIR)/buildroot-config/conf $(TOPDIR)/configs/%_defconfig.merge outputmakefile
    cd $(TOPDIR)/configs && xargs -a $@.merge -x -P 1 $(TOPDIR)/support/kconfig/merge_config.sh -m -O $(TOPDIR)
    $(COMMON_CONFIG_ENV) BR2_DEFCONFIG=$(TOPDIR)/.config \
        $< --defconfig=$(TOPDIR)/.config $(CONFIG_CONFIG_IN)

%_defconfig: $(BUILD_DIR)/buildroot-config/conf $(BR2_EXTERNAL)/configs/%_defconfig.merge outputmakefile
    cd $(BR2_EXTERNAL)/configs && xargs -a $@.merge -x -P 1 $(TOPDIR)/support/kconfig/merge_config.sh -m -O $(TOPDIR)
    $(COMMON_CONFIG_ENV) BR2_DEFCONFIG=$(TOPDIR)/.config \
        $< --defconfig=$(TOPDIR)/.config $(CONFIG_CONFIG_IN)

agv_%: $(BUILD_DIR)/buildroot-config/conf $(TOPDIR)/configs/agv_%_defconfig.merge outputmakefile
    cd $(TOPDIR)/configs && xargs -a $@_defconfig.merge -x -P 1 $(TOPDIR)/support/kconfig/merge_config.sh -m -O $(TOPDIR)
    $(COMMON_CONFIG_ENV) BR2_DEFCONFIG=$(TOPDIR)/.config \
        $< --defconfig=$(TOPDIR)/.config $(CONFIG_CONFIG_IN)

update-defconfig: savedefconfig

savedefconfig: $(BUILD_DIR)/buildroot-config/conf outputmakefile
    @$(COMMON_CONFIG_ENV) $< \
        --savedefconfig=$(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig) \
        $(CONFIG_CONFIG_IN)
    @$(SED) '/BR2_DEFCONFIG=/d' $(if $(DEFCONFIG),$(DEFCONFIG),$(CONFIG_DIR)/defconfig)

.PHONY: defconfig savedefconfig update-defconfig

$(BUILD_DIR) $(BASE_TARGET_DIR) $(HOST_DIR) $(BINARIES_DIR) $(LEGAL_INFO_DIR) $(REDIST_SOURCES_DIR_TARGET) $(REDIST_SOURCES_DIR_HOST) $(PER_PACKAGE_DIR):
    @mkdir -p $@
.PHONY: outputmakefile
outputmakefile:
ifeq ($(NEED_WRAPPER),y)
    $(Q)$(TOPDIR)/support/scripts/mkmakefile $(TOPDIR) $(O)
endif

.PHONY: printvars
printvars:
    @:
    $(foreach V, \
        $(sort $(filter $(VARS),$(.VARIABLES))), \
        $(if $(filter-out environment% default automatic, \
                $(origin $V)), \
        $(if $(QUOTED_VARS),\
            $(info $V='$(subst ','\'',$(if $(RAW_VARS),$(value $V),$($V)))'), \
            $(info $V=$(if $(RAW_VARS),$(value $V),$($V))))))


.PHONY: clean
clean:
    rm -rf $(BASE_TARGET_DIR) $(BINARIES_DIR) $(HOST_DIR) $(HOST_DIR_SYMLINK) \
        $(BUILD_DIR) $(BASE_DIR)/staging \
        $(LEGAL_INFO_DIR) $(GRAPHS_DIR) $(PER_PACKAGE_DIR)

.PHONY: distclean
distclean: clean
ifeq ($(O),$(CURDIR)/output)
    rm -rf $(O)
endif
    rm -rf $(TOPDIR)/dl $(BR2_CONFIG) $(CONFIG_DIR)/.config.old $(CONFIG_DIR)/..config.tmp \
        $(CONFIG_DIR)/.auto.deps $(BASE_DIR)/.br2-external.*

define list-defconfigs
    @first=true; \
    for defconfig in $(1)/configs/*_defconfig; do \
        [ -f "$${defconfig}" ] || continue; \
        if $${first}; then \
            if [ "$(2)" ]; then \
                printf 'External configs in "$(call qstrip,$(2))":\n'; \
            else \
                printf "Built-in configs:\n"; \
            fi; \
            first=false; \
        fi; \
        defconfig="$${defconfig##*/}"; \
        printf "  %-35s - Build for %s\n" "$${defconfig}" "$${defconfig%_defconfig}"; \
    done; \
    $${first} || printf "\n"
endef

.PHONY: list-defconfigs
list-defconfigs:
    $(call list-defconfigs,$(TOPDIR))
    $(foreach name,$(BR2_EXTERNAL_NAMES),\
        $(call list-defconfigs,$(BR2_EXTERNAL_$(name)_PATH),\
            $(BR2_EXTERNAL_$(name)_DESC))$(sep))

release: OUT = buildroot-$(BR2_VERSION)

release:
    git archive --format=tar --prefix=$(OUT)/ HEAD > $(OUT).tar
    $(MAKE) O=$(OUT) manual-html manual-text manual-pdf
    $(MAKE) O=$(OUT) clean
    tar rf $(OUT).tar $(OUT)
    gzip -9 -c < $(OUT).tar > $(OUT).tar.gz
    bzip2 -9 -c < $(OUT).tar > $(OUT).tar.bz2
    rm -rf $(OUT) $(OUT).tar

print-version:
    @echo $(BR2_VERSION_FULL)

check-package:
    find $(TOPDIR) -type f \( -name '*.mk' -o -name '*.hash' -o -name 'Config.*' \) \
        -exec ./utils/check-package {} +

.PHONY: .gitlab-ci.yml
.gitlab-ci.yml: .gitlab-ci.yml.in
    ./support/scripts/generate-gitlab-ci-yml $< > $@

include docs/manual/manual.mk
-include $(foreach dir,$(BR2_EXTERNAL_DIRS),$(sort $(wildcard $(dir)/docs/*/*.mk)))

.PHONY: $(noconfig_targets)

endif 
...