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