xref: /OK3568_Linux_fs/buildroot/package/gcc/gcc-final/gcc-final.mk (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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