diff --git a/TODO.md b/TODO.md index f9775d2..6554201 100644 --- a/TODO.md +++ b/TODO.md @@ -1,3 +1,5 @@ +- Adjust the hardcoded licenses based on version, for now. Better would be if + the external toolchain provided license data. - Handle relocating debug files based on PACKAGE_DEBUG_SPLIT_STYLE, in a general way, as a better way to handle 6d62e6f. Possibly do a regex search/replace: diff --git a/classes/common-license.bbclass b/classes/common-license.bbclass index f1c8ddf..4f7d93b 100644 --- a/classes/common-license.bbclass +++ b/classes/common-license.bbclass @@ -6,6 +6,7 @@ COMMON_LIC_CHKSUM = "" COMMON_LIC_CHKSUM_CLOSED = "" COMMON_LIC_CHKSUM_GPL-2.0 = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" COMMON_LIC_CHKSUM_GPL-3.0 = "file://${COREBASE}/meta/files/common-licenses/GPL-3.0;md5=c79ff39f19dfec6d293b95dea7b07891" +COMMON_LIC_CHKSUM_GPL-3.0-with-GCC-exception = "file://${COREBASE}/meta/files/common-licenses/GPL-3.0-with-GCC-exception;md5=aef5f35c9272f508be848cd99e0151df" COMMON_LIC_CHKSUM_LGPL-2.1 = "file://${COREBASE}/meta/files/common-licenses/LGPL-2.1;md5=1a6d268fd218675ffea8be556788b780" @@ -14,15 +15,20 @@ python () { #; Set LIC_FILES_CHKSUM to a common license if it's unset and LICENSE is set licensestr = d.getVar('LICENSE', True) + for pkg in d.getVar('PACKAGES', True).split(): + pkg_lic = d.getVar('LICENSE_%s' % pkg, True) + if pkg_lic: + licensestr += ' ' + pkg_lic + licenses = oe.license.flattened_licenses(licensestr, lambda a, b: a + b) - checksums = [] + checksums = set() for license in licenses: if license != 'CLOSED' and d.getVar('LIC_FILES_CHKSUM', False) == '${COMMON_LIC_CHKSUM}': license = mapped_license(license, d) ext_chksum_var = 'COMMON_LIC_CHKSUM_{0}'.format(license) if d.getVar(ext_chksum_var, True): - checksums.append('${%s}' % ext_chksum_var) + checksums.add('${%s}' % ext_chksum_var) else: lic_file_name = '${COREBASE}/meta/files/common-licenses/%s' % license lic_file = d.expand(lic_file_name) diff --git a/conf/distro/include/tcmode-external-sourcery.inc b/conf/distro/include/tcmode-external-sourcery.inc index 67371d0..7e3ba15 100644 --- a/conf/distro/include/tcmode-external-sourcery.inc +++ b/conf/distro/include/tcmode-external-sourcery.inc @@ -30,6 +30,7 @@ PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}binutils ?= "binutils-external-cross- PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}compilerlibs ?= "gcc-runtime-external" PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}libc-for-gcc ?= "glibc-external" PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}libc-initial ?= "glibc-external" +PREFERRED_PROVIDER_gcc-sanitizers ?= "gcc-sanitizers-external" PREFERRED_PROVIDER_glibc ?= "glibc-external" PREFERRED_PROVIDER_virtual/libc ?= "glibc-external" PREFERRED_PROVIDER_virtual/libintl ?= "glibc-external" @@ -55,6 +56,7 @@ PNBLACKLIST[gcc-cross] = "not building with an external toolchain" PNBLACKLIST[gcc-cross-initial] = "not building with an external toolchain" PNBLACKLIST[gcc-cross-intermediate] = "not building with an external toolchain" PNBLACKLIST[gcc-runtime] = "not building with an external toolchain" +PNBLACKLIST[gcc-sanitizers] = "not building with an external toolchain" PNBLACKLIST[libgcc-initial] = "not building with an external toolchain" PNBLACKLIST[libgcc] = "not building with an external toolchain" PNBLACKLIST[linux-libc-headers] = "not building with an external toolchain" diff --git a/recipes-external/gcc/gcc-runtime-external.bb b/recipes-external/gcc/gcc-runtime-external.bb index ac962ce..de3a025 100644 --- a/recipes-external/gcc/gcc-runtime-external.bb +++ b/recipes-external/gcc/gcc-runtime-external.bb @@ -1,114 +1,55 @@ -inherit external-toolchain - -SUMMARY = "The GNU Compiler Collection - gcc runtime libraries" -HOMEPAGE = "http://www.gnu.org/software/gcc/" -SECTION = "devel" GCC_VERSION := "${@external_run(d, 'gcc', '-dumpversion').rstrip()}" PV = "${GCC_VERSION}" +BINV = "${GCC_VERSION}" -DEPENDS += "libgcc" -PROVIDES += "virtual/${TARGET_PREFIX}compilerlibs" +require recipes-devtools/gcc/gcc-runtime.inc +inherit external-toolchain -PACKAGES =+ "\ - libstdc++ \ - libstdc++-dev \ - libstdc++-staticdev \ - libatomic \ - libatomic-dev \ - libatomic-staticdev \ - libasan \ - libasan-dev \ - libasan-staticdev \ - liblsan \ - liblsan-dev \ - liblsan-staticdev \ - libubsan \ - libubsan-dev \ - libubsan-staticdev \ - libtsan \ - libtsan-dev \ - libtsan-staticdev \ - libg2c \ - libg2c-dev \ - libg2c-staticdev \ - libfortran \ - libfortran-dev \ - libfortran-staticdev \ - libmudflap \ - libmudflap-dev \ - libmudflap-staticdev \ - libquadmath \ - libquadmath-dev \ - libquadmath-staticdev \ - libssp \ - libssp-dev \ - libssp-staticdev \ - libgomp \ - libgomp-dev \ - libgomp-staticdev \ - libitm \ - libitm-dev \ - libitm-staticdev \ -" +# GCC >4.2 is GPLv3 +LICENSE = "GPL-3.0-with-GCC-exception & GPLv3" +DEPENDS = "libgcc" +EXTRA_OECONF = "" +python () { + lic_deps = d.getVarFlag('do_populate_lic', 'depends', True).split() + d.setVarFlag('do_populate_lic', 'depends', ' '.join(filter(lambda d: d != 'gcc-source:do_unpack', lic_deps))) -SUMMARY_libitm = "The Transactional Memory runtime library" -SUMMARY_libitm-dev = "${SUMMARY_libitm} - development files" + cfg_deps = d.getVarFlag('do_configure', 'depends', True).split() + d.setVarFlag('do_configure', 'depends', ' '.join(filter(lambda d: d != 'gcc-source:do_preconfigure', cfg_deps))) +} +target_libdir = "${libdir}" +HEADERS_MULTILIB_SUFFIX ?= "${@external_run(d, 'gcc', *(TARGET_CC_ARCH.split() + ['-print-sysroot-headers-suffix'])).rstrip()}" external_libroot = "${@os.path.realpath('${EXTERNAL_TOOLCHAIN_LIBROOT}').replace(os.path.realpath('${EXTERNAL_TOOLCHAIN}') + '/', '/')}" FILES_MIRRORS =. "\ ${libdir}/gcc/${TARGET_SYS}/${GCC_VERSION}/|${external_libroot}/\n \ + ${includedir}/c\+\+/${GCC_VERSION}/${TARGET_SYS}/|${includedir}/c++/${GCC_VERSION}/${EXTERNAL_TARGET_SYS}${HEADERS_MULTILIB_SUFFIX}/\n \ ${includedir}/c\+\+/${GCC_VERSION}/${TARGET_SYS}/|${includedir}/c++/${GCC_VERSION}/${EXTERNAL_TARGET_SYS}/\n \ " -FILES_libstdc++ = "${libdir}/libstdc++${SOLIBS}" -FILES_libstdc++-dev = "${libdir}/libstdc++${SOLIBSDEV} \ - ${includedir}/c++/${GCC_VERSION}/${TARGET_SYS}" -FILES_libstdc++-staticdev = "${libdir}/libstdc++.a \ - ${libdir}/libsupc++.a" -FILES_libatomic = "${libdir}/libatomic${SOLIBS}" -FILES_libatomic-dev = "${libdir}/libatomic${SOLIBSDEV}" -FILES_libatomic-staticdev = "${libdir}/libatomic.a" -FILES_libasan = "${libdir}/libasan${SOLIBS}" -FILES_libasan-dev = "${libdir}/libasan${SOLIBSDEV}" -FILES_libasan-staticdev = "${libdir}/libasan.a" -FILES_liblsan = "${libdir}/liblsan${SOLIBS}" -FILES_liblsan-dev = "${libdir}/liblsan${SOLIBSDEV}" -FILES_liblsan-staticdev = "${libdir}/liblsan.a" -FILES_libubsan = "${libdir}/libubsan${SOLIBS}" -FILES_libubsan-dev = "${libdir}/libubsan${SOLIBSDEV}" -FILES_libubsan-staticdev = "${libdir}/libubsan.a" -FILES_libtsan = "${libdir}/libtsan${SOLIBS}" -FILES_libtsan-dev = "${libdir}/libtsan${SOLIBSDEV}" -FILES_libtsan-staticdev = "${libdir}/libtsan.a" -FILES_libg2c = "${libdir}/libg2c${SOLIBS}" -FILES_libg2c-dev = "${libdir}/libg2c${SOLIBSDEV}" -FILES_libg2c-staticdev = "${libdir}/libg2c.a" -FILES_libfortran = "${libdir}/libfortran${SOLIBS}" -FILES_libfortran-dev = "${libdir}/libfortran${SOLIBSDEV}" -FILES_libfortran-staticdev = "${libdir}/libfortran.a" -FILES_libmudflap = "${libdir}/libmudflap${SOLIBS}" -FILES_libmudflap-dev = "${libdir}/libmudflap${SOLIBSDEV}" -FILES_libmudflap-staticdev = "${libdir}/libmudflap.a" -FILES_libquadmath = "${libdir}/libquadmath${SOLIBS}" -FILES_libquadmath-dev = "${libdir}/libquadmath${SOLIBSDEV} \ - ${libdir}/gcc/${TARGET_SYS}/${GCC_VERSION}/include/quadmath*" -FILES_libquadmath-staticdev = "${libdir}/libquadmath.a" -FILES_libssp = "${libdir}/libssp${SOLIBS}" -FILES_libssp-dev = "${libdir}/libssp${SOLIBSDEV} \ - ${libdir}/gcc/${TARGET_SYS}/${GCC_VERSION}/include/ssp" -FILES_libssp-staticdev = "${libdir}/libssp.a" -FILES_libgomp = "${libdir}/libgomp${SOLIBS}" -FILES_libgomp-dev = "${libdir}/libgomp${SOLIBSDEV} \ - ${libdir}/gcc/${TARGET_SYS}/${GCC_VERSION}/include/omp.h" -FILES_libgomp-staticdev = "${libdir}/libgomp.a" -FILES_libitm = "${libdir}/libitm${SOLIBS}" -FILES_libitm-dev = "${libdir}/libitm${SOLIBSDEV}" -FILES_libitm-staticdev = "${libdir}/libitm.a" +do_install_extra () { + if [ "${TARGET_SYS}" != "${EXTERNAL_TARGET_SYS}" ]; then + if [ -d "${D}${includedir}/c++/${GCC_VERSION}/${EXTERNAL_TARGET_SYS}" ]; then + mv -v "${D}${includedir}/c++/${GCC_VERSION}/${EXTERNAL_TARGET_SYS}/." "${D}${includedir}/c++/${GCC_VERSION}/${TARGET_SYS}/" + fi + fi -FILES_${PN}-dbg += "${datadir}/gdb/python/libstdcxx \ - ${datadir}/gcc-${GCC_VERSION}/python/libstdcxx" + # Clear out the unused c++ header multilibs + multilib="${HEADERS_MULTILIB_SUFFIX}" + for path in ${D}${includedir}/c++/${GCC_VERSION}/${TARGET_SYS}/*; do + case ${path##*/} in + ${multilib#/}) + mv -v "$path/"* "${D}${includedir}/c++/${GCC_VERSION}/${TARGET_SYS}/" + ;; + esac + rm -rfv "$path" + done +} -do_package[depends] += "virtual/${MLPREFIX}libc:do_packagedata" -do_package_write_ipk[depends] += "virtual/${MLPREFIX}libc:do_packagedata" -do_package_write_deb[depends] += "virtual/${MLPREFIX}libc:do_packagedata" -do_package_write_rpm[depends] += "virtual/${MLPREFIX}libc:do_packagedata" +FILES_${PN}-dbg += "${datadir}/gdb/python/libstdcxx" +FILES_libstdc++-dev = "\ + ${includedir}/c++ \ + ${libdir}/libstdc++.so \ + ${libdir}/libstdc++.la \ + ${libdir}/libsupc++.la \ +" +BBCLASSEXTEND = "" diff --git a/recipes-external/gcc/gcc-sanitizers-external.bb b/recipes-external/gcc/gcc-sanitizers-external.bb new file mode 100644 index 0000000..38e82a3 --- /dev/null +++ b/recipes-external/gcc/gcc-sanitizers-external.bb @@ -0,0 +1,18 @@ +GCC_VERSION := "${@external_run(d, 'gcc', '-dumpversion').rstrip()}" +PV = "${GCC_VERSION}" +BINV = "${GCC_VERSION}" + +require recipes-devtools/gcc/gcc-sanitizers.inc +inherit external-toolchain + +# Undo various bits we don't want from the upstream include +EXTRA_OECONF = "" +BBCLASSEXTEND = "" + +python () { + lic_deps = d.getVarFlag('do_populate_lic', 'depends', True).split() + d.setVarFlag('do_populate_lic', 'depends', ' '.join(filter(lambda d: d != 'gcc-source:do_unpack', lic_deps))) + + cfg_deps = d.getVarFlag('do_configure', 'depends', True).split() + d.setVarFlag('do_configure', 'depends', ' '.join(filter(lambda d: d != 'gcc-source:do_preconfigure', cfg_deps))) +} diff --git a/recipes-external/gcc/libgcc-external.bb b/recipes-external/gcc/libgcc-external.bb index 1c01ae1..4d4264c 100644 --- a/recipes-external/gcc/libgcc-external.bb +++ b/recipes-external/gcc/libgcc-external.bb @@ -6,6 +6,7 @@ PV = "${GCC_VERSION}" inherit external-toolchain +LICENSE = "GPL-3.0-with-GCC-exception" PACKAGES =+ "libgcov-dev" external_libroot = "${@os.path.realpath('${EXTERNAL_TOOLCHAIN_LIBROOT}').replace(os.path.realpath('${EXTERNAL_TOOLCHAIN}') + '/', '/')}" @@ -29,7 +30,6 @@ FILES_${PN}-dbg += "${base_libdir}/.debug/libgcc_s.so.*.debug" FILES_libgcov-dev = "${libdir}/gcc/${TARGET_SYS}/${GCC_VERSION}/libgcov.a" INSANE_SKIP_libgcov-dev += "staticdev" - do_package[depends] += "virtual/${MLPREFIX}libc:do_packagedata" do_package_write_ipk[depends] += "virtual/${MLPREFIX}libc:do_packagedata" do_package_write_deb[depends] += "virtual/${MLPREFIX}libc:do_packagedata" diff --git a/recipes-external/glibc/glibc-external.bb b/recipes-external/glibc/glibc-external.bb index d28d0cb..29f474f 100644 --- a/recipes-external/glibc/glibc-external.bb +++ b/recipes-external/glibc/glibc-external.bb @@ -24,6 +24,26 @@ PROVIDES += "glibc \ virtual/libintl \ virtual/libiconv" +def get_external_libc_license(d): + sysroot = d.getVar('EXTERNAL_TOOLCHAIN_SYSROOT', True) + incpath = os.path.join(sysroot, d.getVar('includedir', True)[1:]) + errnopath = os.path.join(incpath, 'errno.h') + + with open(errnopath, 'rU') as f: + text = f.read() + + lictext = """ The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version.""" + + if lictext in text: + return 'LGPL-2.1+' + + return 'UNKNOWN' + +LICENSE := "${@get_external_libc_license(d)}" + require recipes-external/glibc/glibc-sysroot-setup.inc require recipes-external/glibc/glibc-package-adjusted.inc