This patch is a new version of a patch already sent several times on the mailing-list, committed and reverted a few times by Daniel Laird, due to several imperfections. This version is a new try at finding a solution that works for everybody. Hopefully it'll work :-) The original problem is that external toolchain builds failed because packages couldn't find their dependent libraries at configure time and could not be linked with them. To fix these two problems, two things are added: * The TARGET_LDFLAGS variable was exposed as LDFLAGS at ./configure time thanks to TARGET_CONFIGURE_OPTS. The TARGET_LDFLAGS variable contains -L options with the path in the STAGING_DIR for the libraries. It allows ./configure scripts to properly compile the small test programs testing whether a dependency is properly installed. * The TARGET_CFLAGS contains a new -Wl,--rpath-link option for both $(STAGING_DIR)/lib and $(STAGING_DIR)/usr/lib. It allows library depending on other libraries to link properly. The TARGET_CFLAGS is exposed as CFLAGS in TARGET_CONFIGURE_OPTS. This new version fixes a problem encountered by hartleys <hartleys@visionengravers.com> when building the kernel. The problem was that the -Wl,--rpath-link options were added to LDFLAGS, while there are options for the C compiler, not the ld linker. Moving them to CFLAGS seems to fix the issue. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
368 lines
11 KiB
Makefile
368 lines
11 KiB
Makefile
ifndef MAKE
|
|
MAKE:=make
|
|
endif
|
|
ifndef HOSTMAKE
|
|
HOSTMAKE=$(MAKE)
|
|
endif
|
|
HOSTMAKE :=$(shell $(CONFIG_SHELL) -c "which $(HOSTMAKE)" || type -p $(HOSTMAKE) || echo make)
|
|
|
|
MAKE1:=$(HOSTMAKE) -j1
|
|
MAKE:=$(HOSTMAKE) -j$(BR2_JLEVEL)
|
|
|
|
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_S),y)
|
|
TARGET_OPTIMIZATION=-Os
|
|
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
|
|
|
|
|
|
#########################################################################
|
|
ifeq ($(BR2_TOOLCHAIN_SOURCE),y)
|
|
TARGET_CFLAGS=$(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING) \
|
|
-I$(STAGING_DIR)/usr/include -I$(STAGING_DIR)/include \
|
|
-Wl,--rpath-link -Wl,$(STAGING_DIR)/lib -Wl,--rpath-link -Wl,$(STAGING_DIR)/usr/lib
|
|
TARGET_LDFLAGS+=-L$(STAGING_DIR)/lib -L$(STAGING_DIR)/usr/lib
|
|
ifeq ($(BR2_TOOLCHAIN_SYSROOT),y)
|
|
TARGET_CFLAGS+= $(BR2_SYSROOT) $(BR2_ISYSROOT)
|
|
TARGET_LDFLAGS+= $(BR2_SYSROOT)
|
|
endif
|
|
|
|
CC_TARGET_TUNE_:=$(strip $(subst ",,$(BR2_GCC_TARGET_TUNE)))
|
|
#"))
|
|
CC_TARGET_ARCH_:=$(strip $(subst ",,$(BR2_GCC_TARGET_ARCH)))
|
|
#"))
|
|
CC_TARGET_ABI_:=$(strip $(subst ",,$(BR2_GCC_TARGET_ABI)))
|
|
#"))
|
|
ifneq ($(CC_TARGET_TUNE_),)
|
|
TARGET_CFLAGS+=-mtune=$(CC_TARGET_TUNE_)
|
|
endif
|
|
ifneq ($(CC_TARGET_ARCH_),)
|
|
TARGET_CFLAGS+=-march=$(CC_TARGET_ARCH_)
|
|
endif
|
|
ifneq ($(CC_TARGET_ABI_),)
|
|
TARGET_CFLAGS+=-mabi=$(CC_TARGET_ABI_)
|
|
endif
|
|
|
|
ifneq ($(BR2_PREFER_STATIC_LIB),y)
|
|
ifeq ($(BR2_x86_64),y)
|
|
TARGET_CFLAGS+=-fPIC -DPIC
|
|
endif # PIC for dynamic objects on x86_64
|
|
endif
|
|
|
|
ifeq ($(BR2_SOFT_FLOAT),y)
|
|
TARGET_CFLAGS+=-msoft-float
|
|
endif
|
|
|
|
# enable VIS for v9a and v9b
|
|
ifeq ($(findstring y,$(BR2_sparc_v9a)$(BR2_sparc64_v9a)$(BR2_sparc_v9b)$(BR2_sparc64_v9b)),y)
|
|
TARGET_CFLAGS+=-mvis
|
|
endif
|
|
|
|
ifeq ($(findstring yy,$(BR2_mips)$(BR2_MIPS_ABI64)),yy)
|
|
TARGET_CFLAGS+=-fno-pic -mno-abicalls
|
|
endif
|
|
|
|
ifeq ($(BR2_LARGEFILE),y)
|
|
TARGET_CFLAGS+=-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
|
|
endif
|
|
|
|
TARGET_CXXFLAGS=$(TARGET_CFLAGS)
|
|
|
|
# else it's an external toolchain
|
|
#########################################################################
|
|
else
|
|
TARGET_CFLAGS=$(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING) \
|
|
-I$(STAGING_DIR)/include -I$(STAGING_DIR)/usr/include -I$(TOOLCHAIN_EXTERNAL_PATH)/$(TOOLCHAIN_EXTERNAL_PREFIX)/include \
|
|
-Wl,--rpath-link -Wl,$(STAGING_DIR)/lib -Wl,--rpath-link -Wl,$(STAGING_DIR)/usr/lib
|
|
TARGET_CXXFLAGS=$(TARGET_CFLAGS)
|
|
TARGET_LDFLAGS=-L$(STAGING_DIR)/lib -L$(STAGING_DIR)/usr/lib
|
|
endif
|
|
#########################################################################
|
|
#ifeq ($(BR2_ROOTFS_SUFFIX),)
|
|
ROOTFS_SUFFIX:=$(strip $(subst ",, $(BR2_ROOTFS_SUFFIX)))
|
|
ifeq ($(ROOTFS_SUFFIX),)
|
|
ROOTFS_SUFFIX:=
|
|
else
|
|
XXXX=xxxx
|
|
ROOTFS_SUFFIX:=-$(BR2_ROOTFS_SUFFIX)
|
|
endif
|
|
|
|
ifeq ($(strip $(subst ",, $(BR2_FPU_SUFFIX))),y)
|
|
COND_ARCH_FPU_SUFFIX:=$(ARCH_FPU_SUFFIX)
|
|
else
|
|
COND_ARCH_FPU_SUFFIX:=
|
|
endif
|
|
|
|
ifeq ($(BR2_TOOLCHAIN_SOURCE),y)
|
|
TOOL_BUILD_DIR=$(BASE_DIR)/$(TOPDIR_PREFIX)toolchain_build_$(ARCH)$(COND_ARCH_FPU_SUFFIX)$(TOPDIR_SUFFIX)
|
|
|
|
# Quotes are needed for spaces et al in path components.
|
|
TARGET_PATH="$(TOOL_BUILD_DIR)/bin:$(STAGING_DIR)/bin:$(STAGING_DIR)/usr/bin:$(PATH)"
|
|
IMAGE:=$(BINARIES_DIR)/$(BR2_ROOTFS_PREFIX).$(ARCH)$(COND_ARCH_FPU_SUFFIX)$(ROOTFS_SUFFIX)
|
|
GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux
|
|
REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)$(GNU_TARGET_SUFFIX)
|
|
TARGET_CROSS=$(STAGING_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)-
|
|
KERNEL_CROSS=$(TARGET_CROSS)
|
|
else
|
|
TOOLCHAIN_EXTERNAL_PREFIX:=$(strip $(subst ",, $(BR2_TOOLCHAIN_EXTERNAL_PREFIX)))
|
|
#"))
|
|
TOOLCHAIN_EXTERNAL_PATH:=$(strip $(subst ",, $(BR2_TOOLCHAIN_EXTERNAL_PATH)))
|
|
#"))
|
|
#TOOL_BUILD_DIR=$(BASE_DIR)/$(TOPDIR_PREFIX)toolchain_build_$(TOOLCHAIN_EXTERNAL_PREFIX)
|
|
TOOL_BUILD_DIR=$(BASE_DIR)/$(TOPDIR_PREFIX)toolchain_build_$(ARCH)$(COND_ARCH_FPU_SUFFIX)$(TOPDIR_SUFFIX)
|
|
# Make sure that STAGING_DIR/usr/bin is in path for freetype-config etc.
|
|
TARGET_PATH="$(STAGING_DIR)/usr/bin:$(STAGING_DIR)/bin:$(TOOL_BUILD_DIR)/bin:$(TOOLCHAIN_EXTERNAL_PATH)/bin:$(PATH)"
|
|
#IMAGE:=$(BINARIES_DIR)/$(BR2_ROOTFS_PREFIX).$(TOOLCHAIN_EXTERNAL_PREFIX)$(ROOTFS_SUFFIX)
|
|
IMAGE:=$(BINARIES_DIR)/$(BR2_ROOTFS_PREFIX).$(ARCH)$(COND_ARCH_FPU_SUFFIX)$(ROOTFS_SUFFIX)
|
|
|
|
REAL_GNU_TARGET_NAME=$(TOOLCHAIN_EXTERNAL_PREFIX)
|
|
GNU_TARGET_NAME=$(TOOLCHAIN_EXTERNAL_PREFIX)
|
|
KERNEL_CROSS=$(TOOLCHAIN_EXTERNAL_PATH)/bin/$(TOOLCHAIN_EXTERNAL_PREFIX)-
|
|
TARGET_CROSS=$(TOOLCHAIN_EXTERNAL_PATH)/bin/$(TOOLCHAIN_EXTERNAL_PREFIX)-
|
|
endif
|
|
TARGET_AR=$(TARGET_CROSS)ar
|
|
TARGET_AS=$(TARGET_CROSS)as
|
|
TARGET_CC=$(TARGET_CROSS)gcc
|
|
TARGET_CPP=$(TARGET_CROSS)cpp
|
|
TARGET_CXX=$(TARGET_CROSS)g++
|
|
ifeq ($(BR2_GCC_VERSION_3_4_6),y)
|
|
TARGET_FC=$(TARGET_CROSS)g77
|
|
else
|
|
TARGET_FC=$(TARGET_CROSS)gfortran
|
|
endif
|
|
TARGET_LD=$(TARGET_CROSS)ld
|
|
TARGET_NM=$(TARGET_CROSS)nm
|
|
TARGET_RANLIB=$(TARGET_CROSS)ranlib
|
|
TARGET_OBJCOPY=$(TARGET_CROSS)objcopy
|
|
TARGET_OBJDUMP=$(TARGET_CROSS)objdump
|
|
ifeq ($(BR2_TOOLCHAIN_EXTERNAL),y)
|
|
TARGET_LDCONFIG=/sbin/ldconfig
|
|
else
|
|
TARGET_LDCONFIG=$(TARGET_CROSS)ldconfig
|
|
endif
|
|
ifeq ($(BR2_STRIP_strip),y)
|
|
STRIP_DISCARD_ALL:=--discard-all
|
|
STRIP_STRIP_UNNEEDED:=--strip-unneeded
|
|
STRIP_STRIP_ALL:=--strip-all
|
|
REMOVE_SECTION_COMMENT:=--remove-section=.comment
|
|
REMOVE_SECTION_NOTE:=--remove-section=.note
|
|
TARGET_STRIP=$(TARGET_CROSS)strip
|
|
STRIPCMD=$(TARGET_CROSS)strip $(REMOVE_SECTION_COMMENT) $(REMOVE_SECTION_NOTE)
|
|
endif
|
|
ifeq ($(BR2_STRIP_sstrip),y)
|
|
STRIP_DISCARD_ALL:=
|
|
STRIP_STRIP_UNNEEDED:=
|
|
STRIP_STRIP_ALL:=
|
|
REMOVE_SECTION_COMMENT:=
|
|
REMOVE_SECTION_NOTE:=
|
|
TARGET_STRIP=$(STAGING_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)-sstrip
|
|
STRIPCMD=$(TARGET_STRIP)
|
|
endif
|
|
ifeq ($(BR2_STRIP_none),y)
|
|
TARGET_STRIP=true -Not_stripping
|
|
STRIPCMD=$(TARGET_STRIP)
|
|
endif
|
|
INSTALL=/usr/bin/install
|
|
|
|
HOST_ARCH:=$(shell $(HOSTCC) -dumpmachine | sed -e s'/-.*//' \
|
|
-e 's/sparc.*/sparc/' \
|
|
-e 's/arm.*/arm/g' \
|
|
-e 's/m68k.*/m68k/' \
|
|
-e 's/ppc/powerpc/g' \
|
|
-e 's/v850.*/v850/g' \
|
|
-e 's/sh[234]/sh/' \
|
|
-e 's/mips-.*/mips/' \
|
|
-e 's/mipsel-.*/mipsel/' \
|
|
-e 's/cris.*/cris/' \
|
|
-e 's/i[3-9]86/i386/' \
|
|
)
|
|
GNU_HOST_NAME:=$(HOST_ARCH)-$(subst ",,$(BR2_GNU_BUILD_SUFFIX))
|
|
#")
|
|
TARGET_CONFIGURE_OPTS=PATH=$(TARGET_PATH) \
|
|
AR="$(TARGET_AR)" \
|
|
AS="$(TARGET_AS)" \
|
|
LD="$(TARGET_LD)" \
|
|
CFLAGS="$(TARGET_CFLAGS)" \
|
|
LDFLAGS="$(TARGET_LDFLAGS)" \
|
|
NM="$(TARGET_NM)" \
|
|
CC="$(TARGET_CC) $(TARGET_CFLAGS)" \
|
|
GCC="$(TARGET_CC) $(TARGET_CFLAGS)" \
|
|
CPP="$(TARGET_CPP) $(TARGET_CFLAGS)" \
|
|
CXX="$(TARGET_CXX) $(TARGET_CXXFLAGS)" \
|
|
FC="$(TARGET_FC) $(TARGET_FCFLAGS)" \
|
|
RANLIB="$(TARGET_RANLIB)" \
|
|
STRIP="$(TARGET_STRIP)" \
|
|
OBJCOPY="$(TARGET_OBJCOPY)" \
|
|
AR_FOR_BUILD="$(HOSTAR)" \
|
|
AS_FOR_BUILD="$(HOSTAS)" \
|
|
CC_FOR_BUILD="$(HOSTCC)" \
|
|
GCC_FOR_BUILD="$(HOSTCC)" \
|
|
CXX_FOR_BUILD="$(HOSTCXX)" \
|
|
FC_FOR_BUILD="$(HOSTFC)" \
|
|
LD_FOR_BUILD="$(HOSTLD)" \
|
|
CFLAGS_FOR_BUILD="$(HOST_CFLAGS)" \
|
|
CXXFLAGS_FOR_BUILD="$(HOST_CXXFLAGS)" \
|
|
LDFLAGS_FOR_BUILD="$(HOST_LDFLAGS)" \
|
|
FCFLAGS_FOR_BUILD="$(HOST_FCFLAGS)" \
|
|
AR_FOR_TARGET="$(TARGET_AR)" \
|
|
AS_FOR_TARGET="$(TARGET_AS)" \
|
|
CC_FOR_TARGET="$(TARGET_CC)" \
|
|
LD_FOR_TARGET="$(TARGET_LD)" \
|
|
NM_FOR_TARGET="$(TARGET_NM)" \
|
|
DEFAULT_ASSEMBLER="$(TARGET_AS)" \
|
|
DEFAULT_LINKER="$(TARGET_LD)" \
|
|
PKG_CONFIG_SYSROOT_DIR="$(STAGING_DIR)" \
|
|
PKG_CONFIG="$(STAGING_DIR)/usr/bin/pkg-config" \
|
|
PKG_CONFIG_PATH="$(STAGING_DIR)/usr/lib/pkgconfig:$(PKG_CONFIG_PATH)" \
|
|
STAGING_DIR="$(STAGING_DIR)"
|
|
|
|
HOST_CONFIGURE_OPTS=PATH=$(TARGET_PATH) \
|
|
AR="$(HOSTAR)" \
|
|
AS="$(HOSTAS)" \
|
|
LD="$(HOSTLD) $(HOST_LDFLAGS)" \
|
|
NM="$(HOSTNM)" \
|
|
CC="$(HOSTCC) $(HOST_CFLAGS)" \
|
|
GCC="$(HOSTCC) $(HOST_CFLAGS)" \
|
|
CXX="$(HOSTCXX) $(HOST_CXXFLAGS)" \
|
|
CPP="$(HOSTCPP) $(HOST_CFLAGS)" \
|
|
AR_FOR_BUILD="$(HOSTAR)" \
|
|
AS_FOR_BUILD="$(HOSTAS)" \
|
|
CC_FOR_BUILD="$(HOSTCC)" \
|
|
GCC_FOR_BUILD="$(HOSTCC)" \
|
|
CXX_FOR_BUILD="$(HOSTCXX)" \
|
|
LD_FOR_BUILD="$(HOSTLD)" \
|
|
FC_FOR_BUILD="$(HOSTFC)" \
|
|
CFLAGS_FOR_BUILD="$(HOST_CFLAGS)" \
|
|
CXXFLAGS_FOR_BUILD="$(HOST_CXXFLAGS)" \
|
|
LDFLAGS_FOR_BUILD="$(HOST_LDFLAGS)" \
|
|
FCFLAGS_FOR_BUILD="$(HOST_FCFLAGS)" \
|
|
AR_FOR_TARGET="$(TARGET_AR)" \
|
|
AS_FOR_TARGET="$(TARGET_AS)" \
|
|
CC_FOR_TARGET="$(TARGET_CC)" \
|
|
LD_FOR_TARGET="$(TARGET_LD)" \
|
|
NM_FOR_TARGET="$(TARGET_NM)" \
|
|
RANLIB_FOR_TARGET="$(TARGET_RANLIB)" \
|
|
STRIP_FOR_TARGET="$(TARGET_STRIP)" \
|
|
OBJCOPY_FOR_TARGET="$(TARGET_OBJCOPY)" \
|
|
OBJDUMP_FOR_TARGET="$(TARGET_OBJDUMP)" \
|
|
DEFAULT_ASSEMBLER="$(TARGET_AS)" \
|
|
DEFAULT_LINKER="$(TARGET_LD)" \
|
|
ORIGINAL_AS_FOR_TARGET="$(TARGET_AS)" \
|
|
ORIGINAL_LD_FOR_TARGET="$(TARGET_LD)" \
|
|
ORIGINAL_NM_FOR_TARGET="$(TARGET_NM)" \
|
|
ORIGINAL_OBJDUMP_FOR_TARGET="$(TARGET_OBJDUMP)"
|
|
|
|
#######################################################################
|
|
# 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_s390),y)
|
|
BR2_AC_CV_TRAP_CHECK=ac_cv_lbl_unaligned_fail=no
|
|
endif
|
|
ifeq ($(BR2_powerpc)$(BR2_ENDIAN),yBIG)
|
|
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
|
|
|
|
# XXX: FIXME: We would need to grab MALLOC_GLIBC_COMPAT from the uClibc.config
|
|
# Including it doesn't seem wise, grepping is ugly.. Suggestions?
|
|
# Does malloc return live pointer for malloc(0) ?
|
|
ifeq ($(MALLOC_GLIBC_COMPAT),y)
|
|
BR2_AC_CV_FUNC_MALLOC_0_NONNULL=ac_cv_func_malloc_0_nonnull=yes \
|
|
gl_cv_func_malloc_0_nonnull=yes \
|
|
ac_cv_func_realloc_0_nonnull=yes
|
|
else
|
|
BR2_AC_CV_FUNC_MALLOC_0_NONNULL=ac_cv_func_malloc_0_nonnull=no \
|
|
gl_cv_func_malloc_0_nonnull=no \
|
|
ac_cv_func_realloc_0_nonnull=no
|
|
endif
|
|
|
|
|
|
TARGET_CONFIGURE_ARGS= \
|
|
$(BR2_AC_CV_TRAP_CHECK) \
|
|
ac_cv_func_mmap_fixed_mapped=yes \
|
|
ac_cv_func_memcmp_working=yes \
|
|
$(BR2_AC_CV_C_BIGENDIAN)
|
|
|
|
#######################################################################
|
|
|
|
ifeq ($(BR2_ENABLE_LOCALE),y)
|
|
DISABLE_NLS:=
|
|
else
|
|
DISABLE_NLS:=--disable-nls
|
|
endif
|
|
|
|
ifneq ($(BR2_LARGEFILE),y)
|
|
DISABLE_LARGEFILE= --disable-largefile
|
|
endif
|
|
|
|
ifneq ($(BR2_INET_IPV6),y)
|
|
DISABLE_IPV6= --disable-ipv6
|
|
endif
|
|
|
|
ifneq ($(BR2_GCC_CROSS_CXX),y)
|
|
TARGET_CONFIGURE_OPTS+=CXX=""
|
|
endif
|
|
|
|
ifeq ($(BR2_ENABLE_DEBUG),y)
|
|
ENABLE_DEBUG:=--enable-debug
|
|
else
|
|
ENABLE_DEBUG:=
|
|
endif
|
|
|
|
|
|
# X Windowing system
|
|
|
|
XSERVER:=
|
|
ifeq ($(strip $(BR2_PACKAGE_TINYX)),y)
|
|
XSERVER+=tinyx
|
|
endif
|
|
ifeq ($(strip $(BR2_PACKAGE_XORG)),y)
|
|
XSERVER+=xorg
|
|
endif
|
|
ifeq ($(strip $(BR2_PACKAGE_XORG7)),y)
|
|
XSERVER+=xserver_xorg-server
|
|
endif
|
|
ifeq ($(strip $(BR2_PACKAGE_XGGI)),y)
|
|
XSERVER+=xggi
|
|
endif
|
|
|
|
X11_PREFIX:=$(strip $(subst ",, $(BR2_X11_PREFIX)))
|
|
#"))
|
|
|
|
include package/Makefile.autotools.in
|