/branches/18.06.1/rules.mk |
@@ -0,0 +1,425 @@ |
# |
# Copyright (C) 2006-2010 OpenWrt.org |
# Copyright (C) 2016 LEDE Project |
# |
# This is free software, licensed under the GNU General Public License v2. |
# See /LICENSE for more information. |
# |
|
ifneq ($(__rules_inc),1) |
__rules_inc=1 |
|
ifeq ($(DUMP),) |
-include $(TOPDIR)/.config |
endif |
include $(TOPDIR)/include/debug.mk |
include $(TOPDIR)/include/verbose.mk |
|
ifneq ($(filter check,$(MAKECMDGOALS)),) |
CHECK:=1 |
DUMP:=1 |
endif |
|
export TMP_DIR:=$(TOPDIR)/tmp |
export TMPDIR:=$(TMP_DIR) |
|
qstrip=$(strip $(subst ",,$(1))) |
#")) |
|
empty:= |
space:= $(empty) $(empty) |
comma:=, |
merge=$(subst $(space),,$(1)) |
confvar=$(shell echo '$(foreach v,$(1),$(v)=$(subst ','\'',$($(v))))' | $(STAGING_DIR_HOST)/bin/mkhash md5) |
strip_last=$(patsubst %.$(lastword $(subst .,$(space),$(1))),%,$(1)) |
|
paren_left = ( |
paren_right = ) |
chars_lower = a b c d e f g h i j k l m n o p q r s t u v w x y z |
chars_upper = A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
|
define sep |
|
endef |
|
define newline |
|
|
endef |
|
__tr_list = $(join $(join $(1),$(foreach char,$(1),$(comma))),$(2)) |
__tr_head_stripped = $(subst $(space),,$(foreach cv,$(call __tr_list,$(1),$(2)),$$$(paren_left)subst$(cv)$(comma))) |
__tr_head = $(subst $(paren_left)subst,$(paren_left)subst$(space),$(__tr_head_stripped)) |
__tr_tail = $(subst $(space),,$(foreach cv,$(1),$(paren_right))) |
__tr_template = $(__tr_head)$$(1)$(__tr_tail) |
|
$(eval toupper = $(call __tr_template,$(chars_lower),$(chars_upper))) |
$(eval tolower = $(call __tr_template,$(chars_upper),$(chars_lower))) |
|
version_abbrev = $(if $(if $(CHECK),,$(DUMP)),$(1),$(shell printf '%.8s' $(1))) |
|
_SINGLE=export MAKEFLAGS=$(space); |
CFLAGS:= |
ARCH:=$(subst i486,i386,$(subst i586,i386,$(subst i686,i386,$(call qstrip,$(CONFIG_ARCH))))) |
ARCH_PACKAGES:=$(call qstrip,$(CONFIG_TARGET_ARCH_PACKAGES)) |
BOARD:=$(call qstrip,$(CONFIG_TARGET_BOARD)) |
SUBTARGET:=$(call qstrip,$(CONFIG_TARGET_SUBTARGET)) |
TARGET_OPTIMIZATION:=$(call qstrip,$(CONFIG_TARGET_OPTIMIZATION)) |
export EXTRA_OPTIMIZATION:=$(filter-out -fno-plt,$(call qstrip,$(CONFIG_EXTRA_OPTIMIZATION))) |
TARGET_SUFFIX=$(call qstrip,$(CONFIG_TARGET_SUFFIX)) |
BUILD_SUFFIX:=$(call qstrip,$(CONFIG_BUILD_SUFFIX)) |
SUBDIR:=$(patsubst $(TOPDIR)/%,%,${CURDIR}) |
BUILD_SUBDIR:=$(patsubst $(TOPDIR)/%,%,${CURDIR}) |
export SHELL:=/usr/bin/env bash |
|
IS_PACKAGE_BUILD := $(if $(filter package/%,$(BUILD_SUBDIR)),1) |
|
OPTIMIZE_FOR_CPU=$(subst i386,i486,$(ARCH)) |
|
ifeq ($(ARCH),powerpc) |
FPIC:=-fPIC |
else |
FPIC:=-fpic |
endif |
|
HOST_FPIC:=-fPIC |
|
ARCH_SUFFIX:=$(call qstrip,$(CONFIG_CPU_TYPE)) |
GCC_ARCH:= |
|
ifneq ($(ARCH_SUFFIX),) |
ARCH_SUFFIX:=_$(ARCH_SUFFIX) |
endif |
ifneq ($(filter -march=armv%,$(TARGET_OPTIMIZATION)),) |
GCC_ARCH:=$(patsubst -march=%,%,$(filter -march=armv%,$(TARGET_OPTIMIZATION))) |
endif |
ifdef CONFIG_HAS_SPE_FPU |
TARGET_SUFFIX:=$(TARGET_SUFFIX)spe |
endif |
ifdef CONFIG_MIPS64_ABI |
ifneq ($(CONFIG_MIPS64_ABI_O32),y) |
ARCH_SUFFIX:=$(ARCH_SUFFIX)_$(call qstrip,$(CONFIG_MIPS64_ABI)) |
endif |
endif |
|
DEFAULT_SUBDIR_TARGETS:=clean download prepare compile update refresh prereq dist distcheck configure check check-depends |
|
define DefaultTargets |
$(foreach t,$(DEFAULT_SUBDIR_TARGETS) $(1), |
.$(t): |
$(t): .$(t) |
.PHONY: $(t) .$(t) |
) |
endef |
|
DL_DIR:=$(if $(call qstrip,$(CONFIG_DOWNLOAD_FOLDER)),$(call qstrip,$(CONFIG_DOWNLOAD_FOLDER)),$(TOPDIR)/dl) |
OUTPUT_DIR:=$(if $(call qstrip,$(CONFIG_BINARY_FOLDER)),$(call qstrip,$(CONFIG_BINARY_FOLDER)),$(TOPDIR)/bin) |
BIN_DIR:=$(OUTPUT_DIR)/targets/$(BOARD)/$(SUBTARGET) |
INCLUDE_DIR:=$(TOPDIR)/include |
SCRIPT_DIR:=$(TOPDIR)/scripts |
BUILD_DIR_BASE:=$(TOPDIR)/build_dir |
ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) |
GCCV:=$(call qstrip,$(CONFIG_GCC_VERSION)) |
LIBC:=$(call qstrip,$(CONFIG_LIBC)) |
REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-openwrt-linux$(if $(TARGET_SUFFIX),-$(TARGET_SUFFIX)) |
GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-openwrt-linux |
DIR_SUFFIX:=_$(LIBC)$(if $(CONFIG_arm),_eabi) |
BIN_DIR:=$(BIN_DIR)$(if $(CONFIG_USE_MUSL),,-$(LIBC)) |
TARGET_DIR_NAME = target-$(ARCH)$(ARCH_SUFFIX)$(DIR_SUFFIX)$(if $(BUILD_SUFFIX),_$(BUILD_SUFFIX)) |
TOOLCHAIN_DIR_NAME = toolchain-$(ARCH)$(ARCH_SUFFIX)_gcc-$(GCCV)$(DIR_SUFFIX) |
else |
ifeq ($(CONFIG_NATIVE_TOOLCHAIN),) |
GNU_TARGET_NAME=$(call qstrip,$(CONFIG_TARGET_NAME)) |
else |
GNU_TARGET_NAME=$(shell gcc -dumpmachine) |
endif |
REAL_GNU_TARGET_NAME=$(GNU_TARGET_NAME) |
LIBC:=$(call qstrip,$(CONFIG_LIBC)) |
TARGET_DIR_NAME:=target-$(GNU_TARGET_NAME)_$(LIBC)$(if $(BUILD_SUFFIX),_$(BUILD_SUFFIX)) |
TOOLCHAIN_DIR_NAME:=toolchain-$(GNU_TARGET_NAME) |
endif |
|
ifeq ($(or $(CONFIG_EXTERNAL_TOOLCHAIN),$(CONFIG_GCC_VERSION_4_8),$(CONFIG_TARGET_uml)),) |
ifeq ($(CONFIG_GCC_USE_EMBEDDED_PATH_REMAP),y) |
iremap = -fmacro-prefix-map=$(1)=$(2) |
else |
iremap = -iremap$(1):$(2) |
endif |
endif |
|
PACKAGE_DIR:=$(BIN_DIR)/packages |
PACKAGE_DIR_ALL:=$(TOPDIR)/staging_dir/packages/$(BOARD) |
BUILD_DIR:=$(BUILD_DIR_BASE)/$(TARGET_DIR_NAME) |
STAGING_DIR:=$(TOPDIR)/staging_dir/$(TARGET_DIR_NAME) |
BUILD_DIR_TOOLCHAIN:=$(BUILD_DIR_BASE)/$(TOOLCHAIN_DIR_NAME) |
TOOLCHAIN_DIR:=$(TOPDIR)/staging_dir/$(TOOLCHAIN_DIR_NAME) |
STAMP_DIR:=$(BUILD_DIR)/stamp |
STAMP_DIR_HOST=$(BUILD_DIR_HOST)/stamp |
TARGET_ROOTFS_DIR?=$(if $(call qstrip,$(CONFIG_TARGET_ROOTFS_DIR)),$(call qstrip,$(CONFIG_TARGET_ROOTFS_DIR)),$(BUILD_DIR)) |
TARGET_DIR:=$(TARGET_ROOTFS_DIR)/root-$(BOARD) |
STAGING_DIR_ROOT:=$(STAGING_DIR)/root-$(BOARD) |
STAGING_DIR_IMAGE:=$(STAGING_DIR)/image |
BUILD_LOG_DIR:=$(TOPDIR)/logs |
PKG_INFO_DIR := $(STAGING_DIR)/pkginfo |
|
BUILD_DIR_HOST:=$(if $(IS_PACKAGE_BUILD),$(BUILD_DIR_BASE)/hostpkg,$(BUILD_DIR_BASE)/host) |
STAGING_DIR_HOST:=$(TOPDIR)/staging_dir/host |
STAGING_DIR_HOSTPKG:=$(TOPDIR)/staging_dir/hostpkg |
|
TARGET_PATH:=$(subst $(space),:,$(filter-out .,$(filter-out ./,$(subst :,$(space),$(PATH))))) |
TARGET_INIT_PATH:=$(call qstrip,$(CONFIG_TARGET_INIT_PATH)) |
TARGET_INIT_PATH:=$(if $(TARGET_INIT_PATH),$(TARGET_INIT_PATH),/usr/sbin:/sbin:/usr/bin:/bin) |
TARGET_CFLAGS:=$(TARGET_OPTIMIZATION)$(if $(CONFIG_DEBUG), -g3) $(call qstrip,$(CONFIG_EXTRA_OPTIMIZATION)) |
TARGET_CXXFLAGS = $(TARGET_CFLAGS) |
TARGET_ASFLAGS_DEFAULT = $(TARGET_CFLAGS) |
TARGET_ASFLAGS = $(TARGET_ASFLAGS_DEFAULT) |
TARGET_CPPFLAGS:=-I$(STAGING_DIR)/usr/include -I$(STAGING_DIR)/include |
TARGET_LDFLAGS:=-L$(STAGING_DIR)/usr/lib -L$(STAGING_DIR)/lib |
ifneq ($(CONFIG_EXTERNAL_TOOLCHAIN),) |
LIBGCC_S_PATH=$(realpath $(wildcard $(call qstrip,$(CONFIG_LIBGCC_ROOT_DIR))/$(call qstrip,$(CONFIG_LIBGCC_FILE_SPEC)))) |
LIBGCC_S=$(if $(LIBGCC_S_PATH),-L$(dir $(LIBGCC_S_PATH)) -lgcc_s) |
LIBGCC_A=$(realpath $(lastword $(wildcard $(dir $(LIBGCC_S_PATH))/gcc/*/*/libgcc.a))) |
else |
LIBGCC_A=$(lastword $(wildcard $(TOOLCHAIN_DIR)/lib/gcc/*/*/libgcc.a)) |
LIBGCC_S=$(if $(wildcard $(TOOLCHAIN_DIR)/lib/libgcc_s.so),-L$(TOOLCHAIN_DIR)/lib -lgcc_s,$(LIBGCC_A)) |
endif |
|
ifeq ($(CONFIG_ARCH_64BIT),y) |
LIB_SUFFIX:=64 |
endif |
|
ifndef DUMP |
ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) |
-include $(TOOLCHAIN_DIR)/info.mk |
export GCC_HONOUR_COPTS:=0 |
TARGET_CROSS:=$(if $(TARGET_CROSS),$(TARGET_CROSS),$(OPTIMIZE_FOR_CPU)-openwrt-linux$(if $(TARGET_SUFFIX),-$(TARGET_SUFFIX))-) |
TARGET_CFLAGS+= -fhonour-copts -Wno-error=unused-but-set-variable -Wno-error=unused-result |
TARGET_CPPFLAGS+= -I$(TOOLCHAIN_DIR)/usr/include |
ifeq ($(CONFIG_USE_MUSL),y) |
TARGET_CPPFLAGS+= -I$(TOOLCHAIN_DIR)/include/fortify |
endif |
TARGET_CPPFLAGS+= -I$(TOOLCHAIN_DIR)/include |
TARGET_LDFLAGS+= -L$(TOOLCHAIN_DIR)/usr/lib -L$(TOOLCHAIN_DIR)/lib |
TARGET_PATH:=$(TOOLCHAIN_DIR)/bin:$(TARGET_PATH) |
else |
ifeq ($(CONFIG_NATIVE_TOOLCHAIN),) |
TARGET_CROSS:=$(call qstrip,$(CONFIG_TOOLCHAIN_PREFIX)) |
TOOLCHAIN_ROOT_DIR:=$(call qstrip,$(CONFIG_TOOLCHAIN_ROOT)) |
TOOLCHAIN_BIN_DIRS:=$(patsubst ./%,$(TOOLCHAIN_ROOT_DIR)/%,$(call qstrip,$(CONFIG_TOOLCHAIN_BIN_PATH))) |
TOOLCHAIN_INC_DIRS:=$(patsubst ./%,$(TOOLCHAIN_ROOT_DIR)/%,$(call qstrip,$(CONFIG_TOOLCHAIN_INC_PATH))) |
TOOLCHAIN_LIB_DIRS:=$(patsubst ./%,$(TOOLCHAIN_ROOT_DIR)/%,$(call qstrip,$(CONFIG_TOOLCHAIN_LIB_PATH))) |
ifneq ($(TOOLCHAIN_BIN_DIRS),) |
TARGET_PATH:=$(subst $(space),:,$(TOOLCHAIN_BIN_DIRS)):$(TARGET_PATH) |
endif |
ifneq ($(TOOLCHAIN_INC_DIRS),) |
TARGET_CPPFLAGS+= $(patsubst %,-I%,$(TOOLCHAIN_INC_DIRS)) |
endif |
ifneq ($(TOOLCHAIN_LIB_DIRS),) |
TARGET_LDFLAGS+= $(patsubst %,-L%,$(TOOLCHAIN_LIB_DIRS)) |
endif |
TARGET_PATH:=$(TOOLCHAIN_DIR)/bin:$(TARGET_PATH) |
endif |
endif |
endif |
TARGET_PATH_PKG:=$(STAGING_DIR)/host/bin:$(STAGING_DIR_HOSTPKG)/bin:$(TARGET_PATH) |
|
ifeq ($(CONFIG_SOFT_FLOAT),y) |
SOFT_FLOAT_CONFIG_OPTION:=--with-float=soft |
ifeq ($(CONFIG_arm),y) |
TARGET_CFLAGS+= -mfloat-abi=soft |
else |
TARGET_CFLAGS+= -msoft-float |
endif |
else |
SOFT_FLOAT_CONFIG_OPTION:= |
ifeq ($(CONFIG_arm),y) |
TARGET_CFLAGS+= -mfloat-abi=hard |
endif |
endif |
|
export PATH:=$(TARGET_PATH) |
export STAGING_DIR STAGING_DIR_HOST STAGING_DIR_HOSTPKG |
export SH_FUNC:=. $(INCLUDE_DIR)/shell.sh; |
|
PKG_CONFIG:=$(STAGING_DIR_HOST)/bin/pkg-config |
|
export PKG_CONFIG |
|
HOSTCC:=gcc |
HOSTCXX:=g++ |
HOST_CPPFLAGS:=-I$(STAGING_DIR_HOST)/include $(if $(IS_PACKAGE_BUILD),-I$(STAGING_DIR_HOSTPKG)/include -I$(STAGING_DIR)/host/include) |
HOST_CFLAGS:=-O2 $(HOST_CPPFLAGS) |
HOST_LDFLAGS:=-L$(STAGING_DIR_HOST)/lib $(if $(IS_PACKAGE_BUILD),-L$(STAGING_DIR_HOSTPKG)/lib -L$(STAGING_DIR)/host/lib) |
|
ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) |
TARGET_AR:=$(TARGET_CROSS)gcc-ar |
TARGET_RANLIB:=$(TARGET_CROSS)gcc-ranlib |
TARGET_NM:=$(TARGET_CROSS)gcc-nm |
else |
TARGET_AR:=$(TARGET_CROSS)ar |
TARGET_RANLIB:=$(TARGET_CROSS)ranlib |
TARGET_NM:=$(TARGET_CROSS)nm |
endif |
|
BUILD_KEY=$(TOPDIR)/key-build |
|
TARGET_CC:=$(TARGET_CROSS)gcc |
TARGET_CXX:=$(TARGET_CROSS)g++ |
KPATCH:=$(SCRIPT_DIR)/patch-kernel.sh |
SED:=$(STAGING_DIR_HOST)/bin/sed -i -e |
ESED:=$(STAGING_DIR_HOST)/bin/sed -E -i -e |
CP:=cp -fpR |
LN:=ln -sf |
XARGS:=xargs -r |
|
BASH:=bash |
TAR:=tar |
FIND:=find |
PATCH:=patch |
PYTHON:=python |
|
INSTALL_BIN:=install -m0755 |
INSTALL_SUID:=install -m4755 |
INSTALL_DIR:=install -d -m0755 |
INSTALL_DATA:=install -m0644 |
INSTALL_CONF:=install -m0600 |
|
TARGET_CC_NOCACHE:=$(TARGET_CC) |
TARGET_CXX_NOCACHE:=$(TARGET_CXX) |
HOSTCC_NOCACHE:=$(HOSTCC) |
HOSTCXX_NOCACHE:=$(HOSTCXX) |
export TARGET_CC_NOCACHE |
export TARGET_CXX_NOCACHE |
export HOSTCC_NOCACHE |
|
ifneq ($(CONFIG_CCACHE),) |
TARGET_CC:= ccache_cc |
TARGET_CXX:= ccache_cxx |
HOSTCC:= ccache $(HOSTCC) |
HOSTCXX:= ccache $(HOSTCXX) |
endif |
|
TARGET_CONFIGURE_OPTS = \ |
AR="$(TARGET_AR)" \ |
AS="$(TARGET_CC) -c $(TARGET_ASFLAGS)" \ |
LD=$(TARGET_CROSS)ld \ |
NM="$(TARGET_NM)" \ |
CC="$(TARGET_CC)" \ |
GCC="$(TARGET_CC)" \ |
CXX="$(TARGET_CXX)" \ |
RANLIB="$(TARGET_RANLIB)" \ |
STRIP=$(TARGET_CROSS)strip \ |
OBJCOPY=$(TARGET_CROSS)objcopy \ |
OBJDUMP=$(TARGET_CROSS)objdump \ |
SIZE=$(TARGET_CROSS)size |
|
# strip an entire directory |
ifneq ($(CONFIG_NO_STRIP),) |
RSTRIP:=: |
STRIP:=: |
else |
ifneq ($(CONFIG_USE_STRIP),) |
STRIP:=$(TARGET_CROSS)strip $(call qstrip,$(CONFIG_STRIP_ARGS)) |
else |
ifneq ($(CONFIG_USE_SSTRIP),) |
STRIP:=$(STAGING_DIR_HOST)/bin/sstrip |
endif |
endif |
RSTRIP= \ |
export CROSS="$(TARGET_CROSS)" \ |
$(if $(PKG_BUILD_ID),KEEP_BUILD_ID=1) \ |
$(if $(CONFIG_KERNEL_KALLSYMS),NO_RENAME=1) \ |
$(if $(CONFIG_KERNEL_PROFILING),KEEP_SYMBOLS=1); \ |
NM="$(TARGET_CROSS)nm" \ |
STRIP="$(STRIP)" \ |
STRIP_KMOD="$(SCRIPT_DIR)/strip-kmod.sh" \ |
PATCHELF="$(STAGING_DIR_HOST)/bin/patchelf" \ |
$(SCRIPT_DIR)/rstrip.sh |
endif |
|
ifeq ($(CONFIG_IPV6),y) |
DISABLE_IPV6:= |
else |
DISABLE_IPV6:=--disable-ipv6 |
endif |
|
TAR_OPTIONS:=-xf - |
|
ifeq ($(CONFIG_BUILD_LOG),y) |
BUILD_LOG:=1 |
endif |
|
export BISON_PKGDATADIR:=$(STAGING_DIR_HOST)/share/bison |
export M4:=$(STAGING_DIR_HOST)/bin/m4 |
|
define shvar |
V_$(subst .,_,$(subst -,_,$(subst /,_,$(1)))) |
endef |
|
define shexport |
export $(call shvar,$(1))=$$(call $(1)) |
endef |
|
# Execute commands under flock |
# $(1) => The shell expression. |
# $(2) => The lock name. If not given, the global lock will be used. |
ifneq ($(wildcard $(STAGING_DIR_HOST)/bin/flock),) |
define locked |
SHELL= \ |
flock \ |
$(TMP_DIR)/.$(if $(2),$(strip $(2)),global).flock \ |
-c '$(subst ','\'',$(1))' |
endef |
else |
locked=$(1) |
endif |
|
# Recursively copy paths into another directory, purge dangling |
# symlinks before. |
# $(1) => File glob expression |
# $(2) => Destination directory |
define file_copy |
for src_dir in $(sort $(foreach d,$(wildcard $(1)),$(dir $(d)))); do \ |
( cd $$src_dir; find -type f -or -type d ) | \ |
( cd $(2); while :; do \ |
read FILE; \ |
[ -z "$$FILE" ] && break; \ |
[ -L "$$FILE" ] || continue; \ |
echo "Removing symlink $(2)/$$FILE"; \ |
rm -f "$$FILE"; \ |
done; ); \ |
done; \ |
$(CP) $(1) $(2) |
endef |
|
# Calculate sha256sum of any plain file within a given directory |
# $(1) => Input directory |
# $(2) => If set, recurse into subdirectories |
define sha256sums |
(cd $(1); find . $(if $(2),,-maxdepth 1) -type f -not -name 'sha256sums' -printf "%P\n" | sort | \ |
xargs -r $(STAGING_DIR_HOST)/bin/mkhash -n sha256 | sed -ne 's!^\(.*\) \(.*\)$$!\1 *\2!p' > sha256sums) |
endef |
|
# file extension |
ext=$(word $(words $(subst ., ,$(1))),$(subst ., ,$(1))) |
|
all: |
FORCE: ; |
.PHONY: FORCE |
|
check: FORCE |
@true |
|
val.%: |
@$(if $(filter undefined,$(origin $*)),\ |
echo "$* undefined" >&2, \ |
echo '$(subst ','"'"',$($*))' \ |
) |
|
var.%: |
@$(if $(filter undefined,$(origin $*)),\ |
echo "$* undefined" >&2, \ |
echo "$*='"'$(subst ','"'\"'\"'"',$($*))'"'" \ |
) |
|
endif #__rules_inc |