1require gcc-configure-common.inc 2 3SUMMARY = "Runtime libraries from GCC" 4 5# Over-ride the LICENSE set by gcc-${PV}.inc to remove "& GPL-3.0-only" 6# All gcc-runtime packages are now covered by the runtime exception. 7LICENSE = "GPL-3.0-with-GCC-exception" 8 9CXXFLAGS:remove = "-fvisibility-inlines-hidden" 10 11EXTRA_OECONF_PATHS = "\ 12 --with-gxx-include-dir=${includedir}/c++/${BINV} \ 13 --with-sysroot=/not/exist \ 14 --with-build-sysroot=${STAGING_DIR_TARGET} \ 15" 16 17EXTRA_OECONF:append:linuxstdbase = " --enable-clocale=gnu" 18EXTRA_OECONF:append = " --cache-file=${B}/config.cache" 19EXTRA_OECONF:append:libc-newlib = " --with-newlib" 20 21# Disable ifuncs for libatomic on arm conflicts -march/-mcpu 22EXTRA_OECONF:append:arm = " libat_cv_have_ifunc=no " 23EXTRA_OECONF:append:armeb = " libat_cv_have_ifunc=no " 24 25DISABLE_STATIC:class-nativesdk ?= "" 26 27# Newlib does not support symbol versioning on libsdtcc++ 28SYMVERS_CONF:libc-newlib = "" 29 30# Building with thumb enabled on armv6t fails 31ARM_INSTRUCTION_SET:armv6 = "arm" 32 33RUNTIMELIBITM = "libitm" 34RUNTIMELIBITM:arc = "" 35RUNTIMELIBITM:mipsarch = "" 36RUNTIMELIBITM:nios2 = "" 37RUNTIMELIBITM:microblaze = "" 38RUNTIMELIBITM:riscv32 = "" 39RUNTIMELIBITM:riscv64 = "" 40RUNTIMELIBSSP ?= "" 41RUNTIMELIBSSP:mingw32 ?= "libssp" 42 43RUNTIMETARGET = "${RUNTIMELIBSSP} libstdc++-v3 libgomp libatomic ${RUNTIMELIBITM} \ 44 ${@bb.utils.contains_any('FORTRAN', [',fortran',',f77'], 'libquadmath', '', d)} \ 45" 46# Only build libstdc++ for newlib 47RUNTIMETARGET:libc-newlib = "libstdc++-v3" 48 49# libiberty 50# libgfortran needs separate recipe due to libquadmath dependency 51 52# Relative path to be repaced into debug info 53REL_S = "/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}" 54 55DEBUG_PREFIX_MAP:class-target = " \ 56 -fdebug-prefix-map=${WORKDIR}/${MLPREFIX}recipe-sysroot= \ 57 -fdebug-prefix-map=${WORKDIR}/recipe-sysroot-native= \ 58 -fdebug-prefix-map=${S}=${REL_S} \ 59 -fdebug-prefix-map=${S}/include=${REL_S}/libstdc++-v3/../include \ 60 -fdebug-prefix-map=${S}/libiberty=${REL_S}/libstdc++-v3/../libiberty \ 61 -fdebug-prefix-map=${S}/libgcc=${REL_S}/libstdc++-v3/../libgcc \ 62 -fdebug-prefix-map=${B}=${REL_S} \ 63 -ffile-prefix-map=${B}/${HOST_SYS}/libstdc++-v3/include=${includedir}/c++/${BINV} \ 64 " 65 66do_configure () { 67 export CXX="${CXX} -nostdinc++ -L${WORKDIR}/dummylib" 68 # libstdc++ isn't built yet so CXX would error not able to find it which breaks stdc++'s configure 69 # tests. Create a dummy empty lib for the purposes of configure. 70 mkdir -p ${WORKDIR}/dummylib 71 ${CC} -x c /dev/null -nostartfiles -shared -o ${WORKDIR}/dummylib/libstdc++.so 72 for d in libgcc ${RUNTIMETARGET}; do 73 echo "Configuring $d" 74 rm -rf ${B}/${TARGET_SYS}/$d/ 75 mkdir -p ${B}/${TARGET_SYS}/$d/ 76 cd ${B}/${TARGET_SYS}/$d/ 77 chmod a+x ${S}/$d/configure 78 relpath=${@os.path.relpath("${S}/$d", "${B}/${TARGET_SYS}/$d")} 79 $relpath/configure ${CONFIGUREOPTS} ${EXTRA_OECONF} 80 if [ "$d" = "libgcc" ]; then 81 (cd ${B}/${TARGET_SYS}/libgcc; oe_runmake enable-execute-stack.c unwind.h md-unwind-support.h sfp-machine.h gthr-default.h) 82 fi 83 done 84} 85EXTRACONFFUNCS += "extract_stashed_builddir" 86do_configure[depends] += "${COMPILERDEP}" 87 88do_compile () { 89 for d in libgcc ${RUNTIMETARGET}; do 90 cd ${B}/${TARGET_SYS}/$d/ 91 oe_runmake MULTIBUILDTOP=${B}/${TARGET_SYS}/$d/ 92 done 93} 94 95do_install () { 96 for d in ${RUNTIMETARGET}; do 97 cd ${B}/${TARGET_SYS}/$d/ 98 oe_runmake 'DESTDIR=${D}' MULTIBUILDTOP=${B}/${TARGET_SYS}/$d/ install 99 done 100 if [ -d ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include ]; then 101 install -d ${D}${libdir}/${TARGET_SYS}/${BINV}/include 102 mv ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include/* ${D}${libdir}/${TARGET_SYS}/${BINV}/include 103 rmdir --ignore-fail-on-non-empty -p ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/include 104 fi 105 rm -rf ${D}${infodir}/libgomp.info ${D}${infodir}/dir 106 rm -rf ${D}${infodir}/libitm.info ${D}${infodir}/dir 107 rm -rf ${D}${infodir}/libquadmath.info ${D}${infodir}/dir 108 if [ -d ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/finclude ]; then 109 rmdir --ignore-fail-on-non-empty -p ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/finclude 110 fi 111 if [ -d ${D}${infodir} ]; then 112 rmdir --ignore-fail-on-non-empty -p ${D}${infodir} 113 fi 114} 115 116do_install:append:class-target () { 117 if [ "${TARGET_OS}" = "linux-gnuspe" ]; then 118 ln -s ${TARGET_SYS} ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR}-linux 119 fi 120 121 if [ "${TARGET_OS}" = "linux-gnun32" ]; then 122 if [ "${TARGET_VENDOR_MULTILIB_ORIGINAL}" != "" -a "${TARGET_VENDOR}" != "${TARGET_VENDOR_MULTILIB_ORIGINAL}" ]; then 123 mkdir ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR_MULTILIB_ORIGINAL}-linux 124 ln -s ../${TARGET_SYS} ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR_MULTILIB_ORIGINAL}-linux/32 125 elif [ "${MULTILIB_VARIANTS}" != "" ]; then 126 mkdir ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR}-linux 127 ln -s ../${TARGET_SYS} ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR}-linux/32 128 else 129 ln -s ${TARGET_SYS} ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR}-linux 130 fi 131 elif [ "${TARGET_OS}" = "linux-gnux32" ]; then 132 if [ "${TARGET_VENDOR_MULTILIB_ORIGINAL}" != "" -a "${TARGET_VENDOR}" != "${TARGET_VENDOR_MULTILIB_ORIGINAL}" ]; then 133 mkdir ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR_MULTILIB_ORIGINAL}-linux 134 ln -s ../${TARGET_SYS} ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR_MULTILIB_ORIGINAL}-linux/x32 135 elif [ "${MULTILIB_VARIANTS}" != "" ]; then 136 mkdir ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR}-linux 137 ln -s ../${TARGET_SYS} ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR}-linux/32 138 else 139 ln -s ${TARGET_SYS} ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR}-linux 140 fi 141 elif [ "${TARGET_VENDOR_MULTILIB_ORIGINAL}" != "" -a "${TARGET_VENDOR}" != "${TARGET_VENDOR_MULTILIB_ORIGINAL}" ]; then 142 mkdir ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR_MULTILIB_ORIGINAL}-${TARGET_OS} 143 ln -s ../${TARGET_SYS}/bits ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR_MULTILIB_ORIGINAL}-${TARGET_OS}/bits 144 ln -s ../${TARGET_SYS}/ext ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR_MULTILIB_ORIGINAL}-${TARGET_OS}/ext 145 fi 146 147 if [ "${TARGET_ARCH}" == "x86_64" -a "${MULTILIB_VARIANTS}" != "" ];then 148 ln -sf ../${X86ARCH32}${TARGET_VENDOR}-${TARGET_OS} ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR}-${TARGET_OS}/32 149 fi 150 151 if [ "${TCLIBC}" != "glibc" ]; then 152 case "${TARGET_OS}" in 153 "linux-musl" | "linux-*spe") extra_target_os="linux";; 154 "linux-musleabi") extra_target_os="linux-gnueabi";; 155 *) extra_target_os="linux";; 156 esac 157 ln -s ${TARGET_SYS} ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR}-$extra_target_os 158 fi 159 chown -R root:root ${D} 160} 161 162INHIBIT_DEFAULT_DEPS = "1" 163DEPENDS = "virtual/${TARGET_PREFIX}gcc virtual/${TARGET_PREFIX}g++ libgcc virtual/${MLPREFIX}libc" 164PROVIDES = "virtual/${TARGET_PREFIX}compilerlibs" 165 166BBCLASSEXTEND = "nativesdk" 167 168PACKAGES = "\ 169 ${PN}-dbg \ 170 libstdc++ \ 171 libstdc++-precompile-dev \ 172 libstdc++-dev \ 173 libstdc++-staticdev \ 174 libg2c \ 175 libg2c-dev \ 176 libssp \ 177 libssp-dev \ 178 libssp-staticdev \ 179 libquadmath \ 180 libquadmath-dev \ 181 libquadmath-staticdev \ 182 libgomp \ 183 libgomp-dev \ 184 libgomp-staticdev \ 185 libatomic \ 186 libatomic-dev \ 187 libatomic-staticdev \ 188 libitm \ 189 libitm-dev \ 190 libitm-staticdev \ 191" 192# The base package doesn't exist, so we clear the recommends. 193RRECOMMENDS:${PN}-dbg = "" 194 195# include python debugging scripts 196FILES:${PN}-dbg += "\ 197 ${libdir}/libstdc++.*-gdb.py \ 198 ${datadir}/gcc-${BINV}/python/libstdcxx \ 199" 200 201FILES:libg2c = "${target_libdir}/libg2c.so.*" 202SUMMARY:libg2c = "Companion runtime library for g77" 203FILES:libg2c-dev = "\ 204 ${libdir}/libg2c.so \ 205 ${libdir}/libg2c.a \ 206 ${libdir}/libfrtbegin.a \ 207" 208SUMMARY:libg2c-dev = "Companion runtime library for g77 - development files" 209 210FILES:libstdc++ = "${libdir}/libstdc++.so.*" 211SUMMARY:libstdc++ = "GNU standard C++ library" 212FILES:libstdc++-dev = "\ 213 ${includedir}/c++/ \ 214 ${libdir}/libstdc++.so \ 215 ${libdir}/libstdc++*.la \ 216 ${libdir}/libsupc++.la \ 217" 218SUMMARY:libstdc++-dev = "GNU standard C++ library - development files" 219FILES:libstdc++-staticdev = "\ 220 ${libdir}/libstdc++*.a \ 221 ${libdir}/libsupc++.a \ 222" 223SUMMARY:libstdc++-staticdev = "GNU standard C++ library - static development files" 224 225FILES:libstdc++-precompile-dev = "${includedir}/c++/${TARGET_SYS}/bits/*.gch" 226SUMMARY:libstdc++-precompile-dev = "GNU standard C++ library - precompiled header files" 227 228FILES:libssp = "${libdir}/libssp.so.*" 229SUMMARY:libssp = "GNU stack smashing protection library" 230FILES:libssp-dev = "\ 231 ${libdir}/libssp*.so \ 232 ${libdir}/libssp*_nonshared.a \ 233 ${libdir}/libssp*.la \ 234 ${libdir}/${TARGET_SYS}/${BINV}/include/ssp \ 235" 236SUMMARY:libssp-dev = "GNU stack smashing protection library - development files" 237FILES:libssp-staticdev = "${libdir}/libssp*.a" 238SUMMARY:libssp-staticdev = "GNU stack smashing protection library - static development files" 239 240FILES:libquadmath = "${libdir}/libquadmath*.so.*" 241SUMMARY:libquadmath = "GNU quad-precision math library" 242FILES:libquadmath-dev = "\ 243 ${libdir}/${TARGET_SYS}/${BINV}/include/quadmath* \ 244 ${libdir}/libquadmath*.so \ 245 ${libdir}/libquadmath.la \ 246" 247SUMMARY:libquadmath-dev = "GNU quad-precision math library - development files" 248FILES:libquadmath-staticdev = "${libdir}/libquadmath.a" 249SUMMARY:libquadmath-staticdev = "GNU quad-precision math library - static development files" 250 251FILES:libgomp = "${libdir}/libgomp*${SOLIBS}" 252SUMMARY:libgomp = "GNU OpenMP parallel programming library" 253FILES:libgomp-dev = "\ 254 ${libdir}/libgomp*${SOLIBSDEV} \ 255 ${libdir}/libgomp*.la \ 256 ${libdir}/libgomp.spec \ 257 ${libdir}/${TARGET_SYS}/${BINV}/include/acc_prof.h \ 258 ${libdir}/${TARGET_SYS}/${BINV}/include/omp.h \ 259 ${libdir}/${TARGET_SYS}/${BINV}/include/openacc.h \ 260" 261SUMMARY:libgomp-dev = "GNU OpenMP parallel programming library - development files" 262FILES:libgomp-staticdev = "${libdir}/libgomp*.a" 263SUMMARY:libgomp-staticdev = "GNU OpenMP parallel programming library - static development files" 264 265FILES:libatomic = "${libdir}/libatomic.so.*" 266SUMMARY:libatomic = "GNU C++11 atomics support library" 267FILES:libatomic-dev = "\ 268 ${libdir}/libatomic.so \ 269 ${libdir}/libatomic.la \ 270" 271SUMMARY:libatomic-dev = "GNU C++11 atomics support library - development files" 272FILES:libatomic-staticdev = "${libdir}/libatomic.a" 273SUMMARY:libatomic-staticdev = "GNU C++11 atomics support library - static development files" 274 275FILES:libitm = "${libdir}/libitm.so.*" 276SUMMARY:libitm = "GNU transactional memory support library" 277FILES:libitm-dev = "\ 278 ${libdir}/libitm.so \ 279 ${libdir}/libitm.la \ 280 ${libdir}/libitm.spec \ 281" 282SUMMARY:libitm-dev = "GNU transactional memory support library - development files" 283FILES:libitm-staticdev = "${libdir}/libitm.a" 284SUMMARY:libitm-staticdev = "GNU transactional memory support library - static development files" 285 286require gcc-testsuite.inc 287 288EXTRA_OEMAKE:prepend:task-check = "${PARALLEL_MAKE} " 289 290MAKE_CHECK_TARGETS ??= "check-gcc ${@" ".join("check-target-" + i for i in d.getVar("RUNTIMETARGET").split())}" 291# prettyprinters and xmethods require gdb tooling 292MAKE_CHECK_IGNORE ??= "prettyprinters.exp xmethods.exp" 293MAKE_CHECK_RUNTESTFLAGS ??= "${MAKE_CHECK_BOARDARGS} --ignore '${MAKE_CHECK_IGNORE}'" 294 295# specific host and target dependencies required for test suite running 296do_check[depends] += "dejagnu-native:do_populate_sysroot expect-native:do_populate_sysroot" 297do_check[depends] += "virtual/libc:do_populate_sysroot" 298# only depend on qemu if targeting linux user execution 299do_check[depends] += "${@'qemu-native:do_populate_sysroot' if "user" in d.getVar('TOOLCHAIN_TEST_TARGET') else ''}" 300# extend the recipe sysroot to include the built libraries (for qemu usermode) 301do_check[prefuncs] += "extend_recipe_sysroot" 302do_check[prefuncs] += "check_prepare" 303do_check[dirs] = "${WORKDIR}/dejagnu ${B}" 304do_check[nostamp] = "1" 305do_check() { 306 export DEJAGNU="${WORKDIR}/dejagnu/site.exp" 307 308 # HACK: this works around the configure setting CXX with -nostd* args 309 sed -i 's#-nostdinc++ -L${WORKDIR}/dummylib##g' $(find ${B} -name testsuite_flags | head -1) 310 311 if [ "${TOOLCHAIN_TEST_TARGET}" = "user" ]; then 312 # qemu user has issues allocating large amounts of memory 313 export G_SLICE=always-malloc 314 # no test should need more that 10G of memory, this prevents tests like pthread7-rope from leaking memory 315 ulimit -m 4194304 316 ulimit -v 10485760 317 fi 318 319 oe_runmake -i ${MAKE_CHECK_TARGETS} RUNTESTFLAGS="${MAKE_CHECK_RUNTESTFLAGS}" 320} 321addtask check after do_compile do_populate_sysroot 322 323