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