xref: /OK3568_Linux_fs/yocto/poky/meta/recipes-devtools/gcc/gcc-target.inc (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593SmuzhiyunGCCMULTILIB = "--enable-multilib"
2*4882a593Smuzhiyunrequire gcc-configure-common.inc
3*4882a593Smuzhiyun
4*4882a593SmuzhiyunEXTRA_OECONF_PATHS = "\
5*4882a593Smuzhiyun    --with-build-sysroot=${STAGING_DIR_TARGET} \
6*4882a593Smuzhiyun"
7*4882a593Smuzhiyun
8*4882a593SmuzhiyunEXTRA_OECONF:append:linuxstdbase = " --enable-clocale=gnu"
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun# Configure gcc running on the target to default to an architecture which will
11*4882a593Smuzhiyun# be compatible with that of gcc-runtime (which is cross compiled to be target
12*4882a593Smuzhiyun# specific). For example, for ARM, ARMv6+ adds atomic instructions that may
13*4882a593Smuzhiyun# affect the ABI in the gcc-runtime libs. Since we can't rely on gcc on the
14*4882a593Smuzhiyun# target to always be passed -march etc, its built-in default needs to be safe.
15*4882a593Smuzhiyun
16*4882a593SmuzhiyunARMFPARCHEXT ?= ""
17*4882a593Smuzhiyun
18*4882a593SmuzhiyunEXTRA_OECONF:append:armv6:class-target = " --with-arch=armv6${ARMFPARCHEXT}"
19*4882a593SmuzhiyunEXTRA_OECONF:append:armv7a:class-target = " --with-arch=armv7-a${ARMFPARCHEXT}"
20*4882a593SmuzhiyunEXTRA_OECONF:append:armv7ve:class-target = " --with-arch=armv7ve${ARMFPARCHEXT}"
21*4882a593SmuzhiyunEXTRA_OECONF:append:arc:class-target = " --with-cpu=${TUNE_PKGARCH}"
22*4882a593SmuzhiyunEXTRA_OECONF:append:x86-64:class-target = " --with-arch=native"
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun# libcc1 requres gcc_cv_objdump when cross build, but gcc_cv_objdump is
25*4882a593Smuzhiyun# set in subdir gcc, so subdir libcc1 can't use it, export it here to
26*4882a593Smuzhiyun# fix the problem.
27*4882a593Smuzhiyunexport gcc_cv_objdump = "${TARGET_PREFIX}objdump"
28*4882a593Smuzhiyun
29*4882a593SmuzhiyunEXTRA_OECONF_GCC_FLOAT = "${@get_gcc_float_setting(bb, d)}"
30*4882a593Smuzhiyun
31*4882a593SmuzhiyunPACKAGES = "\
32*4882a593Smuzhiyun    ${PN} ${PN}-plugins ${PN}-symlinks \
33*4882a593Smuzhiyun    g++ g++-symlinks \
34*4882a593Smuzhiyun    cpp cpp-symlinks \
35*4882a593Smuzhiyun    g77 g77-symlinks \
36*4882a593Smuzhiyun    gfortran gfortran-symlinks \
37*4882a593Smuzhiyun    gcov gcov-symlinks \
38*4882a593Smuzhiyun    ${PN}-doc \
39*4882a593Smuzhiyun    ${PN}-dev \
40*4882a593Smuzhiyun    ${PN}-dbg \
41*4882a593Smuzhiyun"
42*4882a593Smuzhiyun
43*4882a593SmuzhiyunFILES:${PN} = "\
44*4882a593Smuzhiyun    ${bindir}/${TARGET_PREFIX}gcc* \
45*4882a593Smuzhiyun    ${bindir}/${TARGET_PREFIX}lto* \
46*4882a593Smuzhiyun    ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/collect2* \
47*4882a593Smuzhiyun    ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/g++-mapper-server \
48*4882a593Smuzhiyun    ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/lto* \
49*4882a593Smuzhiyun    ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/lib*${SOLIBS} \
50*4882a593Smuzhiyun    ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/liblto*${SOLIBSDEV} \
51*4882a593Smuzhiyun    ${gcclibdir}/${TARGET_SYS}/${BINV}/*.o \
52*4882a593Smuzhiyun    ${gcclibdir}/${TARGET_SYS}/${BINV}/specs \
53*4882a593Smuzhiyun    ${gcclibdir}/${TARGET_SYS}/${BINV}/lib*${SOLIBS} \
54*4882a593Smuzhiyun    ${gcclibdir}/${TARGET_SYS}/${BINV}/include \
55*4882a593Smuzhiyun    ${gcclibdir}/${TARGET_SYS}/${BINV}/include-fixed \
56*4882a593Smuzhiyun    ${libdir}/bfd-plugins/*.so \
57*4882a593Smuzhiyun"
58*4882a593SmuzhiyunINSANE_SKIP:${PN} += "dev-so"
59*4882a593SmuzhiyunRRECOMMENDS:${PN} += "\
60*4882a593Smuzhiyun    libssp \
61*4882a593Smuzhiyun    libssp-dev \
62*4882a593Smuzhiyun"
63*4882a593SmuzhiyunRDEPENDS:${PN} += "cpp"
64*4882a593Smuzhiyun
65*4882a593SmuzhiyunFILES:${PN}-dev = "\
66*4882a593Smuzhiyun    ${gcclibdir}/${TARGET_SYS}/${BINV}/lib*${SOLIBSDEV} \
67*4882a593Smuzhiyun    ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/lib*${SOLIBSDEV} \
68*4882a593Smuzhiyun    ${gcclibdir}/${TARGET_SYS}/${BINV}/plugin/include/ \
69*4882a593Smuzhiyun    ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/plugin/gengtype \
70*4882a593Smuzhiyun    ${gcclibdir}/${TARGET_SYS}/${BINV}/plugin/gtype.state \
71*4882a593Smuzhiyun"
72*4882a593SmuzhiyunFILES:${PN}-symlinks = "\
73*4882a593Smuzhiyun    ${bindir}/cc \
74*4882a593Smuzhiyun    ${bindir}/gcc \
75*4882a593Smuzhiyun    ${bindir}/gccbug \
76*4882a593Smuzhiyun"
77*4882a593Smuzhiyun
78*4882a593SmuzhiyunFILES:${PN}-plugins = "\
79*4882a593Smuzhiyun    ${gcclibdir}/${TARGET_SYS}/${BINV}/plugin \
80*4882a593Smuzhiyun"
81*4882a593SmuzhiyunALLOW_EMPTY:${PN}-plugins = "1"
82*4882a593Smuzhiyun
83*4882a593SmuzhiyunFILES:g77 = "\
84*4882a593Smuzhiyun    ${bindir}/${TARGET_PREFIX}g77 \
85*4882a593Smuzhiyun    ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/f771 \
86*4882a593Smuzhiyun"
87*4882a593SmuzhiyunFILES:g77-symlinks = "\
88*4882a593Smuzhiyun    ${bindir}/g77 \
89*4882a593Smuzhiyun    ${bindir}/f77 \
90*4882a593Smuzhiyun"
91*4882a593SmuzhiyunRRECOMMENDS:g77 = "\
92*4882a593Smuzhiyun    libg2c \
93*4882a593Smuzhiyun    libg2c-dev \
94*4882a593Smuzhiyun"
95*4882a593Smuzhiyun
96*4882a593SmuzhiyunFILES:gfortran = "\
97*4882a593Smuzhiyun    ${bindir}/${TARGET_PREFIX}gfortran \
98*4882a593Smuzhiyun    ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/f951 \
99*4882a593Smuzhiyun"
100*4882a593SmuzhiyunRRECOMMENDS:gfortran = "\
101*4882a593Smuzhiyun    libquadmath \
102*4882a593Smuzhiyun    libquadmath-dev \
103*4882a593Smuzhiyun"
104*4882a593SmuzhiyunFILES:gfortran-symlinks = "\
105*4882a593Smuzhiyun    ${bindir}/gfortran \
106*4882a593Smuzhiyun    ${bindir}/f95"
107*4882a593Smuzhiyun
108*4882a593SmuzhiyunFILES:cpp = "\
109*4882a593Smuzhiyun    ${bindir}/${TARGET_PREFIX}cpp* \
110*4882a593Smuzhiyun    ${base_libdir}/cpp \
111*4882a593Smuzhiyun    ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/cc1"
112*4882a593SmuzhiyunFILES:cpp-symlinks = "${bindir}/cpp"
113*4882a593Smuzhiyun
114*4882a593SmuzhiyunFILES:gcov = "${bindir}/${TARGET_PREFIX}gcov* \
115*4882a593Smuzhiyun    ${bindir}/${TARGET_PREFIX}gcov-tool* \
116*4882a593Smuzhiyun"
117*4882a593SmuzhiyunFILES:gcov-symlinks = "${bindir}/gcov \
118*4882a593Smuzhiyun    ${bindir}/gcov-tool \
119*4882a593Smuzhiyun"
120*4882a593Smuzhiyun
121*4882a593SmuzhiyunFILES:g++ = "\
122*4882a593Smuzhiyun    ${bindir}/${TARGET_PREFIX}g++* \
123*4882a593Smuzhiyun    ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/cc1plus \
124*4882a593Smuzhiyun"
125*4882a593SmuzhiyunFILES:g++-symlinks = "\
126*4882a593Smuzhiyun    ${bindir}/c++ \
127*4882a593Smuzhiyun    ${bindir}/g++ \
128*4882a593Smuzhiyun"
129*4882a593SmuzhiyunRRECOMMENDS:g++ = "\
130*4882a593Smuzhiyun    libstdc++ \
131*4882a593Smuzhiyun    libstdc++-dev \
132*4882a593Smuzhiyun    libatomic \
133*4882a593Smuzhiyun    libatomic-dev \
134*4882a593Smuzhiyun"
135*4882a593Smuzhiyun
136*4882a593SmuzhiyunFILES:${PN}-doc = "\
137*4882a593Smuzhiyun    ${infodir} \
138*4882a593Smuzhiyun    ${mandir} \
139*4882a593Smuzhiyun    ${gcclibdir}/${TARGET_SYS}/${BINV}/include/README \
140*4882a593Smuzhiyun"
141*4882a593Smuzhiyun
142*4882a593Smuzhiyundo_compile () {
143*4882a593Smuzhiyun	# Prevent full target sysroot path from being used in configargs.h header,
144*4882a593Smuzhiyun	# as it will be rewritten when used by other sysroots preventing support
145*4882a593Smuzhiyun	# for gcc plugins. Additionally the path is embeddeded into the output
146*4882a593Smuzhiyun	# binary, this prevents building a reproducible binary.
147*4882a593Smuzhiyun	oe_runmake configure-gcc
148*4882a593Smuzhiyun	sed -i 's@${STAGING_DIR_TARGET}@/@g' ${B}/gcc/configargs.h
149*4882a593Smuzhiyun	sed -i 's@${STAGING_DIR_HOST}@/@g' ${B}/gcc/configargs.h
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun	# Prevent sysroot/workdir paths from being used in checksum-options.
152*4882a593Smuzhiyun	# checksum-options is used to generate a checksum which is embedded into
153*4882a593Smuzhiyun	# the output binary.
154*4882a593Smuzhiyun	oe_runmake TARGET-gcc=checksum-options all-gcc
155*4882a593Smuzhiyun	sed -i 's@${DEBUG_PREFIX_MAP}@@g' ${B}/gcc/checksum-options
156*4882a593Smuzhiyun	sed -i 's@${STAGING_DIR_TARGET}@/@g' ${B}/gcc/checksum-options
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun	oe_runmake all-host
159*4882a593Smuzhiyun}
160*4882a593Smuzhiyun
161*4882a593Smuzhiyundo_install () {
162*4882a593Smuzhiyun	oe_runmake 'DESTDIR=${D}' install-host
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun	# Add unwind.h, it comes from libgcc which we don't want to build again
165*4882a593Smuzhiyun	install ${STAGING_LIBDIR_NATIVE}/${TARGET_SYS}/gcc/${TARGET_SYS}/${BINV}/include/unwind.h ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include/
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun	# Info dir listing isn't interesting at this point so remove it if it exists.
168*4882a593Smuzhiyun	if [ -e "${D}${infodir}/dir" ]; then
169*4882a593Smuzhiyun		rm -f ${D}${infodir}/dir
170*4882a593Smuzhiyun	fi
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun	# Cleanup some of the ${libdir}{,exec}/gcc stuff ...
173*4882a593Smuzhiyun	rm -r ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/install-tools
174*4882a593Smuzhiyun	rm -r ${D}${libexecdir}/gcc/${TARGET_SYS}/${BINV}/install-tools
175*4882a593Smuzhiyun	rm -rf ${D}${libexecdir}/gcc/${TARGET_SYS}/${BINV}/*.la
176*4882a593Smuzhiyun	rmdir ${D}${includedir}
177*4882a593Smuzhiyun	rm -rf ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/finclude
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun	# Hack around specs file assumptions
180*4882a593Smuzhiyun	test -f ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/specs && sed -i -e '/^*cross_compile:$/ { n; s/1/0/; }' ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/specs
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun	# Cleanup manpages..
183*4882a593Smuzhiyun	rm -rf ${D}${mandir}/man7
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun	# Don't package details about the build host
186*4882a593Smuzhiyun	rm -f ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/plugin/include/auto-build.h
187*4882a593Smuzhiyun	rm -f ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/plugin/include/bconfig.h
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun	cd ${D}${bindir}
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun	# We care about g++ not c++
192*4882a593Smuzhiyun	rm -f *c++*
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun	# We don't care about the gcc-<version> ones for this
195*4882a593Smuzhiyun	rm -f *gcc-?*.?*
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun	# Not sure why we end up with these but we don't want them...
198*4882a593Smuzhiyun	rm -f ${TARGET_PREFIX}${TARGET_PREFIX}*
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun	# Symlinks so we can use these trivially on the target
201*4882a593Smuzhiyun	if [ -e ${TARGET_PREFIX}g77 ]; then
202*4882a593Smuzhiyun		ln -sf ${TARGET_PREFIX}g77 g77 || true
203*4882a593Smuzhiyun		ln -sf g77 f77 || true
204*4882a593Smuzhiyun	fi
205*4882a593Smuzhiyun	if [ -e ${TARGET_PREFIX}gfortran ]; then
206*4882a593Smuzhiyun		ln -sf ${TARGET_PREFIX}gfortran gfortran || true
207*4882a593Smuzhiyun		ln -sf gfortran f95 || true
208*4882a593Smuzhiyun	fi
209*4882a593Smuzhiyun	ln -sf ${TARGET_PREFIX}g++ g++
210*4882a593Smuzhiyun	ln -sf ${TARGET_PREFIX}gcc gcc
211*4882a593Smuzhiyun	ln -sf ${TARGET_PREFIX}cpp cpp
212*4882a593Smuzhiyun	ln -sf ${TARGET_PREFIX}gcov gcov
213*4882a593Smuzhiyun	ln -sf ${TARGET_PREFIX}gcov-tool gcov-tool
214*4882a593Smuzhiyun	install -d ${D}${base_libdir}
215*4882a593Smuzhiyun	ln -sf ${bindir}/${TARGET_PREFIX}cpp ${D}${base_libdir}/cpp
216*4882a593Smuzhiyun	ln -sf g++ c++
217*4882a593Smuzhiyun	ln -sf gcc cc
218*4882a593Smuzhiyun	install -d ${D}${libdir}/bfd-plugins
219*4882a593Smuzhiyun	ln -sf ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/liblto_plugin.so ${D}${libdir}/bfd-plugins/liblto_plugin.so
220*4882a593Smuzhiyun	chown -R root:root ${D}
221*4882a593Smuzhiyun}
222*4882a593Smuzhiyun
223*4882a593Smuzhiyundo_install:append () {
224*4882a593Smuzhiyun        #
225*4882a593Smuzhiyun        # Thefixinc.sh script, run on the gcc's compile phase, looks into sysroot header
226*4882a593Smuzhiyun        # files and places the modified files into
227*4882a593Smuzhiyun        # {D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include-fixed folder. This makes the
228*4882a593Smuzhiyun        # build not deterministic. The following code prunes all those headers
229*4882a593Smuzhiyun        # except those under include-fixed/linux, *limits.h and README, yielding
230*4882a593Smuzhiyun        # the same include-fixed folders no matter what sysroot
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun        include_fixed="${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include-fixed"
233*4882a593Smuzhiyun        for f in $(find ${include_fixed} -type f); do
234*4882a593Smuzhiyun                case $f in
235*4882a593Smuzhiyun                */include-fixed/linux/*)
236*4882a593Smuzhiyun                    continue
237*4882a593Smuzhiyun                    ;;
238*4882a593Smuzhiyun                */include-fixed/*limits.h)
239*4882a593Smuzhiyun                    continue
240*4882a593Smuzhiyun                    ;;
241*4882a593Smuzhiyun                */include-fixed/README)
242*4882a593Smuzhiyun                    continue
243*4882a593Smuzhiyun                    ;;
244*4882a593Smuzhiyun                *)
245*4882a593Smuzhiyun                    # remove file and directory if empty
246*4882a593Smuzhiyun                    bbdebug 2 "Pruning $f"
247*4882a593Smuzhiyun                    rm $f
248*4882a593Smuzhiyun                    find $(dirname $f) -maxdepth 0 -empty -exec rmdir {} \;
249*4882a593Smuzhiyun                    ;;
250*4882a593Smuzhiyun                esac
251*4882a593Smuzhiyun        done
252*4882a593Smuzhiyun}
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun# Installing /usr/lib/gcc/* means we'd have two copies, one from gcc-cross
255*4882a593Smuzhiyun# and one from here. These can confuse gcc cross where includes use #include_next
256*4882a593Smuzhiyun# and builds track file dependencies (e.g. perl and its makedepends code).
257*4882a593Smuzhiyun# For determinism we don't install this ever and rely on the copy from gcc-cross.
258*4882a593Smuzhiyun# [YOCTO #7287]
259*4882a593SmuzhiyunSYSROOT_DIRS_IGNORE += "${libdir}/gcc"
260