1*4882a593Smuzhiyun################################################################################ 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# gcc-final 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun################################################################################ 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunGCC_FINAL_VERSION = $(GCC_VERSION) 8*4882a593SmuzhiyunGCC_FINAL_SITE = $(GCC_SITE) 9*4882a593SmuzhiyunGCC_FINAL_SOURCE = $(GCC_SOURCE) 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunHOST_GCC_FINAL_DL_SUBDIR = gcc 12*4882a593Smuzhiyun 13*4882a593SmuzhiyunHOST_GCC_FINAL_DEPENDENCIES = \ 14*4882a593Smuzhiyun $(HOST_GCC_COMMON_DEPENDENCIES) \ 15*4882a593Smuzhiyun $(BR_LIBC) 16*4882a593Smuzhiyun 17*4882a593SmuzhiyunHOST_GCC_FINAL_EXCLUDES = $(HOST_GCC_EXCLUDES) 18*4882a593Smuzhiyun 19*4882a593Smuzhiyunifneq ($(ARCH_XTENSA_OVERLAY_FILE),) 20*4882a593SmuzhiyunHOST_GCC_FINAL_POST_EXTRACT_HOOKS += HOST_GCC_XTENSA_OVERLAY_EXTRACT 21*4882a593SmuzhiyunHOST_GCC_FINAL_EXTRA_DOWNLOADS += $(ARCH_XTENSA_OVERLAY_URL) 22*4882a593Smuzhiyunendif 23*4882a593Smuzhiyun 24*4882a593SmuzhiyunHOST_GCC_FINAL_POST_PATCH_HOOKS += HOST_GCC_APPLY_PATCHES 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun# gcc doesn't support in-tree build, so we create a 'build' 27*4882a593Smuzhiyun# subdirectory in the gcc sources, and build from there. 28*4882a593SmuzhiyunHOST_GCC_FINAL_SUBDIR = build 29*4882a593Smuzhiyun 30*4882a593SmuzhiyunHOST_GCC_FINAL_PRE_CONFIGURE_HOOKS += HOST_GCC_CONFIGURE_SYMLINK 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun# We want to always build the static variants of all the gcc libraries, 33*4882a593Smuzhiyun# of which libstdc++, libgomp, libmudflap... 34*4882a593Smuzhiyun# To do so, we can not just pass --enable-static to override the generic 35*4882a593Smuzhiyun# --disable-static flag, otherwise gcc fails to build some of those 36*4882a593Smuzhiyun# libraries, see; 37*4882a593Smuzhiyun# http://lists.busybox.net/pipermail/buildroot/2013-October/080412.html 38*4882a593Smuzhiyun# 39*4882a593Smuzhiyun# So we must completely override the generic commands and provide our own. 40*4882a593Smuzhiyun# 41*4882a593Smuzhiyundefine HOST_GCC_FINAL_CONFIGURE_CMDS 42*4882a593Smuzhiyun (cd $(HOST_GCC_FINAL_SRCDIR) && rm -rf config.cache; \ 43*4882a593Smuzhiyun $(HOST_CONFIGURE_OPTS) \ 44*4882a593Smuzhiyun CFLAGS="$(HOST_CFLAGS)" \ 45*4882a593Smuzhiyun LDFLAGS="$(HOST_LDFLAGS)" \ 46*4882a593Smuzhiyun $(HOST_GCC_FINAL_CONF_ENV) \ 47*4882a593Smuzhiyun ./configure \ 48*4882a593Smuzhiyun --prefix="$(HOST_DIR)" \ 49*4882a593Smuzhiyun --sysconfdir="$(HOST_DIR)/etc" \ 50*4882a593Smuzhiyun --enable-static \ 51*4882a593Smuzhiyun $(QUIET) $(HOST_GCC_FINAL_CONF_OPTS) \ 52*4882a593Smuzhiyun ) 53*4882a593Smuzhiyunendef 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun# Languages supported by the cross-compiler 56*4882a593SmuzhiyunGCC_FINAL_CROSS_LANGUAGES-y = c 57*4882a593SmuzhiyunGCC_FINAL_CROSS_LANGUAGES-$(BR2_INSTALL_LIBSTDCPP) += c++ 58*4882a593SmuzhiyunGCC_FINAL_CROSS_LANGUAGES-$(BR2_TOOLCHAIN_BUILDROOT_DLANG) += d 59*4882a593SmuzhiyunGCC_FINAL_CROSS_LANGUAGES-$(BR2_TOOLCHAIN_BUILDROOT_FORTRAN) += fortran 60*4882a593SmuzhiyunGCC_FINAL_CROSS_LANGUAGES = $(subst $(space),$(comma),$(GCC_FINAL_CROSS_LANGUAGES-y)) 61*4882a593Smuzhiyun 62*4882a593SmuzhiyunHOST_GCC_FINAL_CONF_OPTS = \ 63*4882a593Smuzhiyun $(HOST_GCC_COMMON_CONF_OPTS) \ 64*4882a593Smuzhiyun --enable-languages=$(GCC_FINAL_CROSS_LANGUAGES) \ 65*4882a593Smuzhiyun --with-build-time-tools=$(HOST_DIR)/$(GNU_TARGET_NAME)/bin 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun# The kernel wants to use the -m4-nofpu option to make sure that it 68*4882a593Smuzhiyun# doesn't use floating point operations. 69*4882a593Smuzhiyunifeq ($(BR2_sh4)$(BR2_sh4eb),y) 70*4882a593SmuzhiyunHOST_GCC_FINAL_CONF_OPTS += "--with-multilib-list=m4,m4-nofpu" 71*4882a593SmuzhiyunHOST_GCC_FINAL_GCC_LIB_DIR = $(HOST_DIR)/$(GNU_TARGET_NAME)/lib/!m4* 72*4882a593Smuzhiyunelse ifeq ($(BR2_sh4a)$(BR2_sh4aeb),y) 73*4882a593SmuzhiyunHOST_GCC_FINAL_CONF_OPTS += "--with-multilib-list=m4a,m4a-nofpu" 74*4882a593SmuzhiyunHOST_GCC_FINAL_GCC_LIB_DIR = $(HOST_DIR)/$(GNU_TARGET_NAME)/lib/!m4* 75*4882a593Smuzhiyunelse 76*4882a593SmuzhiyunHOST_GCC_FINAL_GCC_LIB_DIR = $(HOST_DIR)/$(GNU_TARGET_NAME)/lib* 77*4882a593Smuzhiyunendif 78*4882a593Smuzhiyun 79*4882a593Smuzhiyunifeq ($(BR2_GCC_SUPPORTS_LIBCILKRTS),y) 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun# libcilkrts does not support v8 82*4882a593Smuzhiyunifeq ($(BR2_sparc),y) 83*4882a593SmuzhiyunHOST_GCC_FINAL_CONF_OPTS += --disable-libcilkrts 84*4882a593Smuzhiyunendif 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun# Pthreads are required to build libcilkrts 87*4882a593Smuzhiyunifeq ($(BR2_PTHREADS_NONE),y) 88*4882a593SmuzhiyunHOST_GCC_FINAL_CONF_OPTS += --disable-libcilkrts 89*4882a593Smuzhiyunendif 90*4882a593Smuzhiyun 91*4882a593Smuzhiyunifeq ($(BR2_STATIC_LIBS),y) 92*4882a593Smuzhiyun# disable libcilkrts as there is no static version 93*4882a593SmuzhiyunHOST_GCC_FINAL_CONF_OPTS += --disable-libcilkrts 94*4882a593Smuzhiyunendif 95*4882a593Smuzhiyun 96*4882a593Smuzhiyunendif # BR2_GCC_SUPPORTS_LIBCILKRTS 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun# Disable shared libs like libstdc++ if we do static since it confuses linking 99*4882a593Smuzhiyunifeq ($(BR2_STATIC_LIBS),y) 100*4882a593SmuzhiyunHOST_GCC_FINAL_CONF_OPTS += --disable-shared 101*4882a593Smuzhiyunelse 102*4882a593SmuzhiyunHOST_GCC_FINAL_CONF_OPTS += --enable-shared 103*4882a593Smuzhiyunendif 104*4882a593Smuzhiyun 105*4882a593Smuzhiyunifeq ($(BR2_GCC_ENABLE_OPENMP),y) 106*4882a593SmuzhiyunHOST_GCC_FINAL_CONF_OPTS += --enable-libgomp 107*4882a593Smuzhiyunelse 108*4882a593SmuzhiyunHOST_GCC_FINAL_CONF_OPTS += --disable-libgomp 109*4882a593Smuzhiyunendif 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun# End with user-provided options, so that they can override previously 112*4882a593Smuzhiyun# defined options. 113*4882a593SmuzhiyunHOST_GCC_FINAL_CONF_OPTS += \ 114*4882a593Smuzhiyun $(call qstrip,$(BR2_EXTRA_GCC_CONFIG_OPTIONS)) 115*4882a593Smuzhiyun 116*4882a593SmuzhiyunHOST_GCC_FINAL_CONF_ENV = \ 117*4882a593Smuzhiyun $(HOST_GCC_COMMON_CONF_ENV) 118*4882a593Smuzhiyun 119*4882a593SmuzhiyunHOST_GCC_FINAL_MAKE_OPTS += $(HOST_GCC_COMMON_MAKE_OPTS) 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun# Make sure we have 'cc' 122*4882a593Smuzhiyundefine HOST_GCC_FINAL_CREATE_CC_SYMLINKS 123*4882a593Smuzhiyun if [ ! -e $(HOST_DIR)/bin/$(GNU_TARGET_NAME)-cc ]; then \ 124*4882a593Smuzhiyun ln -f $(HOST_DIR)/bin/$(GNU_TARGET_NAME)-gcc \ 125*4882a593Smuzhiyun $(HOST_DIR)/bin/$(GNU_TARGET_NAME)-cc; \ 126*4882a593Smuzhiyun fi 127*4882a593Smuzhiyunendef 128*4882a593Smuzhiyun 129*4882a593SmuzhiyunHOST_GCC_FINAL_POST_INSTALL_HOOKS += HOST_GCC_FINAL_CREATE_CC_SYMLINKS 130*4882a593Smuzhiyun 131*4882a593SmuzhiyunHOST_GCC_FINAL_TOOLCHAIN_WRAPPER_ARGS += $(HOST_GCC_COMMON_TOOLCHAIN_WRAPPER_ARGS) 132*4882a593SmuzhiyunHOST_GCC_FINAL_POST_BUILD_HOOKS += TOOLCHAIN_WRAPPER_BUILD 133*4882a593SmuzhiyunHOST_GCC_FINAL_POST_INSTALL_HOOKS += TOOLCHAIN_WRAPPER_INSTALL 134*4882a593Smuzhiyun# Note: this must be done after CREATE_CC_SYMLINKS, otherwise the 135*4882a593Smuzhiyun# -cc symlink to the wrapper is not created. 136*4882a593SmuzhiyunHOST_GCC_FINAL_POST_INSTALL_HOOKS += HOST_GCC_INSTALL_WRAPPER_AND_SIMPLE_SYMLINKS 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun# coldfire is not working without removing these object files from libgcc.a 139*4882a593Smuzhiyunifeq ($(BR2_m68k_cf),y) 140*4882a593Smuzhiyundefine HOST_GCC_FINAL_M68K_LIBGCC_FIXUP 141*4882a593Smuzhiyun find $(STAGING_DIR) -name libgcc.a -print | \ 142*4882a593Smuzhiyun while read t; do $(GNU_TARGET_NAME)-ar dv "$t" _ctors.o; done 143*4882a593Smuzhiyunendef 144*4882a593SmuzhiyunHOST_GCC_FINAL_POST_INSTALL_HOOKS += HOST_GCC_FINAL_M68K_LIBGCC_FIXUP 145*4882a593Smuzhiyunendif 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun# Cannot use the HOST_GCC_FINAL_USR_LIBS mechanism below, because we want 148*4882a593Smuzhiyun# libgcc_s to be installed in /lib and not /usr/lib. 149*4882a593Smuzhiyundefine HOST_GCC_FINAL_INSTALL_LIBGCC 150*4882a593Smuzhiyun -cp -dpf $(HOST_GCC_FINAL_GCC_LIB_DIR)/libgcc_s* \ 151*4882a593Smuzhiyun $(STAGING_DIR)/lib/ 152*4882a593Smuzhiyun -cp -dpf $(HOST_GCC_FINAL_GCC_LIB_DIR)/libgcc_s* \ 153*4882a593Smuzhiyun $(TARGET_DIR)/lib/ 154*4882a593Smuzhiyunendef 155*4882a593Smuzhiyun 156*4882a593SmuzhiyunHOST_GCC_FINAL_POST_INSTALL_HOOKS += HOST_GCC_FINAL_INSTALL_LIBGCC 157*4882a593Smuzhiyun 158*4882a593Smuzhiyundefine HOST_GCC_FINAL_INSTALL_LIBATOMIC 159*4882a593Smuzhiyun -cp -dpf $(HOST_GCC_FINAL_GCC_LIB_DIR)/libatomic* \ 160*4882a593Smuzhiyun $(STAGING_DIR)/lib/ 161*4882a593Smuzhiyun -cp -dpf $(HOST_GCC_FINAL_GCC_LIB_DIR)/libatomic* \ 162*4882a593Smuzhiyun $(TARGET_DIR)/lib/ 163*4882a593Smuzhiyunendef 164*4882a593Smuzhiyun 165*4882a593SmuzhiyunHOST_GCC_FINAL_POST_INSTALL_HOOKS += HOST_GCC_FINAL_INSTALL_LIBATOMIC 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun# Handle the installation of libraries in /usr/lib 168*4882a593SmuzhiyunHOST_GCC_FINAL_USR_LIBS = 169*4882a593Smuzhiyun 170*4882a593Smuzhiyunifeq ($(BR2_INSTALL_LIBSTDCPP),y) 171*4882a593SmuzhiyunHOST_GCC_FINAL_USR_LIBS += libstdc++ 172*4882a593Smuzhiyunendif 173*4882a593Smuzhiyun 174*4882a593Smuzhiyunifeq ($(BR2_TOOLCHAIN_BUILDROOT_DLANG),y) 175*4882a593SmuzhiyunHOST_GCC_FINAL_USR_LIBS += libgdruntime libgphobos 176*4882a593Smuzhiyunendif 177*4882a593Smuzhiyun 178*4882a593Smuzhiyunifeq ($(BR2_TOOLCHAIN_BUILDROOT_FORTRAN),y) 179*4882a593SmuzhiyunHOST_GCC_FINAL_USR_LIBS += libgfortran 180*4882a593Smuzhiyun# fortran needs quadmath on x86 and x86_64 181*4882a593Smuzhiyunifeq ($(BR2_TOOLCHAIN_HAS_LIBQUADMATH),y) 182*4882a593SmuzhiyunHOST_GCC_FINAL_USR_LIBS += libquadmath 183*4882a593Smuzhiyunendif 184*4882a593Smuzhiyunendif 185*4882a593Smuzhiyun 186*4882a593Smuzhiyunifeq ($(BR2_GCC_ENABLE_OPENMP),y) 187*4882a593SmuzhiyunHOST_GCC_FINAL_USR_LIBS += libgomp 188*4882a593Smuzhiyunendif 189*4882a593Smuzhiyun 190*4882a593SmuzhiyunHOST_GCC_FINAL_USR_LIBS += $(call qstrip,$(BR2_TOOLCHAIN_EXTRA_LIBS)) 191*4882a593Smuzhiyun 192*4882a593Smuzhiyunifneq ($(HOST_GCC_FINAL_USR_LIBS),) 193*4882a593Smuzhiyundefine HOST_GCC_FINAL_INSTALL_STATIC_LIBS 194*4882a593Smuzhiyun for i in $(HOST_GCC_FINAL_USR_LIBS) ; do \ 195*4882a593Smuzhiyun cp -dpf $(HOST_GCC_FINAL_GCC_LIB_DIR)/$${i}.a \ 196*4882a593Smuzhiyun $(STAGING_DIR)/usr/lib/ ; \ 197*4882a593Smuzhiyun done 198*4882a593Smuzhiyunendef 199*4882a593Smuzhiyun 200*4882a593Smuzhiyunifeq ($(BR2_STATIC_LIBS),) 201*4882a593Smuzhiyundefine HOST_GCC_FINAL_INSTALL_SHARED_LIBS 202*4882a593Smuzhiyun for i in $(HOST_GCC_FINAL_USR_LIBS) ; do \ 203*4882a593Smuzhiyun cp -dpf $(HOST_GCC_FINAL_GCC_LIB_DIR)/$${i}.so* \ 204*4882a593Smuzhiyun $(STAGING_DIR)/usr/lib/ ; \ 205*4882a593Smuzhiyun cp -dpf $(HOST_GCC_FINAL_GCC_LIB_DIR)/$${i}.so* \ 206*4882a593Smuzhiyun $(TARGET_DIR)/usr/lib/ ; \ 207*4882a593Smuzhiyun done 208*4882a593Smuzhiyunendef 209*4882a593Smuzhiyunendif 210*4882a593Smuzhiyun 211*4882a593Smuzhiyundefine HOST_GCC_FINAL_INSTALL_USR_LIBS 212*4882a593Smuzhiyun mkdir -p $(TARGET_DIR)/usr/lib 213*4882a593Smuzhiyun $(HOST_GCC_FINAL_INSTALL_STATIC_LIBS) 214*4882a593Smuzhiyun $(HOST_GCC_FINAL_INSTALL_SHARED_LIBS) 215*4882a593Smuzhiyunendef 216*4882a593SmuzhiyunHOST_GCC_FINAL_POST_INSTALL_HOOKS += HOST_GCC_FINAL_INSTALL_USR_LIBS 217*4882a593Smuzhiyunendif 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun$(eval $(host-autotools-package)) 220