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
))
14 ifeq ($(ADK_TARGET_ARCH_XTENSA
),y
)
15 TARGET_CFLAGS
:= $(filter-out -mtext-section-literals
,$(TARGET_CFLAGS
))
16 TARGET_CXXFLAGS
:= $(filter-out -mtext-section-literals
,$(TARGET_CXXFLAGS
))
19 # for multilib m68k uClinux, we need to filter out some flags
20 ifeq ($(ADK_TARGET_UCLINUX
),y
)
21 TARGET_CFLAGS
:= $(filter-out -mcpu
=5208,$(TARGET_CFLAGS
))
22 TARGET_CFLAGS
:= $(filter-out -msep-data
,$(TARGET_CFLAGS
))
23 TARGET_CXXFLAGS
:= $(filter-out -mcpu
=5208,$(TARGET_CXXFLAGS
))
24 TARGET_CXXFLAGS
:= $(filter-out -msep-data
,$(TARGET_CXXFLAGS
))
27 GCC_CONFOPTS
:= --prefix=$(TOOLCHAIN_DIR
)/usr \
28 --with-bugurl
="http://www.openadk.org/" \
29 --build
=$(GNU_HOST_NAME
) \
30 --host
=$(GNU_HOST_NAME
) \
31 --target
=$(GNU_TARGET_NAME
) \
32 --with-gmp
=$(STAGING_HOST_DIR
)/usr \
33 --with-mpfr
=$(STAGING_HOST_DIR
)/usr \
34 --with-libelf
=$(STAGING_HOST_DIR
)/usr \
35 --disable-__cxa_atexit \
38 --disable-libsanitizer \
39 --disable-install-libiberty \
41 --disable-libmudflap \
43 --disable-decimal-float \
44 --disable-libstdcxx-pch \
45 --disable-ppl-version-check \
46 --disable-cloog-version-check \
55 ifneq ($(ADK_TARGET_WITH_NPTL
),)
56 GCC_CONFOPTS
+= --enable-tls
--enable-threads
--enable-libatomic
58 GCC_CONFOPTS
+= --disable-tls
--disable-threads
--disable-libatomic
61 ifeq ($(ADK_TARGET_UCLINUX
)$(ADK_TARGET_USE_STATIC_LIBS
),y
)
62 GCC_FINAL_CONFOPTS
+= --disable-shared
64 # uClibc/glibc uses libgcc_s.so.1 for pthread_cancel with dlopen
65 ifeq (ADK_TARGET_LIB_MUSL
),y
)
66 GCC_FINAL_CONFOPTS
+= --enable-shared
='libstdc++'
68 GCC_FINAL_CONFOPTS
+= --enable-shared
='libstdc++,libgcc'
72 ifeq ($(ADK_TARGET_ARCH_M68K
)$(ADK_TARGET_ARCH_SH
)$(ADK_TARGET_ARCH_X86_64
)$(ADK_TARGET_ARCH_X86
),)
73 GCC_FINAL_CONFOPTS
+= --disable-biarch
--disable-multilib
76 ifeq ($(ADK_TARGET_ARCH_SH
),y
)
77 ifeq ($(ADK_little
),y
)
78 GCC_CONFOPTS
+= --with-endian
=little
80 GCC_CONFOPTS
+= --with-endian
=big
82 GCC_FINAL_CONFOPTS
+= --enable-multilib
--with-multilib-list
=m4
,m4-nofpu
85 ifeq ($(ADK_TARGET_ARCH_X86
),y
)
86 ifeq ($(ADK_TARGET_KERNEL_64
),y
)
87 GCC_FINAL_CONFOPTS
+= --enable-biarch
--enable-targets
=all --disable-multilib
89 GCC_FINAL_CONFOPTS
+= --disable-biarch
--disable-multilib
93 ifeq ($(ADK_TARGET_ARCH_X86_64
),y
)
95 GCC_FINAL_CONFOPTS
+= --with-abi
=x32
98 GCC_FINAL_CONFOPTS
+= --disable-biarch
--disable-multilib
102 ifeq ($(ADK_TOOLCHAIN_WITH_SSP
),y
)
103 GCC_FINAL_CONFOPTS
+= --enable-libssp
105 GCC_FINAL_CONFOPTS
+= --disable-libssp
108 ifeq ($(ADK_TOOLCHAIN_WITH_LTO
),y
)
109 GCC_CONFOPTS
+= --enable-lto
111 GCC_CONFOPTS
+= --disable-lto
114 ifeq ($(ADK_TARGET_ARCH_PPC
),y
)
115 GCC_CONFOPTS
+= --with-long-double-64
--enable-secureplt
116 ifneq ($(ADK_TARGET_CPU_WITH_FPU
),y
)
117 GCC_CONFOPTS
+= --with-float
=soft
121 ifeq ($(ADK_TARGET_ARCH_MIPS
),y
)
122 GCC_CONFOPTS
+= --with-float
=$(ADK_TARGET_FLOAT
)
125 ifeq ($(ADK_TARGET_ARCH_ARM
),y
)
126 GCC_CONFOPTS
+= --with-float
=$(ADK_TARGET_FLOAT
)
127 ifneq ($(ADK_TARGET_FPU
),)
128 GCC_CONFOPTS
+= --with-fpu
=$(ADK_TARGET_FPU
)
132 ifeq ($(ADK_CPU_ARM926EJ_S
),y
)
133 GCC_CONFOPTS
+= --with-cpu
=arm926ej-s
136 ifeq ($(ADK_CPU_ARM1176JZF_S
),y
)
137 GCC_CONFOPTS
+= --with-cpu
=arm1176jzf-s
140 ifeq ($(ADK_CPU_CORTEX_M3
),y
)
141 GCC_CONFOPTS
+= --with-cpu
=cortex-m3
--with-mode
=thumb
144 ifeq ($(ADK_CPU_CORTEX_A7
),y
)
145 GCC_CONFOPTS
+= --with-cpu
=cortex-a7
148 ifeq ($(ADK_CPU_CORTEX_A9
),y
)
149 GCC_CONFOPTS
+= --with-cpu
=cortex-a9
152 ifeq ($(ADK_CPU_SPARC_V9
),y
)
153 GCC_CONFOPTS
+= --with-cpu
=ultrasparc
156 ifeq ($(ADK_CPU_ARC
),y
)
157 GCC_CONFOPTS
+= --with-cpu
=arc700
160 ifeq ($(ADK_CPU_CF_5208
),y
)
161 GCC_CONFOPTS
+= --enable-multilib
--with-arch
=cf
--with-cpu
=5208
164 ifneq ($(ADK_TARGET_MIPS_ABI
),)
165 GCC_CONFOPTS
+= --with-abi
=${ADK_TARGET_MIPS_ABI}
168 ifeq (${ADK_MAKE_PARALLEL},y
)
169 GCC_MAKEOPTS
+= -j
${ADK_MAKE_JOBS}
172 ifeq ($(ADK_TARGET_UCLINUX
),y
)
178 include ${ADK_TOPDIR}/mk
/buildhlp.mk
180 GCC_BUILD_DIR_MINIMAL
:= $(WRKBUILD
)-minimal
181 GCC_BUILD_DIR_INITIAL
:= $(WRKBUILD
)-initial
182 GCC_BUILD_DIR_FINAL
:= $(WRKBUILD
)-final
184 $(GCC_BUILD_DIR_MINIMAL
)/.configured
:
185 ifeq ($(ADK_TARGET_ARCH_XTENSA
),y
)
186 tar xf
$(ADK_TOPDIR
)/target
/xtensa
/overlay
/xtensa_
$(ADK_TARGET_XTENSA
).
tar \
187 --strip-components
=1 -C
$(WRKSRC
) gcc
189 mkdir
-p
$(GCC_BUILD_DIR_MINIMAL
)
190 # these symlinks are very important, do not remove
191 rm -rf
$(TOOLCHAIN_DIR
)/usr
/$(GNU_TARGET_NAME
)/sys-include
192 mkdir
-p
$(TOOLCHAIN_DIR
)/usr
/$(GNU_TARGET_NAME
)
193 (cd
$(TOOLCHAIN_DIR
)/usr
/$(GNU_TARGET_NAME
); \
194 ln
-s ..
/$(STAGING_HOST2TARGET
)/usr
/include sys-include
)
195 rm -rf
${TOOLCHAIN_DIR}/usr
/$(GNU_TARGET_NAME
)/lib
196 (cd
$(TOOLCHAIN_DIR
)/usr
/$(GNU_TARGET_NAME
); \
197 ln
-s ..
/$(STAGING_HOST2TARGET
)/lib lib
)
198 ifeq ($(ADK_TARGET_ARCH_SH
),y
)
199 (cd
${STAGING_TARGET_DIR}/ && ln
-sf . m4
&& ln
-sf . m4-nofpu
)
201 $(SED
) '/k prot/agcc_cv_libc_provides_ssp=yes' $(WRKBUILD
)/gcc
/configure
202 cd
$(GCC_BUILD_DIR_MINIMAL
); \
203 PATH
='$(TARGET_PATH)' \
204 CFLAGS
="-O0 -g0 -fomit-frame-pointer" \
205 CXXFLAGS
="-O0 -g0 -fomit-frame-pointer" \
206 $(WRKBUILD
)/configure \
208 --enable-languages
=c \
214 $(GCC_BUILD_DIR_MINIMAL
)/.compiled
: $(GCC_BUILD_DIR_MINIMAL
)/.configured
215 PATH
='$(TARGET_PATH)' $(MAKE
) ${GCC_MAKEOPTS} -C
$(GCC_BUILD_DIR_MINIMAL
) all-gcc
218 $(WRKBUILD
)/.headers
: $(GCC_BUILD_DIR_MINIMAL
)/.compiled
219 PATH
='$(TARGET_PATH)' $(MAKE
) -C
$(GCC_BUILD_DIR_MINIMAL
) install-gcc
222 $(GCC_BUILD_DIR_INITIAL
)/.configured
:
223 mkdir
-p
$(GCC_BUILD_DIR_INITIAL
)
224 cd
$(GCC_BUILD_DIR_INITIAL
); \
225 PATH
='$(TARGET_PATH)' \
226 CFLAGS
="-O0 -g0 -fomit-frame-pointer" \
227 CXXFLAGS
="-O0 -g0 -fomit-frame-pointer" \
228 $(WRKBUILD
)/configure \
230 ${GCC_FINAL_CONFOPTS} \
231 --enable-languages
=c \
234 --with-sysroot
=$(STAGING_TARGET_DIR
)
237 $(GCC_BUILD_DIR_INITIAL
)/.compiled
: $(GCC_BUILD_DIR_INITIAL
)/.configured
238 PATH
='$(TARGET_PATH)' $(MAKE
) ${GCC_MAKEOPTS} -C
$(GCC_BUILD_DIR_INITIAL
) all-gcc all-target-libgcc
241 $(WRKBUILD
)/.configured
: $(GCC_BUILD_DIR_INITIAL
)/.compiled
242 PATH
='$(TARGET_PATH)' $(MAKE
) -C
$(GCC_BUILD_DIR_INITIAL
) install-gcc install-target-libgcc
245 $(GCC_BUILD_DIR_FINAL
)/.configured
:
246 mkdir
-p
$(GCC_BUILD_DIR_FINAL
)
247 cd
$(GCC_BUILD_DIR_FINAL
); \
248 PATH
='$(TARGET_PATH)' \
249 CFLAGS_FOR_TARGET
='$(TARGET_CFLAGS)' \
250 CXXFLAGS_FOR_TARGET
='$(TARGET_CXXFLAGS)' \
251 $(WRKBUILD
)/configure \
253 ${GCC_FINAL_CONFOPTS} \
254 --enable-cxx-flags
='-fPIC' \
255 --enable-languages
=$(LANGUAGES
) \
256 --with-build-sysroot
='$${prefix}/${STAGING_HOST2TARGET}' \
257 --with-sysroot
='$${prefix}/${STAGING_HOST2TARGET}'
258 PATH
='$(TARGET_PATH)' $(MAKE
) -C
$(GCC_BUILD_DIR_FINAL
) configure-host
261 $(WRKBUILD
)/.compiled
: $(GCC_BUILD_DIR_FINAL
)/.configured
262 cd
$(GCC_BUILD_DIR_FINAL
); \
263 PATH
='$(TARGET_PATH)' \
264 $(MAKE
) ${GCC_MAKEOPTS} all
267 $(WRKBUILD
)/.installed
: $(WRKBUILD
)/.compiled
268 cd
$(GCC_BUILD_DIR_FINAL
); \
269 PATH
='$(TARGET_PATH)' \
271 # remove duplicate tools, convert hardlinks to symlinks
273 cd
$(TOOLCHAIN_DIR
)/usr
/$(GNU_TARGET_NAME
)/bin
; \
274 for app in
ar as c
++ g
++ gcc
ld ld.gold
ld.bfd nm objcopy objdump ranlib
strip; do \
275 ln
-sf ..
/..
/bin
/$(GNU_TARGET_NAME
)-$${app} $${app}; \
277 (cd
$(TOOLCHAIN_DIR
)/usr
/bin
&& \
278 ln
-sf
$(GNU_TARGET_NAME
)-gcc
$(GNU_TARGET_NAME
)-gcc-
${PKG_VERSION} && \
279 ln
-sf
$(GNU_TARGET_NAME
)-g
++ $(GNU_TARGET_NAME
)-g
++-${PKG_VERSION} \
281 ifeq ($(ADK_TARGET_USE_GOLD
),y
)
282 (cd
$(TOOLCHAIN_DIR
)/usr
/bin
&& \
283 ln
-sf
$(GNU_TARGET_NAME
)-ld.gold
$(GNU_TARGET_NAME
)-ld)
285 ifeq (ADK_TOOLCHAIN_BINUTILS_2_20_1
),)
286 (cd
$(TOOLCHAIN_DIR
)/usr
/bin
&& \
287 ln
-sf
$(GNU_TARGET_NAME
)-ld.bfd
$(GNU_TARGET_NAME
)-ld)
290 cd
$(STAGING_TARGET_DIR
)/lib
&& \
291 ln
-sf libstdc
++.so
.6.0.
$(LIBSTDCXXVER
) libstdc
++.so
&& \
292 ln
-sf libstdc
++.so
.6.0.
$(LIBSTDCXXVER
) libstdc
++.so
.6
293 # cleanup unneeded docs
294 rm -rf
$(TOOLCHAIN_DIR
)/usr
/share
295 ifeq ($(ADK_TARGET_ARCH_M68K
),y
)
296 # create gcc wrapper for uClinux/m68k
297 echo
"#!/bin/sh" > $(TOOLCHAIN_DIR
)/usr
/bin
/adk-uclinux-gcc
298 echo
"exec ${GNU_TARGET_NAME}-gcc \"\$$@\" -specs $(ADK_TOPDIR)/toolchain/gcc/m68k-uclinux-gcc.specs" >> $(TOOLCHAIN_DIR
)/usr
/bin
/adk-uclinux-gcc
299 chmod a
+x
$(TOOLCHAIN_DIR
)/usr
/bin
/adk-uclinux-gcc
301 ifeq ($(ADK_TARGET_ARCH_ARM
),y
)
302 # create gcc wrapper for uClinux/arm
303 echo
"#!/bin/sh" > $(TOOLCHAIN_DIR
)/usr
/bin
/adk-uclinux-gcc
304 echo
"exec ${GNU_TARGET_NAME}-gcc \"\$$@\" -specs $(ADK_TOPDIR)/toolchain/gcc/arm-uclinux-gcc.specs" >> $(TOOLCHAIN_DIR
)/usr
/bin
/adk-uclinux-gcc
305 chmod a
+x
$(TOOLCHAIN_DIR
)/usr
/bin
/adk-uclinux-gcc
309 include ${ADK_TOPDIR}/mk
/toolchain.mk