ifndef MAKE MAKE := make endif ifndef HOSTMAKE HOSTMAKE = $(MAKE) endif HOSTMAKE := $(shell which $(HOSTMAKE) || type -p $(HOSTMAKE) || echo make) # If BR2_JLEVEL is 0, scale the maximum concurrency with the number of # CPUs. An additional job is used in order to keep processors busy # while waiting on I/O. # If the number of processors is not available, assume one. ifeq ($(BR2_JLEVEL),0) PARALLEL_JOBS := $(shell echo \ $$((1 + `getconf _NPROCESSORS_ONLN 2>/dev/null || echo 1`))) else PARALLEL_JOBS := $(BR2_JLEVEL) endif # Only build one job at a time, *and* to not randomise goals and # prerequisites ordering in make 4.4+ MAKE1 := $(HOSTMAKE) -j1 $(if $(findstring --shuffle,$(MAKEFLAGS)),--shuffle=none) override MAKE = $(HOSTMAKE) \ $(if $(findstring j,$(filter-out --%,$(MAKEFLAGS))),,-j$(PARALLEL_JOBS)) ifeq ($(BR2_TOOLCHAIN_BUILDROOT),y) TARGET_VENDOR = $(call qstrip,$(BR2_TOOLCHAIN_BUILDROOT_VENDOR)) else TARGET_VENDOR = buildroot endif # Sanity checks ifeq ($(TARGET_VENDOR),) $(error BR2_TOOLCHAIN_BUILDROOT_VENDOR is not allowed to be empty) endif ifeq ($(TARGET_VENDOR),unknown) $(error BR2_TOOLCHAIN_BUILDROOT_VENDOR cannot be 'unknown'. \ It might be confused with the native toolchain) endif # Compute GNU_TARGET_NAME # FDPIC on ARM requires a special target name: it has no OS field and must # use the suffix -uclinuxfdpiceabi. ifeq ($(BR2_arm)$(BR2_armeb):$(BR2_BINFMT_FDPIC),y:y) GNU_TARGET_NAME = $(ARCH)-$(TARGET_VENDOR)-uclinuxfdpiceabi else GNU_TARGET_NAME = $(ARCH)-$(TARGET_VENDOR)-$(TARGET_OS)-$(LIBC)$(ABI) endif # FLAT binary format needs uclinux, except RISC-V which needs the # regular linux name. ifeq ($(BR2_BINFMT_FLAT):$(BR2_riscv),y:) TARGET_OS = uclinux else TARGET_OS = linux endif ifeq ($(BR2_TOOLCHAIN_USES_UCLIBC),y) LIBC = uclibc else ifeq ($(BR2_TOOLCHAIN_USES_MUSL),y) LIBC = musl else ifeq ($(BR2_TOOLCHAIN_USES_GLIBC),y) LIBC = gnu else ifeq ($(BR_BUILDING),y) # This happens if there is a bug in Buildroot that allows an # architecture configuration that isn't supported by any library. $(error No C library enabled, this is not possible.) endif # The ABI suffix is a bit special on ARM, as it needs to be # -uclibcgnueabi for uClibc EABI, and -gnueabi for glibc EABI. # This means that the LIBC and ABI aren't strictly orthogonal, # which explains why we need the test on LIBC below. ifeq ($(BR2_arm)$(BR2_armeb),y) ifeq ($(LIBC),uclibc) ABI = gnueabi else ABI = eabi endif ifeq ($(BR2_ARM_EABIHF),y) ABI := $(ABI)hf endif endif # For FSL PowerPC there's SPE ifeq ($(BR2_POWERPC_CPU_HAS_SPE),y) ABI = spe # MPC8540s are e500v1 with single precision FP ifeq ($(BR2_powerpc_8540),y) TARGET_ABI += -mabi=spe -mfloat-gprs=single -Wa,-me500 endif ifeq ($(BR2_powerpc_8548),y) TARGET_ABI += -mabi=spe -mfloat-gprs=double -Wa,-me500x2 endif ifeq ($(BR2_powerpc_e500mc),y) TARGET_ABI += -mabi=spe -mfloat-gprs=double -Wa,-me500mc endif endif # Use longcalls option for Xtensa globally. # The 'longcalls' option allows calls across a greater range of addresses, # and is required for some packages. While this option can degrade both # code size and performance, the linker can usually optimize away the # overhead when a call ends up within a certain range. # # Use auto-litpools for Xtensa globally. # Collecting literals into separate section can be advantageous if that # section is placed into DTCM at link time. This is applicable for code # running on bare metal, but makes no sense under linux, where userspace # is isolated from the physical memory details. OTOH placing literals into # separate section breaks build of huge source files, because l32r # instruction can only access literals in 256 KBytes range. # ifeq ($(BR2_xtensa),y) TARGET_ABI += -mlongcalls -mauto-litpools endif STAGING_SUBDIR = $(GNU_TARGET_NAME)/sysroot STAGING_DIR = $(HOST_DIR)/$(STAGING_SUBDIR) ifeq ($(BR2_OPTIMIZE_0),y) TARGET_OPTIMIZATION = -O0 endif ifeq ($(BR2_OPTIMIZE_1),y) TARGET_OPTIMIZATION = -O1 endif ifeq ($(BR2_OPTIMIZE_2),y) TARGET_OPTIMIZATION = -O2 endif ifeq ($(BR2_OPTIMIZE_3),y) TARGET_OPTIMIZATION = -O3 endif ifeq ($(BR2_OPTIMIZE_G),y) TARGET_OPTIMIZATION = -Og endif ifeq ($(BR2_OPTIMIZE_S),y) TARGET_OPTIMIZATION = -Os endif ifeq ($(BR2_OPTIMIZE_FAST),y) TARGET_OPTIMIZATION = -Ofast endif ifeq ($(BR2_ENABLE_DEBUG),) TARGET_DEBUGGING = -g0 endif ifeq ($(BR2_DEBUG_1),y) TARGET_DEBUGGING = -g1 endif ifeq ($(BR2_DEBUG_2),y) TARGET_DEBUGGING = -g2 endif ifeq ($(BR2_DEBUG_3),y) TARGET_DEBUGGING = -g3 endif TARGET_LDFLAGS = $(call qstrip,$(BR2_TARGET_LDFLAGS)) # musl's dynamic loader doesn't support DT_TEXTREL, which results in a runtime # crash if it gets used. The "-z text" linker option issues a build-time error # when DT_TEXREL is used, so we capture the problem earlier. # # See also: https://www.openwall.com/lists/musl/2020/09/25/4 # # NOTE: We're using "-ztext" instead of "-Wl,-z,text" here, because some # packages pass TARGET_LDFLAGS directly to ld rather than gcc, and ld doesn't # support -Wl,[...]. -z is supported by both gcc and clang, so it probably # won't cause us problems. # # We're using "-ztext" instead of "-z text" here, because some buildsystems # (like scons, for gpsd) will reorder and/or drop LDFLAGS, causing a lone # "-z" to be passed and the "text" keyword to be dropped otherwise. Both # gcc and ld supports that, so it probably won't cause us problems. ifeq ($(BR2_TOOLCHAIN_USES_MUSL):$(BR2_STATIC_LIBS),y:) TARGET_LDFLAGS += -ztext endif # By design, _FORTIFY_SOURCE requires gcc optimization to be enabled. # Therefore, we need to pass _FORTIFY_SOURCE and the optimization level # through the same mechanism, i.e currently through CFLAGS. Passing # _FORTIFY_SOURCE through the wrapper and the optimization level # through CFLAGS would not work, because CFLAGS are sometimes # ignored/overridden by packages, but the flags passed by the wrapper # are enforced: this would cause _FORTIFY_SOURCE to be used without any # optimization level, leading to a build / configure failure. So we keep # passing _FORTIFY_SOURCE and the optimization level both through CFLAGS. ifeq ($(BR2_FORTIFY_SOURCE_1),y) TARGET_HARDENED += -D_FORTIFY_SOURCE=1 else ifeq ($(BR2_FORTIFY_SOURCE_2),y) TARGET_HARDENED += -D_FORTIFY_SOURCE=2 else ifeq ($(BR2_FORTIFY_SOURCE_3),y) TARGET_HARDENED += -D_FORTIFY_SOURCE=3 endif TARGET_CPPFLAGS += -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 ifeq ($(BR2_TIME_BITS_64),y) TARGET_CPPFLAGS += -D_TIME_BITS=64 endif TARGET_CFLAGS = $(TARGET_CPPFLAGS) $(TARGET_ABI) $(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING) $(TARGET_HARDENED) TARGET_CXXFLAGS = $(TARGET_CFLAGS) TARGET_FCFLAGS = $(TARGET_ABI) $(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING) # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79509 ifeq ($(BR2_m68k_cf),y) TARGET_CFLAGS += -fno-dwarf2-cfi-asm TARGET_CXXFLAGS += -fno-dwarf2-cfi-asm endif ifeq ($(BR2_BINFMT_FLAT),y) ifeq ($(BR2_riscv),y) TARGET_CFLAGS += -fPIC endif ELF2FLT_FLAGS = $(if $($(PKG)_FLAT_STACKSIZE),\ -Wl$(comma)-elf2flt="-r -s$($(PKG)_FLAT_STACKSIZE)",\ -Wl$(comma)-elf2flt=-r) TARGET_CFLAGS += $(ELF2FLT_FLAGS) TARGET_CXXFLAGS += $(ELF2FLT_FLAGS) TARGET_FCFLAGS += $(ELF2FLT_FLAGS) TARGET_LDFLAGS += $(ELF2FLT_FLAGS) endif ifeq ($(BR2_TOOLCHAIN_BUILDROOT),y) TARGET_CROSS = $(HOST_DIR)/bin/$(GNU_TARGET_NAME)- else TARGET_CROSS = $(HOST_DIR)/bin/$(TOOLCHAIN_EXTERNAL_PREFIX)- endif # gcc-4.7 and later ships with wrappers that will automatically pass # arguments to the binutils tools. Those are paths to necessary linker # plugins. ifeq ($(BR2_TOOLCHAIN_GCC_AT_LEAST_4_7),y) TARGET_GCC_WRAPPERS_PREFIX = gcc- endif # Define TARGET_xx variables for all common binutils/gcc TARGET_AR = $(TARGET_CROSS)$(TARGET_GCC_WRAPPERS_PREFIX)ar TARGET_AS = $(TARGET_CROSS)as TARGET_CC = $(TARGET_CROSS)gcc TARGET_CPP = $(TARGET_CROSS)cpp TARGET_CXX = $(TARGET_CROSS)g++ TARGET_FC = $(TARGET_CROSS)gfortran TARGET_LD = $(TARGET_CROSS)ld TARGET_NM = $(TARGET_CROSS)$(TARGET_GCC_WRAPPERS_PREFIX)nm TARGET_RANLIB = $(TARGET_CROSS)$(TARGET_GCC_WRAPPERS_PREFIX)ranlib TARGET_READELF = $(TARGET_CROSS)readelf TARGET_OBJCOPY = $(TARGET_CROSS)objcopy TARGET_OBJDUMP = $(TARGET_CROSS)objdump ifeq ($(BR2_STRIP_strip),y) STRIP_STRIP_DEBUG := --strip-debug TARGET_STRIP = $(TARGET_CROSS)strip STRIPCMD = $(TARGET_CROSS)strip --remove-section=.comment --remove-section=.note else TARGET_STRIP = /bin/true STRIPCMD = $(TARGET_STRIP) endif INSTALL := $(shell which install || type -p install) UNZIP := $(shell which unzip || type -p unzip) -q APPLY_PATCHES = TAR="$(TAR)" PATH=$(HOST_DIR)/bin:$$PATH support/scripts/apply-patches.sh $(if $(QUIET),-s) HOST_CPPFLAGS = -I$(HOST_DIR)/include HOST_CFLAGS ?= -O2 HOST_CFLAGS += $(HOST_CPPFLAGS) HOST_CXXFLAGS += $(HOST_CFLAGS) HOST_LDFLAGS += -L$(HOST_DIR)/lib -Wl,-rpath,$(HOST_DIR)/lib # host-intltool should be executed with the system perl, so we save # the path to the system perl, before a host-perl built by Buildroot # might get installed into $(HOST_DIR)/bin and therefore appears # in our PATH. This system perl will be used as INTLTOOL_PERL. export PERL=$(shell which perl) # host-intltool needs libxml-parser-perl, which Buildroot installs in # $(HOST_DIR)/lib/perl, so we must make sure that the system perl # finds this perl module by exporting the proper value for PERL5LIB. export PERL5LIB=$(HOST_DIR)/lib/perl TARGET_MAKE_ENV = \ GIT_DIR=. \ PATH=$(BR_PATH) TARGET_CONFIGURE_OPTS = \ $(TARGET_MAKE_ENV) \ AR="$(TARGET_AR)" \ AS="$(TARGET_AS)" \ LD="$(TARGET_LD)" \ NM="$(TARGET_NM)" \ CC="$(TARGET_CC)" \ GCC="$(TARGET_CC)" \ CPP="$(TARGET_CPP)" \ CXX="$(TARGET_CXX)" \ FC="$(TARGET_FC)" \ F77="$(TARGET_FC)" \ RANLIB="$(TARGET_RANLIB)" \ READELF="$(TARGET_READELF)" \ STRIP="$(TARGET_STRIP)" \ OBJCOPY="$(TARGET_OBJCOPY)" \ OBJDUMP="$(TARGET_OBJDUMP)" \ AR_FOR_BUILD="$(HOSTAR)" \ AS_FOR_BUILD="$(HOSTAS)" \ CC_FOR_BUILD="$(HOSTCC)" \ GCC_FOR_BUILD="$(HOSTCC)" \ CXX_FOR_BUILD="$(HOSTCXX)" \ LD_FOR_BUILD="$(HOSTLD)" \ CPPFLAGS_FOR_BUILD="$(HOST_CPPFLAGS)" \ CFLAGS_FOR_BUILD="$(HOST_CFLAGS)" \ CXXFLAGS_FOR_BUILD="$(HOST_CXXFLAGS)" \ LDFLAGS_FOR_BUILD="$(HOST_LDFLAGS)" \ FCFLAGS_FOR_BUILD="$(HOST_FCFLAGS)" \ DEFAULT_ASSEMBLER="$(TARGET_AS)" \ DEFAULT_LINKER="$(TARGET_LD)" \ CPPFLAGS="$(TARGET_CPPFLAGS)" \ CFLAGS="$(TARGET_CFLAGS)" \ CXXFLAGS="$(TARGET_CXXFLAGS)" \ LDFLAGS="$(TARGET_LDFLAGS)" \ FCFLAGS="$(TARGET_FCFLAGS)" \ FFLAGS="$(TARGET_FCFLAGS)" \ PKG_CONFIG="$(PKG_CONFIG_HOST_BINARY)" \ STAGING_DIR="$(STAGING_DIR)" \ INTLTOOL_PERL=$(PERL) HOST_MAKE_ENV = \ GIT_DIR=. \ PATH=$(BR_PATH) \ PKG_CONFIG="$(PKG_CONFIG_HOST_BINARY)" \ PKG_CONFIG_SYSROOT_DIR="/" \ PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 \ PKG_CONFIG_ALLOW_SYSTEM_LIBS=1 \ PKG_CONFIG_LIBDIR="$(HOST_DIR)/lib/pkgconfig:$(HOST_DIR)/share/pkgconfig" HOST_CONFIGURE_OPTS = \ $(HOST_MAKE_ENV) \ AR="$(HOSTAR)" \ AS="$(HOSTAS)" \ LD="$(HOSTLD)" \ NM="$(HOSTNM)" \ CC="$(HOSTCC)" \ GCC="$(HOSTCC)" \ CXX="$(HOSTCXX)" \ CPP="$(HOSTCPP)" \ OBJCOPY="$(HOSTOBJCOPY)" \ RANLIB="$(HOSTRANLIB)" \ CPPFLAGS="$(HOST_CPPFLAGS)" \ CFLAGS="$(HOST_CFLAGS)" \ CXXFLAGS="$(HOST_CXXFLAGS)" \ LDFLAGS="$(HOST_LDFLAGS)" \ INTLTOOL_PERL=$(PERL) # This is extra environment we can not export ourselves (eg. because some # packages use that variable internally, eg. uboot), so we have to # explicitly pass it to user-supplied external hooks (eg. post-build, # post-images) EXTRA_ENV = \ PATH=$(BR_PATH) \ BR2_DL_DIR=$(BR2_DL_DIR) \ BUILD_DIR=$(BUILD_DIR) \ CONFIG_DIR=$(CONFIG_DIR) \ O=$(CANONICAL_O) \ PARALLEL_JOBS=$(PARALLEL_JOBS) ################################################################################ # settings we need to pass to configure # does unaligned access trap? BR2_AC_CV_TRAP_CHECK = ac_cv_lbl_unaligned_fail=yes ifeq ($(BR2_i386),y) BR2_AC_CV_TRAP_CHECK = ac_cv_lbl_unaligned_fail=no endif ifeq ($(BR2_x86_64),y) BR2_AC_CV_TRAP_CHECK = ac_cv_lbl_unaligned_fail=no endif ifeq ($(BR2_m68k),y) BR2_AC_CV_TRAP_CHECK = ac_cv_lbl_unaligned_fail=no endif ifeq ($(BR2_powerpc)$(BR2_powerpc64)$(BR2_powerpc64le),y) BR2_AC_CV_TRAP_CHECK = ac_cv_lbl_unaligned_fail=no endif ifeq ($(BR2_ENDIAN),"BIG") BR2_AC_CV_C_BIGENDIAN = ac_cv_c_bigendian=yes else BR2_AC_CV_C_BIGENDIAN = ac_cv_c_bigendian=no endif # AM_GNU_GETTEXT misdetects musl gettext support. # musl currently implements api level 1 and 2 (basic + ngettext) # http://www.openwall.com/lists/musl/2015/04/16/3 # # These autoconf variables should only be pre-seeded when the minimal # gettext implementation of musl is used. When the full blown # implementation provided by gettext libintl is used, auto-detection # works fine, and pre-seeding those values is actually wrong. ifeq ($(BR2_TOOLCHAIN_USES_MUSL):$(BR2_PACKAGE_GETTEXT_PROVIDES_LIBINTL),y:) BR2_GT_CV_FUNC_GNUGETTEXT_LIBC = \ gt_cv_func_gnugettext1_libc=yes \ gt_cv_func_gnugettext2_libc=yes endif TARGET_CONFIGURE_ARGS = \ $(BR2_AC_CV_TRAP_CHECK) \ ac_cv_func_mmap_fixed_mapped=yes \ ac_cv_func_memcmp_working=yes \ ac_cv_have_decl_malloc=yes \ gl_cv_func_malloc_0_nonnull=yes \ ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_calloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes \ lt_cv_sys_lib_search_path_spec="" \ $(BR2_AC_CV_C_BIGENDIAN) \ $(BR2_GT_CV_FUNC_GNUGETTEXT_LIBC) ################################################################################ ifeq ($(BR2_SYSTEM_ENABLE_NLS),y) NLS_OPTS = --enable-nls TARGET_NLS_DEPENDENCIES = host-gettext ifeq ($(BR2_PACKAGE_GETTEXT_PROVIDES_LIBINTL),y) TARGET_NLS_DEPENDENCIES += gettext TARGET_NLS_LIBS += -lintl endif else NLS_OPTS = --disable-nls endif # We need anything that is invalid. Traditionally, we'd have used 'false' (and # we did so in the past). However, that breaks libtool for packages that have # optional C++ support (e.g. gnutls), because libtool will *require* a *valid* # C++ preprocessor as long as CXX is not 'no'. # Now, whether we use 'no' or 'false' for CXX as the same side effect: it is an # invalid C++ compiler, and thus will cause detection of C++ to fail (which is # expected and what we want), while at the same time taming libtool into # silence. ifneq ($(BR2_INSTALL_LIBSTDCPP),y) TARGET_CONFIGURE_OPTS += CXX=no endif ifeq ($(BR2_STATIC_LIBS),y) SHARED_STATIC_LIBS_OPTS = --enable-static --disable-shared TARGET_CFLAGS += -static TARGET_CXXFLAGS += -static TARGET_FCFLAGS += -static TARGET_LDFLAGS += -static else ifeq ($(BR2_SHARED_LIBS),y) SHARED_STATIC_LIBS_OPTS = --disable-static --enable-shared else ifeq ($(BR2_SHARED_STATIC_LIBS),y) SHARED_STATIC_LIBS_OPTS = --enable-static --enable-shared endif # Used by our binutils patches. export BR_COMPILER_PARANOID_UNSAFE_PATH=enabled include package/pkg-download.mk include package/pkg-autotools.mk include package/pkg-cmake.mk include package/pkg-luarocks.mk include package/pkg-perl.mk include package/pkg-python.mk include package/pkg-virtual.mk include package/pkg-generic.mk include package/pkg-kconfig.mk include package/pkg-rebar.mk include package/pkg-kernel-module.mk include package/pkg-waf.mk include package/pkg-golang.mk include package/pkg-meson.mk include package/pkg-qmake.mk include package/pkg-cargo.mk