or1k: default to 4.13
[openadk.git] / toolchain / gcc / Makefile
blob095e6649aa58a326c2af109535b4154dc83f223e
1 # This file is part of the OpenADK project. OpenADK is copyrighted
2 # material, please see the LICENCE file in the top-level directory.
4 include $(ADK_TOPDIR)/rules.mk
5 include ../rules.mk
6 include Makefile.inc
8 # disable SSP for libstdc++
9 ifeq ($(ADK_TARGET_LIB_MUSL),y)
10 TARGET_CFLAGS:= $(filter-out -fstack-protector-all,$(TARGET_CFLAGS))
11 TARGET_CXXFLAGS:= $(filter-out -fstack-protector-all,$(TARGET_CXXFLAGS))
12 endif
14 # disable lto for gcc
15 TARGET_CFLAGS:= $(filter-out -flto,$(TARGET_CFLAGS))
16 TARGET_CXXFLAGS:= $(filter-out -flto,$(TARGET_CXXFLAGS))
18 # for uClinux, we need to filter out some flags
19 ifeq ($(ADK_TARGET_UCLINUX),y)
20 TARGET_CFLAGS:= $(filter-out -msep-data,$(TARGET_CFLAGS))
21 TARGET_CXXFLAGS:= $(filter-out -msep-data,$(TARGET_CXXFLAGS))
22 endif
24 GCC_CONFOPTS:= --prefix=$(TOOLCHAIN_DIR)/usr \
25 --with-bugurl="http://www.openadk.org/" \
26 --build=$(GNU_HOST_NAME) \
27 --host=$(GNU_HOST_NAME) \
28 --target=$(GNU_TARGET_NAME) \
29 --with-gmp=$(STAGING_HOST_DIR)/usr \
30 --with-mpfr=$(STAGING_HOST_DIR)/usr \
31 --disable-__cxa_atexit \
32 --with-system-zlib \
33 --with-gnu-ld \
34 --with-gnu-as \
35 --disable-libsanitizer \
36 --disable-install-libiberty \
37 --disable-libitm \
38 --disable-libmudflap \
39 --disable-libgomp \
40 --disable-libmpx \
41 --disable-libcilkrts \
42 --disable-libquadmath \
43 --disable-libquadmath-support \
44 --disable-decimal-float \
45 --disable-libstdcxx-pch \
46 --disable-ppl-version-check \
47 --disable-cloog-version-check \
48 --without-ppl \
49 --without-cloog \
50 --without-isl \
51 --disable-werror \
52 --disable-nls
54 ifeq ($(ADK_TARGET_WITH_NPTL),y)
55 GCC_FINAL_CONFOPTS:= --enable-tls --enable-threads --enable-libatomic
56 GCC_TLS_CONFOPTS:= --enable-tls
57 endif
58 ifeq ($(ADK_TARGET_WITH_LT),y)
59 GCC_FINAL_CONFOPTS:= --disable-tls --enable-threads --disable-libatomic
60 GCC_TLS_CONFOPTS:= --disable-tls
61 endif
62 ifeq ($(ADK_TARGET_LIB_WITHOUT_THREADS)$(ADK_TARGET_WITHOUT_THREADS),y)
63 GCC_FINAL_CONFOPTS:= --disable-tls --disable-threads --disable-libatomic
64 GCC_TLS_CONFOPTS:= --disable-tls
65 endif
67 ifeq ($(ADK_TARGET_LIB_NEWLIB),y)
68 GCC_FINAL_CONFOPTS+= --with-newlib
69 endif
71 ifeq ($(ADK_TARGET_OS_FROSTED)$(ADK_TARGET_USE_STATIC_LIBS_ONLY),y)
72 GCC_FINAL_CONFOPTS+= --disable-shared
73 else
74 GCC_FINAL_CONFOPTS+= --enable-shared --enable-cxx-flags='-fPIC'
75 endif
77 ifeq ($(ADK_TOOLCHAIN_WITH_SSP),y)
78 GCC_FINAL_CONFOPTS+= --enable-libssp
79 else
80 GCC_FINAL_CONFOPTS+= --disable-libssp
81 endif
83 ifeq ($(ADK_TOOLCHAIN_WITH_LTO),y)
84 GCC_CONFOPTS+= --enable-lto
85 else
86 GCC_CONFOPTS+= --disable-lto
87 endif
90 # architecture specific
92 ifneq ($(ADK_TARGET_GCC_CPU),)
93 GCC_CONFOPTS+= --with-cpu=$(ADK_TARGET_GCC_CPU)
94 endif
96 ifneq ($(ADK_TARGET_GCC_ARCH),)
97 GCC_CONFOPTS+= --with-arch=$(ADK_TARGET_GCC_ARCH)
98 endif
100 ifneq ($(ADK_TARGET_FLOAT),)
101 GCC_CONFOPTS+= --with-float=$(ADK_TARGET_FLOAT)
102 endif
104 ifneq ($(ADK_TARGET_FPU),)
105 GCC_CONFOPTS+= --with-fpu=$(ADK_TARGET_FPU)
106 endif
108 ifneq ($(ADK_TARGET_INSTRUCTION_SET),)
109 GCC_CONFOPTS+= --with-mode=$(ADK_TARGET_INSTRUCTION_SET)
110 endif
112 ifneq ($(ADK_TARGET_NAN_MODE),)
113 GCC_CONFOPTS+= --with-nan=$(ADK_TARGET_NAN_MODE)
114 endif
116 # .symver is broken for Blackfin, simple C++ apps fail to link
117 ifeq ($(ADK_TARGET_ARCH_BFIN),y)
118 GCC_CONFOPTS+= --disable-symvers
119 endif
121 ifeq ($(ADK_TARGET_ARCH_CSKY),y)
122 GCC_CONFOPTS+= --with-cskyabi=abiv1
123 endif
125 ifeq ($(ADK_TARGET_ARCH_METAG),y)
126 GCC_CONFOPTS+= --with-cpu=2.1 --enable-meta-default --disable-symvers
127 endif
129 ifeq ($(ADK_TARGET_CPU_CF),y)
130 GCC_CONFOPTS+= --with-arch=cf --disable-multilib
131 endif
133 ifeq ($(ADK_TARGET_ARCH_NDS32),y)
134 GCC_CONFOPTS+= --with-arch=v3
135 endif
137 ifeq ($(ADK_TARGET_ARCH_M68K)$(ADK_TARGET_ARCH_X86_64)$(ADK_TARGET_ARCH_X86),)
138 GCC_FINAL_CONFOPTS+= --disable-biarch --disable-multilib
139 endif
141 ifeq ($(ADK_TARGET_ARCH_SH),y)
143 ifeq ($(ADK_TARGET_LITTLE_ENDIAN),y)
144 GCC_CONFOPTS+= --with-endian=little
145 else
146 GCC_CONFOPTS+= --with-endian=big
147 endif
148 ifeq ($(ADK_TARGET_BINFMT_FDPIC),y)
149 GCC_CONFOPTS+= --enable-fdpic
150 endif
152 ifeq ($(ADK_TARGET_CPU_SH_J2),y)
153 GCC_CONFOPTS+= --with-multilib-list=mj2
154 endif
155 ifeq ($(ADK_TARGET_CPU_SH_SH2),y)
156 GCC_CONFOPTS+= --with-multilib-list=m2
157 endif
158 ifeq ($(ADK_TARGET_CPU_SH_SH2A),y)
159 GCC_CONFOPTS+= --with-multilib-list=m2a,m2a-nofpu
160 endif
161 ifeq ($(ADK_TARGET_CPU_SH_SH3),y)
162 GCC_CONFOPTS+= --with-multilib-list=m3
163 endif
164 ifeq ($(ADK_TARGET_CPU_SH_SH4),y)
165 GCC_CONFOPTS+= --with-multilib-list=m4,m4-nofpu
166 endif
167 ifeq ($(ADK_TARGET_CPU_SH_SH4A),y)
168 GCC_CONFOPTS+= --with-multilib-list=m4a,m4a-nofpu
169 endif
171 endif
173 ifeq ($(ADK_TARGET_ARCH_X86),y)
174 ifeq ($(ADK_TARGET_KERNEL_64),y)
175 GCC_FINAL_CONFOPTS+= --enable-biarch --enable-targets=all --disable-multilib
176 else
177 GCC_FINAL_CONFOPTS+= --disable-biarch --disable-multilib
178 endif
179 endif
181 ifeq ($(ADK_TARGET_ARCH_X86_64),y)
182 ifneq ($(ADK_TARGET_ABI_X32),)
183 GCC_CONFOPTS+= --with-abi=x32 --enable-multilib
184 else
185 GCC_CONFOPTS+= --disable-biarch --disable-multilib
186 endif
187 endif
189 ifeq ($(ADK_TARGET_ARCH_ALPHA),y)
190 GCC_CONFOPTS+= --without-long-double-128
191 endif
193 ifeq ($(ADK_TARGET_ARCH_PPC),y)
194 GCC_CONFOPTS+= --with-long-double-64 --enable-secureplt
195 endif
197 ifeq ($(ADK_TARGET_ARCH_PPC64),y)
198 ifeq ($(ADK_TARGET_LIB_GLIBC),y)
199 GCC_CONFOPTS+= --with-long-double-128 --with-abi=elfv2
200 else
201 GCC_CONFOPTS+= --without-long-double-128 --with-abi=elfv2
202 endif
203 endif
205 ifneq ($(ADK_TARGET_MIPS_ABI),)
206 GCC_CONFOPTS+= --with-abi=${ADK_TARGET_MIPS_ABI}
207 endif
209 ifeq (${ADK_MAKE_PARALLEL},y)
210 GCC_MAKEOPTS+= -j${ADK_MAKE_JOBS}
211 endif
213 USE_LANG:=c
214 ifeq ($(ADK_TOOLCHAIN_WITH_CXX),y)
215 USE_LANG+=c++
216 endif
217 ifeq ($(ADK_TOOLCHAIN_WITH_OBJC),y)
218 USE_LANG+=objc
219 endif
220 ifeq ($(ADK_TOOLCHAIN_WITH_FORTRAN),y)
221 USE_LANG+=fortran
222 endif
223 ifeq ($(ADK_TOOLCHAIN_WITH_GO),y)
224 USE_LANG+=go
225 endif
227 LANGUAGES=$(shell echo ${USE_LANG} |tr ' ' ',')
229 include ${ADK_TOPDIR}/mk/buildhlp.mk
231 GCC_BUILD_DIR_INITIAL:= $(WRKBUILD)-initial
232 GCC_BUILD_DIR_FINAL:= $(WRKBUILD)-final
234 $(GCC_BUILD_DIR_INITIAL)/.configured:
235 ifeq ($(ADK_TARGET_ARCH_XTENSA),y)
236 tar xf $(ADK_TOPDIR)/target/xtensa/overlay/xtensa_$(ADK_TARGET_CPU_TYPE).tar \
237 --strip-components=1 -C $(WRKSRC) gcc
238 endif
239 mkdir -p $(GCC_BUILD_DIR_INITIAL)
240 # these symlinks are very important, do not remove
241 rm -rf $(TOOLCHAIN_DIR)/usr/$(GNU_TARGET_NAME)/sys-include
242 mkdir -p $(TOOLCHAIN_DIR)/usr/$(GNU_TARGET_NAME)
243 (cd $(TOOLCHAIN_DIR)/usr/$(GNU_TARGET_NAME); \
244 ln -s ../$(STAGING_HOST2TARGET)/usr/include sys-include)
245 rm -rf ${TOOLCHAIN_DIR}/usr/$(GNU_TARGET_NAME)/lib
246 (cd $(TOOLCHAIN_DIR)/usr/$(GNU_TARGET_NAME); \
247 ln -s ../$(STAGING_HOST2TARGET)/usr/lib lib)
248 ifeq ($(ADK_TARGET_ARCH_SH),y)
249 ifeq ($(ADK_TARGET_CPU_SH_J2),y)
250 (cd ${STAGING_TARGET_DIR}/ && ln -sf . mj2)
251 endif
252 ifeq ($(ADK_TARGET_CPU_SH_SH2),y)
253 (cd ${STAGING_TARGET_DIR}/ && ln -sf . m2)
254 endif
255 ifeq ($(ADK_TARGET_CPU_SH_SH2A),y)
256 (cd ${STAGING_TARGET_DIR}/ && ln -sf . m2a)
257 endif
258 ifeq ($(ADK_TARGET_CPU_SH_SH3),y)
259 (cd ${STAGING_TARGET_DIR}/ && ln -sf . m3)
260 endif
261 ifeq ($(ADK_TARGET_CPU_SH_SH4),y)
262 (cd ${STAGING_TARGET_DIR}/ && ln -sf . m4)
263 endif
264 ifeq ($(ADK_TARGET_CPU_SH_SH4A),y)
265 (cd ${STAGING_TARGET_DIR}/ && ln -sf . m4a)
266 endif
267 endif
268 $(SED) '/k prot/agcc_cv_libc_provides_ssp=yes' $(WRKBUILD)/gcc/configure
269 cd $(GCC_BUILD_DIR_INITIAL); \
270 PATH='$(TARGET_PATH)' \
271 CC='$(HOST_CC)' \
272 CXX='$(HOST_CXX)' \
273 CFLAGS="-O0 -g0 -fomit-frame-pointer" \
274 CXXFLAGS="-O0 -g0 -fomit-frame-pointer" \
275 $(WRKBUILD)/configure \
276 ${GCC_CONFOPTS} \
277 ${GCC_TLS_CONFOPTS} \
278 --enable-languages=c \
279 --with-newlib \
280 --disable-shared \
281 --disable-threads \
282 --disable-multilib \
283 --without-headers
284 touch $@
286 $(GCC_BUILD_DIR_INITIAL)/.compiled: $(GCC_BUILD_DIR_INITIAL)/.configured
287 ifeq ($(ADK_TOOLCHAIN_GCC_OLD),y)
288 PATH='$(TARGET_PATH)' \
289 $(MAKE) ${GCC_MAKEOPTS} -C $(GCC_BUILD_DIR_INITIAL) all-gcc
290 else
291 PATH='$(TARGET_PATH)' \
292 $(MAKE) ${GCC_MAKEOPTS} -C $(GCC_BUILD_DIR_INITIAL) all-gcc all-target-libgcc
293 endif
294 touch $@
296 $(WRKBUILD)/.configured: $(GCC_BUILD_DIR_INITIAL)/.compiled
297 ifeq ($(ADK_TOOLCHAIN_GCC_OLD),y)
298 PATH='$(TARGET_PATH)' \
299 $(MAKE) -C $(GCC_BUILD_DIR_INITIAL) install-gcc
300 else
301 PATH='$(TARGET_PATH)' \
302 $(MAKE) -C $(GCC_BUILD_DIR_INITIAL) install-gcc install-target-libgcc
303 endif
304 # required for newlib
305 (cd $(TOOLCHAIN_DIR)/usr/bin && \
306 ln -sf $(GNU_TARGET_NAME)-gcc $(GNU_TARGET_NAME)-cc \
308 touch $@
310 $(WRKBUILD)/.compiled:
311 mkdir -p $(GCC_BUILD_DIR_FINAL)
312 cd $(GCC_BUILD_DIR_FINAL); \
313 PATH='$(TARGET_PATH)' \
314 CC='$(HOST_CC)' \
315 CXX='$(HOST_CXX)' \
316 CFLAGS_FOR_TARGET='$(TARGET_CFLAGS)' \
317 CXXFLAGS_FOR_TARGET='$(TARGET_CXXFLAGS)' \
318 $(WRKBUILD)/configure \
319 ${GCC_CONFOPTS} \
320 ${GCC_FINAL_CONFOPTS} \
321 --enable-languages=$(LANGUAGES) \
322 --with-build-sysroot='$${prefix}/${STAGING_HOST2TARGET}' \
323 --with-sysroot='$${prefix}/${STAGING_HOST2TARGET}'
324 PATH='$(TARGET_PATH)' $(MAKE) -C $(GCC_BUILD_DIR_FINAL) configure-host
325 cd $(GCC_BUILD_DIR_FINAL); \
326 PATH='$(TARGET_PATH)' \
327 $(MAKE) ${GCC_MAKEOPTS} all
328 touch $@
330 $(WRKBUILD)/.installed: $(WRKBUILD)/.compiled
331 cd $(GCC_BUILD_DIR_FINAL); \
332 PATH='$(TARGET_PATH)' \
333 $(MAKE) install
334 # remove duplicate tools, convert hardlinks to symlinks
335 set -e; \
336 cd $(TOOLCHAIN_DIR)/usr/$(GNU_TARGET_NAME)/bin; \
337 for app in ar as c++ g++ gcc ld ld.gold ld.bfd nm objcopy objdump ranlib strip; do \
338 ln -sf ../../bin/$(GNU_TARGET_NAME)-$${app} $${app}; \
339 done;
340 (cd $(TOOLCHAIN_DIR)/usr/bin && \
341 ln -sf $(GNU_TARGET_NAME)-gcc $(GNU_TARGET_NAME)-gcc-${PKG_VERSION} && \
342 ln -sf $(GNU_TARGET_NAME)-g++ $(GNU_TARGET_NAME)-g++-${PKG_VERSION} \
344 touch $@
346 $(WRKBUILD)/.final:
347 ifeq ($(ADK_TARGET_CPU_CF),y)
348 find $(STAGING_TARGET_DIR) -name libgcc.a -print | while read t; do $(GNU_TARGET_NAME)-ar dv "$t" _ctors.o; done
349 endif
350 # remove any libiberty.a, breaking package/binutils later
351 -rm $(STAGING_TARGET_DIR)/usr/lib/libiberty.a
352 # cleanup unneeded docs
353 rm -rf $(TOOLCHAIN_DIR)/usr/share
354 # cleanup unneeded libtool files
355 -find $(STAGING_TARGET_DIR) $(STAGING_HOST_DIR) -name \*.la -exec rm {} \;
356 # strip target libs and host tools for toolchain builds in non-Debug mode
357 ifeq ($(ADK_DEBUG),)
358 PATH="$(TARGET_PATH)" debug='0' prefix='${TARGET_CROSS}' ${BASH} ${SCRIPT_DIR}/rstrip.sh \
359 $(STAGING_TARGET_DIR) $(TOOLCHAIN_DIR)/usr/lib/gcc/$(GNU_TARGET_NAME)
360 debug='0' prefix=' ' ${BASH} ${SCRIPT_DIR}/rstrip.sh $(TOOLCHAIN_DIR)/usr/bin
361 endif
362 touch $@
364 include ${ADK_TOPDIR}/mk/toolchain.mk