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
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
))
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
))
24 # for ARM, we need to filter out some flags
25 ifeq ($(ADK_TARGET_ARCH_ARM
),y
)
26 TARGET_CFLAGS
:= $(filter-out -mcpu
=cortex-a9
,$(TARGET_CFLAGS
))
27 TARGET_CXXFLAGS
:= $(filter-out -mcpu
=cortex-a9
,$(TARGET_CXXFLAGS
))
30 ifeq ($(ADK_TARGET_USE_STATIC_AND_SHARED_LIBS
),y
)
31 TARGET_CFLAGS
:= $(filter-out -static
,$(TARGET_CFLAGS
))
32 TARGET_CXXFLAGS
:= $(filter-out -static
,$(TARGET_CXXFLAGS
))
35 GCC_CONFOPTS
:= --prefix=$(TOOLCHAIN_DIR
)/usr \
36 --with-bugurl
="$(ADK_VENDOR_URL)" \
37 --build
=$(GNU_HOST_NAME
) \
38 --host
=$(GNU_HOST_NAME
) \
39 --target
=$(GNU_TARGET_NAME
) \
40 --with-gmp
=$(STAGING_HOST_DIR
)/usr \
41 --with-mpfr
=$(STAGING_HOST_DIR
)/usr \
42 --disable-__cxa_atexit \
46 --disable-libsanitizer \
47 --disable-install-libiberty \
49 --disable-libmudflap \
53 --disable-libcilkrts \
54 --disable-libquadmath \
55 --disable-libquadmath-support \
56 --disable-decimal-float \
57 --disable-libstdcxx-pch \
58 --disable-ppl-version-check \
59 --disable-cloog-version-check \
66 ifeq ($(ADK_TARGET_OS_LINUX
),y
)
67 ifeq ($(ADK_TARGET_LIB_UCLIBC_NG
),y
)
68 ifeq ($(ADK_TARGET_WITH_NPTL
),y
)
69 GCC_FINAL_CONFOPTS
:= --enable-tls
--enable-threads
--enable-libatomic
70 GCC_TLS_CONFOPTS
:= --enable-tls
72 ifeq ($(ADK_TARGET_WITH_LT
),y
)
73 GCC_FINAL_CONFOPTS
:= --disable-tls
--enable-threads
--disable-libatomic
74 GCC_TLS_CONFOPTS
:= --disable-tls
76 ifeq ($(ADK_TARGET_LIB_WITHOUT_THREADS
)$(ADK_TARGET_WITHOUT_THREADS
),y
)
77 GCC_FINAL_CONFOPTS
:= --disable-tls
--disable-threads
--disable-libatomic
78 GCC_TLS_CONFOPTS
:= --disable-tls
81 GCC_FINAL_CONFOPTS
:= --enable-tls
--enable-threads
--enable-libatomic
82 GCC_TLS_CONFOPTS
:= --enable-tls
86 ifeq ($(ADK_TARGET_OS_BAREMETAL
),y
)
87 GCC_FINAL_CONFOPTS
:= --disable-libatomic
90 ifeq ($(ADK_TARGET_LIB_NEWLIB
),y
)
91 GCC_FINAL_CONFOPTS
+= --with-newlib
94 ifeq ($(ADK_TARGET_USE_STATIC_LIBS_ONLY
),y
)
95 GCC_FINAL_CONFOPTS
+= --disable-shared
97 GCC_FINAL_CONFOPTS
+= --enable-shared
--enable-cxx-flags
='-fPIC'
100 ifeq ($(ADK_TOOLCHAIN_WITH_SSP
),y
)
101 GCC_FINAL_CONFOPTS
+= --enable-libssp
103 GCC_FINAL_CONFOPTS
+= --disable-libssp
106 ifeq ($(ADK_TOOLCHAIN_WITH_LTO
),y
)
107 GCC_CONFOPTS
+= --enable-lto
109 GCC_CONFOPTS
+= --disable-lto
113 # architecture specific
115 ifneq ($(ADK_TARGET_GCC_CPU
),)
116 GCC_CONFOPTS
+= --with-cpu
=$(ADK_TARGET_GCC_CPU
)
119 ifneq ($(ADK_TARGET_GCC_ARCH
),)
120 GCC_CONFOPTS
+= --with-arch
=$(ADK_TARGET_GCC_ARCH
)
123 ifneq ($(ADK_TARGET_FLOAT
),)
124 GCC_CONFOPTS
+= --with-float
=$(ADK_TARGET_FLOAT
)
127 ifneq ($(ADK_TARGET_FPU
),)
128 GCC_CONFOPTS
+= --with-fpu
=$(ADK_TARGET_FPU
)
131 ifneq ($(ADK_TARGET_INSTRUCTION_SET
),)
132 GCC_CONFOPTS
+= --with-mode
=$(ADK_TARGET_INSTRUCTION_SET
)
135 ifneq ($(ADK_TARGET_NAN_MODE
),)
136 GCC_CONFOPTS
+= --with-nan
=$(ADK_TARGET_NAN_MODE
)
139 # .symver is broken for Blackfin, simple C++ apps fail to link
140 ifeq ($(ADK_TARGET_ARCH_BFIN
),y
)
141 GCC_CONFOPTS
+= --disable-symvers
144 ifeq ($(ADK_TARGET_ARCH_CSKY
),y
)
145 ifeq ($(ADK_TARGET_CPU_CSKY_CK610
),y
)
146 GCC_CONFOPTS
+= --with-cskyabi
=abiv1
148 GCC_CONFOPTS
+= --with-cskyabi
=abiv2
152 ifeq ($(ADK_TARGET_ARCH_METAG
),y
)
153 GCC_CONFOPTS
+= --with-cpu
=2.1 --enable-meta-default
--disable-symvers
156 ifeq ($(ADK_TARGET_CPU_CF
),y
)
157 GCC_CONFOPTS
+= --with-arch
=cf
--disable-multilib
160 ifeq ($(ADK_TARGET_ARCH_NDS32
),y
)
161 GCC_CONFOPTS
+= --with-arch
=v3
164 ifeq ($(ADK_TARGET_ARCH_M68K
)$(ADK_TARGET_ARCH_X86_64
)$(ADK_TARGET_ARCH_X86
),)
165 GCC_FINAL_CONFOPTS
+= --disable-biarch
--disable-multilib
168 ifeq ($(ADK_TARGET_ARCH_SH
),y
)
170 ifeq ($(ADK_TARGET_LITTLE_ENDIAN
),y
)
171 GCC_CONFOPTS
+= --with-endian
=little
173 GCC_CONFOPTS
+= --with-endian
=big
175 ifeq ($(ADK_TARGET_BINFMT_FDPIC
),y
)
176 GCC_CONFOPTS
+= --enable-fdpic
179 ifeq ($(ADK_TARGET_CPU_SH_J2
),y
)
180 GCC_CONFOPTS
+= --with-multilib-list
=mj2
182 ifeq ($(ADK_TARGET_CPU_SH_SH2
),y
)
183 GCC_CONFOPTS
+= --with-multilib-list
=m2
185 ifeq ($(ADK_TARGET_CPU_SH_SH2A
),y
)
186 GCC_CONFOPTS
+= --with-multilib-list
=m2a
,m2a-nofpu
188 ifeq ($(ADK_TARGET_CPU_SH_SH3
),y
)
189 GCC_CONFOPTS
+= --with-multilib-list
=m3
191 ifeq ($(ADK_TARGET_CPU_SH_SH4
),y
)
192 GCC_CONFOPTS
+= --with-multilib-list
=m4
,m4-nofpu
194 ifeq ($(ADK_TARGET_CPU_SH_SH4A
),y
)
195 GCC_CONFOPTS
+= --with-multilib-list
=m4a
,m4a-nofpu
200 ifeq ($(ADK_TARGET_ARCH_X86
),y
)
201 ifeq ($(ADK_TARGET_KERNEL_64
),y
)
202 GCC_FINAL_CONFOPTS
+= --enable-biarch
--enable-targets
=all --disable-multilib
204 GCC_FINAL_CONFOPTS
+= --disable-biarch
--disable-multilib
208 ifeq ($(ADK_TARGET_ARCH_X86_64
),y
)
209 ifneq ($(ADK_TARGET_ABI_X32
),)
210 GCC_CONFOPTS
+= --with-abi
=x32
--enable-multilib
212 GCC_CONFOPTS
+= --disable-biarch
--disable-multilib
216 ifeq ($(ADK_TARGET_ARCH_ALPHA
),y
)
217 GCC_CONFOPTS
+= --without-long-double-128
220 ifeq ($(ADK_TARGET_ARCH_PPC
),y
)
221 GCC_CONFOPTS
+= --with-long-double-64
--enable-secureplt
224 ifeq ($(ADK_TARGET_ARCH_PPC64
),y
)
225 ifeq ($(ADK_TARGET_LIB_GLIBC
),y
)
226 GCC_CONFOPTS
+= --with-long-double-128
--with-abi
=elfv2
228 GCC_CONFOPTS
+= --without-long-double-128
--with-abi
=elfv2
232 ifeq ($(ADK_TARGET_ARCH_S390
),y
)
233 GCC_CONFOPTS
+= --with-long-double-128
236 ifneq ($(ADK_TARGET_ABI_MIPS64
),)
237 GCC_CONFOPTS
+= --with-abi
=${ADK_TARGET_ABI_MIPS64}
240 ifneq ($(ADK_TARGET_ABI_RISCV
),)
241 GCC_CONFOPTS
+= --with-abi
=${ADK_TARGET_ABI_RISCV}
244 ifeq (${ADK_MAKE_PARALLEL},y
)
245 GCC_MAKEOPTS
+= -j
${ADK_MAKE_JOBS}
249 ifeq ($(ADK_TOOLCHAIN_WITH_CXX
),y
)
252 ifeq ($(ADK_TOOLCHAIN_WITH_OBJC
),y
)
255 ifeq ($(ADK_TOOLCHAIN_WITH_FORTRAN
),y
)
258 ifeq ($(ADK_TOOLCHAIN_WITH_GO
),y
)
262 LANGUAGES
=$(shell echo
${USE_LANG} |tr
' ' ',')
264 include ${ADK_TOPDIR}/mk
/buildhlp.mk
266 GCC_BUILD_DIR_INITIAL
:= $(WRKBUILD
)-initial
267 GCC_BUILD_DIR_FINAL
:= $(WRKBUILD
)-final
269 $(GCC_BUILD_DIR_INITIAL
)/.configured
:
270 ifeq ($(ADK_TARGET_ARCH_XTENSA
),y
)
271 tar xf
$(ADK_TOPDIR
)/target
/xtensa
/overlay
/xtensa_
$(ADK_TARGET_CPU_TYPE
).
tar \
272 --strip-components
=1 -C
$(WRKSRC
) gcc
274 mkdir
-p
$(GCC_BUILD_DIR_INITIAL
)
275 # these symlinks are very important, do not remove
276 rm -rf
$(TOOLCHAIN_DIR
)/usr
/$(GNU_TARGET_NAME
)/sys-include
277 mkdir
-p
$(TOOLCHAIN_DIR
)/usr
/$(GNU_TARGET_NAME
)
278 (cd
$(TOOLCHAIN_DIR
)/usr
/$(GNU_TARGET_NAME
); \
279 ln
-s ..
/$(STAGING_HOST2TARGET
)/usr
/include sys-include
)
280 rm -rf
${TOOLCHAIN_DIR}/usr
/$(GNU_TARGET_NAME
)/lib
281 (cd
$(TOOLCHAIN_DIR
)/usr
/$(GNU_TARGET_NAME
); \
282 ln
-s ..
/$(STAGING_HOST2TARGET
)/usr
/lib lib
)
283 ifeq ($(ADK_TARGET_ARCH_SH
),y
)
284 ifeq ($(ADK_TARGET_CPU_SH_J2
),y
)
285 (cd
${STAGING_TARGET_DIR}/ && ln
-sf . mj2
)
287 ifeq ($(ADK_TARGET_CPU_SH_SH2
),y
)
288 (cd
${STAGING_TARGET_DIR}/ && ln
-sf . m2
)
290 ifeq ($(ADK_TARGET_CPU_SH_SH2A
),y
)
291 (cd
${STAGING_TARGET_DIR}/ && ln
-sf . m2a
)
293 ifeq ($(ADK_TARGET_CPU_SH_SH3
),y
)
294 (cd
${STAGING_TARGET_DIR}/ && ln
-sf . m3
)
296 ifeq ($(ADK_TARGET_CPU_SH_SH4
),y
)
297 (cd
${STAGING_TARGET_DIR}/ && ln
-sf . m4
)
299 ifeq ($(ADK_TARGET_CPU_SH_SH4A
),y
)
300 (cd
${STAGING_TARGET_DIR}/ && ln
-sf . m4a
)
303 $(SED
) '/k prot/agcc_cv_libc_provides_ssp=yes' $(WRKBUILD
)/gcc
/configure
304 cd
$(GCC_BUILD_DIR_INITIAL
); \
305 PATH
='$(TARGET_PATH)' \
308 CFLAGS
="-O0 -g0 -fomit-frame-pointer" \
309 CXXFLAGS
="-O0 -g0 -fomit-frame-pointer" \
310 $(WRKBUILD
)/configure \
312 ${GCC_TLS_CONFOPTS} \
313 --enable-languages
=c \
321 $(GCC_BUILD_DIR_INITIAL
)/.compiled
: $(GCC_BUILD_DIR_INITIAL
)/.configured
322 ifeq ($(ADK_TOOLCHAIN_GCC_METAG
),y
)
323 PATH
='$(TARGET_PATH)' \
324 $(MAKE
) ${GCC_MAKEOPTS} -C
$(GCC_BUILD_DIR_INITIAL
) all-gcc
326 PATH
='$(TARGET_PATH)' \
327 $(MAKE
) ${GCC_MAKEOPTS} -C
$(GCC_BUILD_DIR_INITIAL
) all-gcc all-target-libgcc
331 $(WRKBUILD
)/.configured
: $(GCC_BUILD_DIR_INITIAL
)/.compiled
332 ifeq ($(ADK_TOOLCHAIN_GCC_METAG
),y
)
333 PATH
='$(TARGET_PATH)' \
334 $(MAKE
) -C
$(GCC_BUILD_DIR_INITIAL
) install-gcc
336 PATH
='$(TARGET_PATH)' \
337 $(MAKE
) -C
$(GCC_BUILD_DIR_INITIAL
) install-gcc install-target-libgcc
339 # required for newlib
340 (cd
$(TOOLCHAIN_DIR
)/usr
/bin
&& \
341 ln
-sf
$(GNU_TARGET_NAME
)-gcc
$(GNU_TARGET_NAME
)-cc \
345 $(WRKBUILD
)/.compiled
:
346 mkdir
-p
$(GCC_BUILD_DIR_FINAL
)
347 cd
$(GCC_BUILD_DIR_FINAL
); \
348 PATH
='$(TARGET_PATH)' \
351 CFLAGS_FOR_TARGET
='$(TARGET_CFLAGS)' \
352 CXXFLAGS_FOR_TARGET
='$(TARGET_CXXFLAGS)' \
353 $(WRKBUILD
)/configure \
355 ${GCC_FINAL_CONFOPTS} \
356 --enable-languages
=$(LANGUAGES
) \
357 --with-build-sysroot
='$${prefix}/${STAGING_HOST2TARGET}' \
358 --with-sysroot
='$${prefix}/${STAGING_HOST2TARGET}'
359 PATH
='$(TARGET_PATH)' $(MAKE
) -C
$(GCC_BUILD_DIR_FINAL
) configure-host
360 cd
$(GCC_BUILD_DIR_FINAL
); \
361 PATH
='$(TARGET_PATH)' \
362 $(MAKE
) ${GCC_MAKEOPTS} all
365 $(WRKBUILD
)/.installed
: $(WRKBUILD
)/.compiled
366 cd
$(GCC_BUILD_DIR_FINAL
); \
367 PATH
='$(TARGET_PATH)' \
369 # remove duplicate tools, convert hardlinks to symlinks
371 cd
$(TOOLCHAIN_DIR
)/usr
/$(GNU_TARGET_NAME
)/bin
; \
372 for app in
ar as c
++ g
++ gcc
ld ld.gold
ld.bfd nm objcopy objdump ranlib
strip; do \
373 ln
-sf ..
/..
/bin
/$(GNU_TARGET_NAME
)-$${app} $${app}; \
375 (cd
$(TOOLCHAIN_DIR
)/usr
/bin
&& \
376 ln
-sf
$(GNU_TARGET_NAME
)-gcc
$(GNU_TARGET_NAME
)-gcc-
${PKG_VERSION} && \
377 ln
-sf
$(GNU_TARGET_NAME
)-g
++ $(GNU_TARGET_NAME
)-g
++-${PKG_VERSION} \
382 ifeq ($(ADK_TARGET_CPU_CF
),y
)
383 find
$(STAGING_TARGET_DIR
) -name libgcc.a
-print | while read t
; do
$(GNU_TARGET_NAME
)-ar dv
"$t" _ctors.o
; done
385 # cleanup unneeded docs
386 rm -rf
$(TOOLCHAIN_DIR
)/usr
/share
387 # cleanup unneeded libtool files
388 -find
$(STAGING_TARGET_DIR
) $(STAGING_HOST_DIR
) -name \
*.la
-exec
rm {} \
;
389 # strip target libs and host tools for toolchain builds in non-Debug mode
391 PATH
="$(TARGET_PATH)" debug
='0' prefix='${TARGET_CROSS}' ${BASH} ${SCRIPT_DIR}/rstrip.sh \
392 $(STAGING_TARGET_DIR
) $(TOOLCHAIN_DIR
)/usr
/lib
/gcc
/$(GNU_TARGET_NAME
)
393 debug
='0' prefix=' ' ${BASH} ${SCRIPT_DIR}/rstrip.sh
$(TOOLCHAIN_DIR
)/usr
/bin
397 include ${ADK_TOPDIR}/mk
/toolchain.mk