xref: /OK3568_Linux_fs/yocto/poky/meta/recipes-devtools/gcc/libgcc-common.inc (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593SmuzhiyunBPN = "libgcc"
2*4882a593Smuzhiyun
3*4882a593Smuzhiyunrequire gcc-configure-common.inc
4*4882a593Smuzhiyun
5*4882a593SmuzhiyunINHIBIT_DEFAULT_DEPS = "1"
6*4882a593Smuzhiyun
7*4882a593Smuzhiyundo_configure () {
8*4882a593Smuzhiyun	install -d ${D}${base_libdir} ${D}${libdir}
9*4882a593Smuzhiyun	mkdir -p ${B}/${BPN}
10*4882a593Smuzhiyun	mkdir -p ${B}/${TARGET_SYS}/${BPN}/
11*4882a593Smuzhiyun	cd ${B}/${BPN}
12*4882a593Smuzhiyun	chmod a+x ${S}/${BPN}/configure
13*4882a593Smuzhiyun	relpath=${@os.path.relpath("${S}/${BPN}", "${B}/${BPN}")}
14*4882a593Smuzhiyun	$relpath/configure ${CONFIGUREOPTS} ${EXTRA_OECONF}
15*4882a593Smuzhiyun}
16*4882a593SmuzhiyunEXTRACONFFUNCS += "extract_stashed_builddir"
17*4882a593Smuzhiyundo_configure[depends] += "${COMPILERDEP}"
18*4882a593Smuzhiyun
19*4882a593Smuzhiyundo_compile () {
20*4882a593Smuzhiyun	cd ${B}/${BPN}
21*4882a593Smuzhiyun	oe_runmake MULTIBUILDTOP=${B}/${TARGET_SYS}/${BPN}/
22*4882a593Smuzhiyun}
23*4882a593Smuzhiyun
24*4882a593Smuzhiyundo_install () {
25*4882a593Smuzhiyun	cd ${B}/${BPN}
26*4882a593Smuzhiyun	oe_runmake 'DESTDIR=${D}' MULTIBUILDTOP=${B}/${TARGET_SYS}/${BPN}/ install
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun	# Move libgcc_s into /lib
29*4882a593Smuzhiyun	mkdir -p ${D}${base_libdir}
30*4882a593Smuzhiyun	if [ -f ${D}${libdir}/nof/libgcc_s.so ]; then
31*4882a593Smuzhiyun		mv ${D}${libdir}/nof/libgcc* ${D}${base_libdir}
32*4882a593Smuzhiyun	else
33*4882a593Smuzhiyun		mv ${D}${libdir}/libgcc* ${D}${base_libdir} || true
34*4882a593Smuzhiyun	fi
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun	# install the runtime in /usr/lib/ not in /usr/lib/gcc on target
37*4882a593Smuzhiyun	# so that cross-gcc can find it in the sysroot
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun	mv ${D}${libdir}/gcc/* ${D}${libdir}
40*4882a593Smuzhiyun	rm -rf ${D}${libdir}/gcc/
41*4882a593Smuzhiyun	# unwind.h is installed here which is shipped in gcc-cross
42*4882a593Smuzhiyun	# as well as target gcc and they are identical so we dont
43*4882a593Smuzhiyun	# ship one with libgcc here
44*4882a593Smuzhiyun	rm -rf ${D}${libdir}/${TARGET_SYS}/${BINV}/include
45*4882a593Smuzhiyun}
46*4882a593Smuzhiyun
47*4882a593Smuzhiyundo_install:append:libc-baremetal () {
48*4882a593Smuzhiyun	if [ "${base_libdir}" != "${libdir}" ]; then
49*4882a593Smuzhiyun		rmdir ${D}${base_libdir}
50*4882a593Smuzhiyun	fi
51*4882a593Smuzhiyun}
52*4882a593Smuzhiyundo_install:append:libc-newlib () {
53*4882a593Smuzhiyun	if [ "${base_libdir}" != "${libdir}" ]; then
54*4882a593Smuzhiyun		rmdir ${D}${base_libdir}
55*4882a593Smuzhiyun	fi
56*4882a593Smuzhiyun}
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun# No rpm package is actually created but -dev depends on it, avoid dnf error
59*4882a593SmuzhiyunRDEPENDS:${PN}-dev:libc-baremetal = ""
60*4882a593SmuzhiyunRDEPENDS:${PN}-dev:libc-newlib = ""
61*4882a593Smuzhiyun
62*4882a593SmuzhiyunBBCLASSEXTEND = "nativesdk"
63*4882a593Smuzhiyun
64*4882a593Smuzhiyunaddtask multilib_install after do_install before do_package do_populate_sysroot
65*4882a593Smuzhiyun# this makes multilib gcc files findable for target gcc
66*4882a593Smuzhiyun# e.g.
67*4882a593Smuzhiyun#    /usr/lib/i586-pokymllib32-linux/4.7/
68*4882a593Smuzhiyun# by creating this symlink to it
69*4882a593Smuzhiyun#    /usr/lib64/x86_64-poky-linux/4.7/32
70*4882a593Smuzhiyun
71*4882a593Smuzhiyunfakeroot python do_multilib_install() {
72*4882a593Smuzhiyun    import re
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun    multilibs = d.getVar('MULTILIB_VARIANTS')
75*4882a593Smuzhiyun    if not multilibs or bb.data.inherits_class('nativesdk', d):
76*4882a593Smuzhiyun        return
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun    binv = d.getVar('BINV')
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun    mlprefix = d.getVar('MLPREFIX')
81*4882a593Smuzhiyun    if ('%slibgcc' % mlprefix) != d.getVar('PN'):
82*4882a593Smuzhiyun        return
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun    if mlprefix:
85*4882a593Smuzhiyun        orig_tune = d.getVar('DEFAULTTUNE_MULTILIB_ORIGINAL')
86*4882a593Smuzhiyun        orig_tune_params = get_tune_parameters(orig_tune, d)
87*4882a593Smuzhiyun        orig_tune_baselib = orig_tune_params['baselib']
88*4882a593Smuzhiyun        orig_tune_bitness = orig_tune_baselib.replace('lib', '')
89*4882a593Smuzhiyun        if not orig_tune_bitness:
90*4882a593Smuzhiyun            orig_tune_bitness = '32'
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun        src = '../../../' + orig_tune_baselib + '/' + \
93*4882a593Smuzhiyun            d.getVar('TARGET_SYS_MULTILIB_ORIGINAL') + '/' + binv + '/'
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun        dest = d.getVar('D') + d.getVar('libdir') + '/' + \
96*4882a593Smuzhiyun            d.getVar('TARGET_SYS') + '/' + binv + '/' + orig_tune_bitness
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun        if os.path.lexists(dest):
99*4882a593Smuzhiyun            os.unlink(dest)
100*4882a593Smuzhiyun        os.symlink(src, dest)
101*4882a593Smuzhiyun        return
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun    for ml in multilibs.split():
105*4882a593Smuzhiyun        tune = d.getVar('DEFAULTTUNE:virtclass-multilib-' + ml)
106*4882a593Smuzhiyun        if not tune:
107*4882a593Smuzhiyun            bb.warn('DEFAULTTUNE:virtclass-multilib-%s is not defined. Skipping...' % ml)
108*4882a593Smuzhiyun            continue
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun        tune_parameters = get_tune_parameters(tune, d)
111*4882a593Smuzhiyun        tune_baselib = tune_parameters['baselib']
112*4882a593Smuzhiyun        if not tune_baselib:
113*4882a593Smuzhiyun            bb.warn("Tune %s doesn't have a baselib set. Skipping..." % tune)
114*4882a593Smuzhiyun            continue
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun        tune_arch = tune_parameters['arch']
117*4882a593Smuzhiyun        tune_bitness = tune_baselib.replace('lib', '')
118*4882a593Smuzhiyun        if not tune_bitness:
119*4882a593Smuzhiyun            tune_bitness = '32' # /lib => 32bit lib
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun        tune_abiextension = tune_parameters['abiextension']
122*4882a593Smuzhiyun        if tune_abiextension:
123*4882a593Smuzhiyun            libcextension = '-gnu' + tune_abiextension
124*4882a593Smuzhiyun        else:
125*4882a593Smuzhiyun            libcextension = ''
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun        src = '../../../' + tune_baselib + '/' + \
128*4882a593Smuzhiyun            tune_arch + d.getVar('TARGET_VENDOR') + 'ml' + ml + \
129*4882a593Smuzhiyun            '-' + d.getVar('TARGET_OS') + libcextension +  '/' + binv + '/'
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun        dest = d.getVar('D') + d.getVar('libdir') + '/' + \
132*4882a593Smuzhiyun            d.getVar('TARGET_SYS') + '/' + binv + '/' + tune_bitness
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun        if os.path.lexists(dest):
135*4882a593Smuzhiyun            os.unlink(dest)
136*4882a593Smuzhiyun        os.symlink(src, dest)
137*4882a593Smuzhiyun}
138*4882a593Smuzhiyun
139*4882a593Smuzhiyundef get_original_os(d):
140*4882a593Smuzhiyun    vendoros = d.expand('${TARGET_ARCH}${ORIG_TARGET_VENDOR}-${TARGET_OS}')
141*4882a593Smuzhiyun    for suffix in [d.getVar('ABIEXTENSION'), d.getVar('LIBCEXTENSION')]:
142*4882a593Smuzhiyun        if suffix and vendoros.endswith(suffix):
143*4882a593Smuzhiyun            vendoros = vendoros[:-len(suffix)]
144*4882a593Smuzhiyun    # Arm must use linux-gnueabi not linux as only the former is accepted by gcc
145*4882a593Smuzhiyun    if vendoros.startswith("arm-") and not vendoros.endswith("-gnueabi"):
146*4882a593Smuzhiyun        vendoros = vendoros + "-gnueabi"
147*4882a593Smuzhiyun    return vendoros
148*4882a593Smuzhiyun
149*4882a593SmuzhiyunORIG_TARGET_VENDOR := "${TARGET_VENDOR}"
150*4882a593SmuzhiyunBASETARGET_SYS = "${@get_original_os(d)}"
151*4882a593Smuzhiyun
152*4882a593Smuzhiyunaddtask extra_symlinks after do_multilib_install before do_package do_populate_sysroot
153*4882a593Smuzhiyunfakeroot python do_extra_symlinks() {
154*4882a593Smuzhiyun    if bb.data.inherits_class('nativesdk', d):
155*4882a593Smuzhiyun        return
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun    targetsys = d.getVar('BASETARGET_SYS')
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun    if targetsys != d.getVar('TARGET_SYS'):
160*4882a593Smuzhiyun        dest = d.getVar('D') + d.getVar('libdir') + '/' + targetsys
161*4882a593Smuzhiyun        src = d.getVar('TARGET_SYS')
162*4882a593Smuzhiyun        if not os.path.lexists(dest) and os.path.lexists(d.getVar('D') + d.getVar('libdir')):
163*4882a593Smuzhiyun            os.symlink(src, dest)
164*4882a593Smuzhiyun}
165