diff options
-rwxr-xr-x | crossdev | 395 | ||||
-rw-r--r-- | wrappers/Makefile | 6 | ||||
-rw-r--r-- | wrappers/cross-ebuild | 46 | ||||
-rwxr-xr-x | wrappers/cross-emerge | 7 | ||||
-rwxr-xr-x | wrappers/cross-pkg-config | 93 | ||||
-rwxr-xr-x | wrappers/emerge-wrapper | 23 | ||||
-rw-r--r-- | wrappers/etc/portage/make.conf | 6 | ||||
-rw-r--r-- | wrappers/site/linux | 3 | ||||
-rw-r--r-- | wrappers/site/linux-musl | 4 | ||||
-rw-r--r-- | wrappers/site/mipsel-linux-gnu | 8 |
10 files changed, 437 insertions, 154 deletions
@@ -31,7 +31,7 @@ die_logs() { local log eerror eerror "If you file a bug, please attach the following logfiles:" - eerror "${PORT_LOGDIR}/cross-${CTARGET}-info.log" + eerror "${PORT_LOGDIR}/${CROSSDEV_OVERLAY_CATEGORY}-info.log" for log in "$@" ; do eerror "${log}" done @@ -48,6 +48,7 @@ cat << EOF Usage: ${HILITE}crossdev${NORMAL} ${GOOD}[options]${NORMAL} ${BRACKET}--target TARGET${NORMAL} Options: + ${GOOD}-L, --llvm${NORMAL} Use LLVM/Clang as a cross compiler ${GOOD}--b, --binutils${NORMAL} ver Specify version of binutils to use ${GOOD}--g, --gcc${NORMAL} ver Specify version of gcc to use ${GOOD}--k, --kernel${NORMAL} ver Specify version of kernel headers to use @@ -68,7 +69,6 @@ Options: ${GOOD}--with[out]-headers${NORMAL} Build C library headers before C compiler? ${GOOD}--show-fail-log${NORMAL} If the build fails, dump the failing log - Overlay Options: ${GOOD}-oS, --overlays${NORMAL} list Space delimited list of overlays to search [default: \`portageq repositories_configuration\`] @@ -102,6 +102,15 @@ Extra Fun (must be run after above stages): ${GOOD}--ex-gdb${NORMAL} Build a cross gdb ${GOOD}--ex-pkg${NORMAL} pkg Build extra packages (may be used multiple times) +LLVM/Clang Specific Options (--llvm): + ${GOOD}--r, --crt${NORMAL} ver Specify version of compiler-rt to use + ${GOOD}--c, --ccw${NORMAL} ver Specify version of clang-crossdev-wrapper to use + ${GOOD}--[rc]env${NORMAL} env Specify env settings for compiler-rt/clang-crossdev-wrapper + ${GOOD}--[rc]cat${NORMAL} category Use compiler-rt/clang-crossdev-wrapper package from category + ${GOOD}--[rc]pkg${NORMAL} pkg Use compiler-rt/clang-crossdev-wrapper package with given name + ${GOOD}-or, --ov-crt${NORMAL} path Overlay for compiler-rt ebuilds [default: search] + ${GOOD}-oc, --ov-ccw${NORMAL} path Overlay for clang-crossdev-wrapper ebuilds [default: search] + ${BRACKET}Target (-t)${NORMAL} takes a tuple ${BRACKET}ARCHITECTURE-VENDOR-OS-LIBC${NORMAL}; see 'crossdev -t help' EOF [[ -n $* ]] && echo && eerror "Error: $*" @@ -123,6 +132,12 @@ STAGE_DISP=( parse_target() { CTARGET=${1#cross-} + if [[ ${CTARGET} == "cross-*" ]] ; then + CTARGET=${1#cross-} + elif [[ ${CTARGET} == "cross_llvm-*" ]] ; then + CTARGET=${1#cross_llvm-} + LLVM="yes" + fi [[ -z ${CTARGET} ]] && usage 1 @@ -229,6 +244,7 @@ parse_target() { mips*) TARCH=mips;; powerpc64*) TARCH=ppc64;; powerpc*) TARCH=ppc;; + riscv*) TARCH=riscv;; sparc*) TARCH=sparc;; s390*) TARCH=s390;; sh*) TARCH=sh;; @@ -244,21 +260,23 @@ parse_target() { # this is a linux+ target, not microcontroller (below) avr32*) :;; - avr*) KPKG="[none]" - LCAT="dev-embedded" - LPKG="avr-libc" - GUSE+=" -fortran -go" # doesn't work - MULTILIB_USE="yes" #377039 - BUSE+=" cxx" - STAGE_DEFAULT=${STAGE_LIBC} - WITH_DEF_HEADERS="no";; + avr*) + KPKG="[none]" + LCAT="dev-embedded" + LPKG="avr-libc" + GUSE+=" -fortran -go" # doesn't work + MULTILIB_USE="yes" #377039 + BUSE+=" cxx" + STAGE_DEFAULT=${STAGE_LIBC} + WITH_DEF_HEADERS="no" + ;; # Has no glibc support yet (or even ABI defined). Can # only compile linux kernel: # https://parisc.wiki.kernel.org/index.php/Userspace64 hppa64*) - STAGE_DEFAULT=${STAGE_C_ONLY} - WITH_DEF_HEADERS="no";; + STAGE_DEFAULT=${STAGE_C_ONLY} + WITH_DEF_HEADERS="no";; ia64*) # gcc's libgcc needs glibc headers for unwinder. @@ -275,57 +293,89 @@ parse_target() { # added in bug #609602 mmix*) - KPKG="[none]" - LPKG="newlib" - STAGE_DEFAULT=${STAGE_LIBC} - WITH_DEF_HEADERS="no";; + KPKG="[none]" + LPKG="newlib" + STAGE_DEFAULT=${STAGE_LIBC} + WITH_DEF_HEADERS="no" + ;; + + nvptx*) + BPKG="nvptx-tools" + LPKG="newlib" + STAGE_DEFAULT=${STAGE_LIBC} + ;; # due to upstream lameness, build C/C++ at first glance *-cygwin) - GUSE_DISABLE_STAGE_1+=" -nocxx cxx";; + GUSE_DISABLE_STAGE_1+=" -nocxx cxx" + ;; # these are the mingw64 targets that binutils seems to use x86_64-*-mingw*|*-w64-mingw*) - KPKG="[none]"; - LCAT="dev-util"; LPKG="mingw64-runtime" - WITH_DEF_HEADERS="yes" # gcc can't boot without headers: bug #693770 - GUSE+=" -hardened" # gcc ICEs as libssp/ssp.c:186:1: internal compiler error: in seh_emit_stackalloc - ;; + KPKG="[none]"; + LCAT="dev-util" + LPKG="mingw64-runtime" + WITH_DEF_HEADERS="yes" # gcc can't boot without headers: bug #693770 + GMASK+=" default-stack-clash-protection hardened" + GUSE+=" -default-stack-clash-protection -hardened" # gcc ICEs as libssp/ssp.c:186:1: internal compiler error: in seh_emit_stackalloc + ;; mingw*|*-mingw*) - # bug #584858 - die "'${CTARGET}' target is not supported anymore, use i686-w64-mingw32" - ;; + # bug #584858 + die "'${CTARGET}' target is not supported anymore, use i686-w64-mingw32" + ;; - spu*) TARCH=ppc64; - KPKG="[none]"; - LPKG="newlib";; - ppu*) TARCH=ppc64;; + spu*) + TARCH=ppc64 + KPKG="[none]" + LPKG="newlib" + ;; + ppu*) + TARCH=ppc64 + ;; mips64*-gnuabin32|mipsisa64*-gnuabin32) - [[ ${MULTILIB_ABIS} == "default" ]] && MULTILIB_ABIS="n32";; - mips64*-gnuabi64|mipsisa64*-gnuabi64|\ - mips64*-gnuabin64|mipsisa64*-gnuabin64) - [[ ${MULTILIB_ABIS} == "default" ]] && MULTILIB_ABIS="n64";; - mips64*-gnuabi32|mipsisa64*-gnuabi32|\ - mips64*-gnuabio32|mipsisa64*-gnuabio32) - [[ ${MULTILIB_ABIS} == "default" ]] && MULTILIB_ABIS="o32";; + [[ ${MULTILIB_ABIS} == "default" ]] && MULTILIB_ABIS="n32" + ;; + mips64*-gnuabi64|mipsisa64*-gnuabi64|mips64*-gnuabin64|mipsisa64*-gnuabin64) + [[ ${MULTILIB_ABIS} == "default" ]] && MULTILIB_ABIS="n64" + ;; + mips64*-gnuabi32|mipsisa64*-gnuabi32|mips64*-gnuabio32|mipsisa64*-gnuabio32) + [[ ${MULTILIB_ABIS} == "default" ]] && MULTILIB_ABIS="o32" + ;; esac # Tweak packages based upon CTARGET case ${CTARGET} in # Normal Linux host, just diff libc - *-dietlibc) LPKG="dietlibc"; LCAT="dev-libs";; - *-gnu*) LPKG="glibc";; - *-klibc) LPKG="klibc";; - *-uclibc*) LPKG="uclibc-ng";; - *-uclinux) LPKG="uclibc-ng";; - *-musl*) LPKG="musl";; + *-dietlibc) + LPKG="dietlibc" + LCAT="dev-libs" + ;; + *-gnu*) + LPKG="glibc" + ;; + *-klibc) + LPKG="klibc" + ;; + *-uclibc*) + LPKG="uclibc-ng" + ;; + *-uclinux) + LPKG="uclibc-ng" + ;; + *-musl*) + LPKG="musl" + ;; + *-llvm*) + LPKG="llvm-libc" + ;; # Windows targets *-cygwin) - LCAT="dev-libs"; LPKG="cygwin"; - KPKG="[none]"; + LCAT="dev-libs" + LPKG="cygwin" + KPKG="[none]" ;; # Bare metal targets @@ -333,9 +383,11 @@ parse_target() { LPKG="newlib" KPKG="[none]" STAGE_DEFAULT=${STAGE_LIBC} + GMASK+=" default-stack-clash-protection hardened ssp" GUSE+=" cxx -openmp" #489798 GUSE+=" -fortran" #589672, needs syscalls GUSE+=" -hardened" #687598, needs -fstack-check=specific support + GUSE+=" -default-stack-clash-protection -ssp" # SSP isn't supported for freestanding anyway MULTILIB_USE="yes" #407275 WITH_DEF_HEADERS="no" ;; @@ -404,10 +456,13 @@ parse_target() { case ${CTARGET} in # [1.]: no -fPIC flag support: # check as '$CC -fPIC -c -x c - </dev/null' - avr*|mmix*) pie_support=no;; + avr*|mmix*) + pie_support=no + ;; # [2.] mingw32 startup code is broken: bug #644930 # at least on i686-w64-mingw32 and x86_64-w64-mingw32 - mingw*|*-mingw*) pie_support=no;; + mingw*|*-mingw*) pie_support=no + ;; # Many bare-metal targets don't work with pie as-is *-elf|*-eabi) # mips can't generate freestanding PIC: @@ -419,7 +474,7 @@ parse_target() { ;; esac # Running a hardened profile on the host forces pie #831165 - if [[ $pie_support = "no" ]]; then + if [[ ${pie_support} == "no" ]]; then # pie is >=gcc-6, nopie is <gcc-6 GMASK+=" pie -nopie" GFORCE+=" nopie" @@ -435,9 +490,10 @@ parse_target() { alpha*|avr*|hppa*|ia64*|mmix*|nios2*) ssp_support=no;; esac # Running a hardened profile on the host forces ssp #831165 - if [[ $ssp_support = "no" ]]; then + if [[ ${ssp_support} == "no" ]]; then # ssp is >=gcc-6, nossp is <gcc-6 - GMASK+=" ssp -nossp" + # blacklist hardened too because it'll force -fstack-clash-protection + GMASK+=" default-stack-clash-protection ssp hardened -nossp" GFORCE+=" nossp" fi } @@ -532,7 +588,7 @@ setup_portage_vars() { # install our stuff to the first overlay in the list. if [[ -z ${CROSSDEV_OVERLAY} ]] ; then local repo_path repo_name - for repo_name in "cross-${CTARGET}" crossdev ; do + for repo_name in "${CROSSDEV_OVERLAY_CATEGORY}" crossdev ; do repo_path=$(echo "${REPO_CONFIG}" | sed -n "/^${repo_name}:/s,^[^:]*:,,p") if [[ -n ${repo_path} ]] ; then CROSSDEV_OVERLAY=${repo_path} @@ -583,14 +639,11 @@ uninstall() { ewarn "Uninstalling target '${CTARGET}' ..." # clean out portage config files - if grep -qs "^cross-${CTARGET}/" "${EPREFIX}"/var/lib/portage/world ; then - sed -i "/^cross-${CTARGET}/d" "${EPREFIX}"/var/lib/portage/world - fi - if [[ -d ${CROSSDEV_OVERLAY}/cross-${CTARGET} ]]; then - rm -r "${CROSSDEV_OVERLAY}"/cross-${CTARGET} + if [[ -d ${CROSSDEV_OVERLAY}/${CROSSDEV_OVERLAY_CATEGORY} ]]; then + rm -r "${CROSSDEV_OVERLAY}"/${CROSSDEV_OVERLAY_CATEGORY} # if we remove all the package in the category, # might as well remove the category itself - sed -e "/cross-${CTARGET}/d" \ + sed -e "/${CROSSDEV_OVERLAY_CATEGORY}/d" \ -i "${CROSSDEV_OVERLAY}"/profiles/categories fi # If profiles/categories is empty, see if we can remove the output overlay entirely @@ -628,16 +681,21 @@ uninstall() { # crossdev stopped creating 'package.keywords' in Jan 2020 for f in package.{accept_keywords,env,mask,keywords,use} profile/package.use.{force,mask} ; do f="${CONFIGROOT}/${f}" - rm -f "${f}"/cross-${CTARGET} + rm -f "${f}"/${CROSSDEV_OVERLAY_CATEGORY} rmdir "${f}" 2>/dev/null done - rm -rf "${CONFIGROOT}"/env/cross-${CTARGET} + rm -rf "${CONFIGROOT}"/env/${CROSSDEV_OVERLAY_CATEGORY} rmdir "${CONFIGROOT}"/env 2>/dev/null - rm -f "${EPREFIX}"/etc/revdep-rebuild/05cross-${CTARGET} + rm -f "${EPREFIX}"/etc/revdep-rebuild/05${CROSSDEV_OVERLAY_CATEGORY} rmdir "${EPREFIX}"/etc/revdep-rebuild 2>/dev/null + if [[ "${LLVM}" == "yes" ]] ; then + rm ${EROOT}/etc/clang/cross/${CTARGET}.cfg + rmdir ${EROOT}/etc/clang/cross 2>/dev/null + fi + # Unmerge all toolchain packages for this target. - qmerge -Uqy $(qlist -IC "cross-${CTARGET}/") + emerge -q --rage-clean "${CROSSDEV_OVERLAY_CATEGORY}/*" # clean out known toolchain files (binutils/gcc) for f in \ @@ -653,8 +711,8 @@ uninstall() { rm -f "${EPREFIX}"/etc/env.d/{binutils,gcc}/config-${CTARGET} # clean out files from crossdev itself - [[ -e ${EPREFIX}/var/db/pkg/cross-${CTARGET} ]] && rmdir "${EPREFIX}"/var/db/pkg/cross-${CTARGET} - rm -f "${EPREFIX}"/usr/bin/${CTARGET}-{emerge,fix-root,pkg-config} "${EPREFIX}"/usr/bin/emerge-${CTARGET} + [[ -e ${EPREFIX}/var/db/pkg/${CROSSDEV_OVERLAY_CATEGORY} ]] && rmdir "${EPREFIX}"/var/db/pkg/${CROSSDEV_OVERLAY_CATEGORY} + rm -f "${EPREFIX}"/usr/bin/${CTARGET}-{emerge,ebuild,fix-root,pkg-config} "${EPREFIX}"/usr/bin/emerge-${CTARGET} for f in make.{conf,globals,profile} ; do f="${EPREFIX}/usr/${CTARGET}/etc/${f}" @@ -795,12 +853,15 @@ BCAT="sys-devel" ; BPKG="binutils" ; BVER="" BUSE="" BENV="" BOVL="" BMASK GCAT="sys-devel" ; GPKG="gcc" ; GVER="" GUSE="" GENV="" GOVL="" GMASK="" GFORCE="" KCAT="sys-kernel" ; KPKG="linux-headers" ; KVER="" KUSE="" KENV="" KOVL="" KMASK="" KFORCE="" LCAT="sys-libs" ; LPKG="[none]" ; LVER="" LUSE="" LENV="" LOVL="" LMASK="" LFORCE="" -DCAT="sys-devel" ; DPKG="gdb" ; DVER="" DUSE="" DENV="" DOVL="" DMASK="" DFORCE="" +DCAT="dev-debug" ; DPKG="gdb" ; DVER="" DUSE="" DENV="" DOVL="" DMASK="" DFORCE="" +RCAT="sys-libs" ; RPKG="compiler-rt" ; RVER="" RUSE="" RENV="" ROVL="" RMASK="" RFORCE="" +CCAT="sys-devel" ; CPKG="clang-crossdev-wrappers" ; CVER="" CUSE="" CENV="" COVL="" CMASK="" CFORCE="" XPKGS=() XVERS=() XUSES=() XENVS=() XOVLS=() XMASKS=() XFORCES=() DEFAULT_VER="[latest]" SEARCH_OVERLAYS="" CROSSDEV_OVERLAY="" CROSSDEV_OVERLAY_NAME="" +CROSSDEV_OVERLAY_CATEGORY_PREFIX="cross-" CROSSDEV_OVERLAY_CREATE_REPOS_CONF="" AUTOGEN_TAG="# Autogenerated and managed by crossdev" # These flags are always disabled for cross-gcc; either usually/always broken, or @@ -832,6 +893,7 @@ ACTION="install" SHOW_FAIL_LOG="no" SHOW_TARGET_CFG="no" INIT_TARGET_ONLY="no" +LLVM="no" while [[ $# -gt 0 ]] ; do case $1 in @@ -862,8 +924,19 @@ while [[ $# -gt 0 ]] ; do -ol|--ov-libc) shift; LOVL=$1;; --lcat) shift; LCAT=$1;; --lpkg) shift; LPKG=$1;; + --r|--crt) shift; RVER=$1;; + --renv) shift; RENV=$1;; + -or|--ov-crt) shift; ROVL=$1;; + --rcat) shift; RCAT=$1;; + --rpkg) shift; RPKG=$1;; + --c|--ccw) shift; CVER=$1;; + --cenv) shift; CENV=$1;; + -oc|--ov-ccw) shift; COVL=$1;; + --ccat) shift; CCAT=$1;; + --cpkg) shift; CPKG=$1;; -ox|--ov-extra) shift; XOVLS+=( "$1" );; --env) shift; AENV=$1;; + -L|--llvm) LLVM="yes";; -A|--abis) shift; MULTILIB_ABIS=$1;; --host-abi) shift; HOST_ABI=$1;; -S|--stable) DEFAULT_VER="[stable]";; @@ -890,6 +963,16 @@ while [[ $# -gt 0 ]] ; do esac shift done + +if [[ "${LLVM}" == "yes" ]] ; then + WITH_HEADERS="yes" + CROSSDEV_OVERLAY_CATEGORY_PREFIX="cross_llvm-" + # To avoid bug reports + [[ "${LPKG}" == "glibc" ]] && die "LLVM/Clang cannot currently compile glibc" +fi + +CROSSDEV_OVERLAY_CATEGORY="${CROSSDEV_OVERLAY_CATEGORY_PREFIX}${CTARGET}" + [[ ${SET_X} == "yes" ]] && set -x case ${ACTION} in uninstall) uninstall; exit 0;; @@ -899,6 +982,7 @@ BVER=${BVER:-${DEFAULT_VER}} GVER=${GVER:-${DEFAULT_VER}} KVER=${KVER:-${DEFAULT_VER}} LVER=${LVER:-${DEFAULT_VER}} +DVER=${DVER:-${DEFAULT_VER}} STAGE=${STAGE:-${STAGE_DEFAULT}} [[ -z ${CTARGET} ]] && usage 1 for with in HEADERS ; do @@ -915,6 +999,8 @@ if [[ ${LPKG} == "newlib" && ${LVER} == "[stable]" ]]; then LVER="[latest]" fi +RVER="[latest]" + show_target_cfg() { local pkgs crosspkgs=() @@ -938,7 +1024,7 @@ show_target_cfg() { echo "arch=${TARCH}" echo "target=${CTARGET}" - echo "category=cross-${CTARGET}" + echo "category=${CROSSDEV_OVERLAY_CATEGORY}" while [[ ${#pkgs[@]} -gt 0 ]] ; do local pkg=${pkgs[0]} local v=${pkgs[1]} @@ -986,7 +1072,7 @@ done # grab user settings d="${CONFIGROOT}/crossdev/${CTARGET}" -for v in MULTILIB_ABIS USE BVER GVER KVER LVER STAGE CFLAGS LDFLAGS ASFLAGS ; do +for v in MULTILIB_ABIS USE BVER GVER KVER LVER DVER STAGE CFLAGS LDFLAGS ASFLAGS ; do if [[ -e ${d}/${v} ]] ; then # yes, quotes are needed in this instance (export $var="...") export ${v}="$(<"${d}"/${v})" @@ -1075,6 +1161,7 @@ fi ### do the emerge ### info() { hr - +[[ "${LLVM}" == "yes" ]] && einfo "Using LLVM/Clang as cross compiler, experimental!" einfo "crossdev version: ${CROSSDEV_VER}" einfo "Host Portage ARCH: ${HARCH}" einfo "Host Portage System: ${HCHOST} (${HCHOSTS[*]})" @@ -1087,10 +1174,14 @@ einfo "Target ABIs: ${MULTILIB_ABIS}${def_out}" echo ex_fast || { is_s0 && { -einfo "binutils: `pretty_atom ${BPKG}- ${BVER}`" +[[ "${LLVM}" == "yes" ]] || einfo "binutils: `pretty_atom ${BPKG}- ${BVER}`" } is_s1 && { -einfo "gcc: `pretty_atom ${GPKG}- ${GVER}`" + if [[ "${LLVM}" == "yes" ]] ; then + einfo "compiler-rt: `pretty_atom ${RPKG}- ${RVER}`" + else + einfo "gcc: `pretty_atom ${GPKG}- ${GVER}`" + fi } is_s2 && { [[ ${KPKG} != "[none]" ]] && \ @@ -1122,7 +1213,7 @@ if [[ ${INIT_TARGET_ONLY} != "yes" ]] ; then ( info emerge -v --info - ) >& "${PORT_LOGDIR}"/cross-${CTARGET}-info.log || exit 1 + ) >& "${PORT_LOGDIR}"/${CROSSDEV_OVERLAY_CATEGORY}-info.log || exit 1 fi #################################### @@ -1137,8 +1228,8 @@ check_trailing_newline() { #267132 } _set_portage_file() { local pkg=$1 output=$2 - [[ ! -f ${output} ]] && output+="/cross-${CTARGET}" - [[ -e ${output} ]] && sed -i -e "/^cross-${CTARGET}\/${pkg}/d" ${output} + [[ ! -f ${output} ]] && output+="/${CROSSDEV_OVERLAY_CATEGORY}" + [[ -e ${output} ]] && sed -i -e "/^${CROSSDEV_OVERLAY_CATEGORY}\/${pkg}/d" ${output} check_trailing_newline ${output} echo ${output} } @@ -1154,23 +1245,23 @@ set_keywords() { *) keywords="${TARCH} ~${TARCH}";; esac [[ "${TARCH}" != "${HARCH}" ]] && keywords="${keywords} -${HARCH} -~${HARCH}" - echo "cross-${CTARGET}/${pkg} ${keywords}" >> ${output} + echo "${CROSSDEV_OVERLAY_CATEGORY}/${pkg} ${keywords}" >> ${output} else local op=$(ver_get_op "${ver}") if [[ -n ${op} ]] ; then # user has been explicit in the version they desire ver=$(ver_chop_op "${ver}") - echo "cross-${CTARGET}/${pkg} -*" >> ${output} - echo "${op}cross-${CTARGET}/${pkg}-${ver} * ~* **" >> ${output} + echo "${CROSSDEV_OVERLAY_CATEGORY}/${pkg} -*" >> ${output} + echo "${op}${CROSSDEV_OVERLAY_CATEGORY}/${pkg}-${ver} * ~* **" >> ${output} if [[ ${ver} != "9999" ]] ; then # Disable live versions unless exactly requested. output=$(_set_portage_file ${pkg} package.mask) - echo ">=cross-${CTARGET}/${pkg}-9999" >> ${output} + echo ">=${CROSSDEV_OVERLAY_CATEGORY}/${pkg}-9999" >> ${output} fi else - echo "cross-${CTARGET}/${pkg} * ~* **" >> ${output} + echo "${CROSSDEV_OVERLAY_CATEGORY}/${pkg} * ~* **" >> ${output} output=$(_set_portage_file ${pkg} package.mask) - echo ">cross-${CTARGET}/${pkg}-${ver}" >> ${output} + echo ">${CROSSDEV_OVERLAY_CATEGORY}/${pkg}-${ver}" >> ${output} fi fi } @@ -1178,25 +1269,25 @@ set_use() { local pkg=$1 output use=${@:2} [[ -z ${use} ]] && return 0 output=$(_set_portage_file ${pkg} package.use) - echo "cross-${CTARGET}/${pkg} ${use}" >> ${output} + echo "${CROSSDEV_OVERLAY_CATEGORY}/${pkg} ${use}" >> ${output} } set_use_force() { local pkg=$1 output use=${@:2} [[ -z ${use} ]] && return 0 output=$(_set_portage_file ${pkg} profile/package.use.force) - echo "cross-${CTARGET}/${pkg} ${use}" >> ${output} + echo "${CROSSDEV_OVERLAY_CATEGORY}/${pkg} ${use}" >> ${output} } set_use_mask() { local pkg=$1 output use=${@:2} [[ -z ${use} ]] && return 0 output=$(_set_portage_file ${pkg} profile/package.use.mask) - echo "cross-${CTARGET}/${pkg} ${use}" >> ${output} + echo "${CROSSDEV_OVERLAY_CATEGORY}/${pkg} ${use}" >> ${output} } set_links() { local cat=$1 pkg=$2 ovl=$3 local s srcdir=${MAIN_REPO_PATH} d - d="${CROSSDEV_OVERLAY}"/cross-${CTARGET}/${pkg} + d="${CROSSDEV_OVERLAY}"/${CROSSDEV_OVERLAY_CATEGORY}/${pkg} # if auto searching and something is already set, leave it be if [[ -z ${ovl} ]] && [[ -e ${d} ]] ; then #211386 #347389 einfo "leaving ${cat}/${pkg} in ${CROSSDEV_OVERLAY}" @@ -1217,13 +1308,15 @@ set_links() { case "${LVER}" in "[stable]") - search_kw_string="^[~]${TARCH}" + search_kw_string="[^~]${TARCH}" ;; *) search_kw_string="${TARCH}" ;; esac + # TODO: Import eapi7-ver.eclass and prefer the best version + # rather than just the first we find. if grep -qre "KEYWORDS=.*${search_kw_string}" "${s}/${cat}/${pkg}" ; then # ... so only skip if we found one which is at least stable. srcdir=${s} @@ -1247,7 +1340,7 @@ set_env() { # the best we've got without implementing reference counting on # installed paths in the PM. - output="env/cross-${CTARGET}/${pkg}.conf" + output="env/${CROSSDEV_OVERLAY_CATEGORY}/${pkg}.conf" cat <<-EOF > "${output}" SYMLINK_LIB=no COLLISION_IGNORE="\${COLLISION_IGNORE} /usr/lib/debug/.build-id" @@ -1285,7 +1378,8 @@ set_env() { done >> "${output}" output=$(_set_portage_file ${pkg} package.env) - echo "cross-${CTARGET}/${pkg} cross-${CTARGET}/${pkg}.conf" >> ${output} + echo "${CROSSDEV_OVERLAY_CATEGORY}/${pkg} ${CROSSDEV_OVERLAY_CATEGORY}/${pkg}.conf" >> ${output} + [[ "${LLVM}" == "yes" ]] && echo "${CROSSDEV_OVERLAY_CATEGORY}/${pkg} ${CROSSDEV_OVERLAY_CATEGORY}/llvm.conf" >> ${output} } set_portage() { local l=$1 @@ -1345,7 +1439,7 @@ set_metadata() { fi # build up a list of possible repos where we can pull from - for d in "${BOVL}" "${GOVL}" "${KOVL}" "${LOVL}" ${SEARCH_OVERLAYS} "${MAIN_REPO_PATH}" ; do + for d in "${BOVL}" "${GOVL}" "${KOVL}" "${LOVL}" "${ROVL}" "${DOVL}" ${SEARCH_OVERLAYS} "${MAIN_REPO_PATH}" ; do [[ -z ${d} ]] && continue name= @@ -1408,28 +1502,35 @@ set_metadata() { fi } -xmkdir -p "${CROSSDEV_OVERLAY}"/{cross-${CTARGET},profiles} +xmkdir -p "${CROSSDEV_OVERLAY}"/{${CROSSDEV_OVERLAY_CATEGORY},profiles} f="${CROSSDEV_OVERLAY}"/profiles/categories check_trailing_newline "${f}" -grep -qs "^cross-${CTARGET}$" "${f}" \ - || echo cross-${CTARGET} >> "${f}" +grep -qs "^${CROSSDEV_OVERLAY_CATEGORY}$" "${f}" \ + || echo ${CROSSDEV_OVERLAY_CATEGORY} >> "${f}" xmkdir -p "${CONFIGROOT}" cd "${CONFIGROOT}" || die "wtf!?" -for f in package.{accept_keywords,env,mask,use} env/cross-${CTARGET} profile/package.use.{force,mask} ; do +for f in package.{accept_keywords,env,mask,use} env/${CROSSDEV_OVERLAY_CATEGORY} profile/package.use.{force,mask} ; do [[ -f ${f} ]] && die "please convert ${CONFIGROOT}/${f} to a directory" xmkdir -p "${f}" - rm -f "${f}/cross-${CTARGET}" + rm -f "${f}/${CROSSDEV_OVERLAY_CATEGORY}" done -for v in B G K L D ; do - set_portage ${v} +pkglist=( K L ) +if [[ ${LLVM} == "yes" ]] ; then + pkglist+=( R C ) +else + pkglist+=( B G D ) +fi +for pkg in ${pkglist[@]}; do + set_portage $pkg done + for_each_extra_pkg set_portage X set_metadata xmkdir -p "${EPREFIX}"/etc/revdep-rebuild -cat > "${EPREFIX}"/etc/revdep-rebuild/05cross-${CTARGET} << EOF +cat > "${EPREFIX}"/etc/revdep-rebuild/05${CROSSDEV_OVERLAY_CATEGORY} << EOF # Generated by crossdev-${CROSSDEV_VER} # Ignore ${CTARGET} root, https://bugs.gentoo.org/182601. SEARCH_DIRS_MASK="${EPREFIX}/usr/${CTARGET}" @@ -1441,15 +1542,15 @@ hr ### Create links for helper scripts ### xmkdir -p "${EPREFIX}"/usr/${CTARGET} -emerge-wrapper --target ${CTARGET} --init || exit 1 +LLVM="${LLVM}" emerge-wrapper --target ${CTARGET} --init || exit 1 ############################################################# ### Create directories usually created by sys-apps/baselayout ### ### Why we do that at all: -### For multilib-aware targets (ppc64, s390x, sparc64, x86_64) Gentoo +### For multilib-aware targets (ppc64, s390x, sparc64, x86_64), Gentoo ### normally uses libdir=lib64. -### For crossdev it means /lib and /usr/lib does not get created at all +### For crossdev, it means /lib and /usr/lib does not get created at all ### but gcc relies on their presence by refering to =/lib64 as ### =/usr/lib/../lib64 when builds itself (see https://bugs.gentoo.org/652724) ### @@ -1489,10 +1590,31 @@ case ${CTARGET} in ;; esac +# HOSTCC is used by linux-headers to compile fixdeps program for CBUILD +if [[ "${LLVM}" == "yes" ]] ; then + cat <<-EOF > "${CONFIGROOT}/env/${CROSSDEV_OVERLAY_CATEGORY}/llvm.conf" + AR=llvm-ar + AS="${CTARGET}-clang -c" + CC="${CTARGET}-clang" + CROSS_COMPILE="${CTARGET}-" + CXX="${CTARGET}-clang++" + DLLTOOL=llvm-dlltool + HOSTCC="${CC:=clang}" + HOSTCXX="${CXX:=clang++}" + LD=ld.lld + LLVM=1 + NM=llvm-nm + OBJCOPY=llvm-objcopy + RANLIB=llvm-ranlib + READELF=llvm-readelf + STRIP=llvm-strip + EOF +fi + ################# emerged_with_use() { local pkg=$1 use=$2 - grep -qs ${use} "${EPREFIX}"/var/db/pkg/cross-${CTARGET}/${pkg}-*/USE + grep -qs ${use} "${EPREFIX}"/var/db/pkg/${CROSSDEV_OVERLAY_CATEGORY}/${pkg}-*/USE } # Force package rebuild if any of passed USE-flag is set otherwise install package only if flag is missing. # $1 - pkg @@ -1511,8 +1633,9 @@ set_eopts_on_pkg_status() { # Install if missing EOPTS=${EOPTS_UP} } + doemerge() { - local category="cross-${CTARGET}" + local category="${CROSSDEV_OVERLAY_CATEGORY}" local pn=$1 local atom="${category}/${pn}" @@ -1528,7 +1651,7 @@ doemerge() { || logfile=${logfile}-$2.log einfo "Log: ${logfile}" - ebegin "Emerging cross-${2:-${pn}}" + ebegin "Emerging ${CROSSDEV_OVERLAY_CATEGORY_PREFIX}${2:-${pn}}" if has -v ${UOPTS} || has -p ${UOPTS} || has -vp ${UOPTS} || has -pv ${UOPTS} ; then SHOW_FAIL_LOG="no" @@ -1559,7 +1682,7 @@ doemerge() { eend 0 } -# We include the '-u' so that we don't re-emerge packages. Avoid +# We include the '-u' so that we don't re-emerge packages. Avoid # using --nodeps as packages have more host depends nowadays (like # gcc wanting updated mpfr/gmp). Don't use --oneshot anymore to # follow normal emerge behavior; people can pass the -1 to portage @@ -1573,13 +1696,67 @@ export EMERGE_DEFAULT_OPTS="--quiet-build=n" # screw random strictness in cross-compilers export FEATURES="${FEATURES} -stricter" +if [[ "${LLVM}" == "yes" ]]; then + CLANG_CROSS_CFG_DIR=/etc/clang/cross + [[ -d "${CLANG_CROSS_CFG_DIR}" ]] || mkdir -p "${CLANG_CROSS_CFG_DIR}" + + export CLANG_CROSS_CFG="${CLANG_CROSS_CFG_DIR}/${CTARGET}.cfg" + # Force --unwindlib=none for now + cat <<-EOF > "${CLANG_CROSS_CFG}" + --rtlib=compiler-rt + --sysroot=/usr/${CTARGET} + --target=${CTARGET} + --unwindlib=none + -fuse-ld=lld + EOF + # Workaround until LLVM libc supports dynamic linking and SSP + [[ "${LPKG}" == "llvm-libc" ]] && cat <<-EOF >> "${CLANG_CROSS_CFG}" + -static + -fno-stack-protector + EOF +fi + # maybe someday this work, but that day != today USE="${USE} -selinux" if ! ex_fast ; then # stage 0: binutils - USE="${BUSE}" doemerge ${BPKG} + if [[ "${LLVM}" == "yes" ]] ; then + if ! portageq has_version / "sys-devel/llvm" ; then + eerror "LLVM is not installed" + exit 1 + fi + + best_ver=$(portageq best_version "${EPREFIX}"/ sys-devel/llvm) + llvm_use=$(portageq metadata "${EPREFIX}"/ installed "${best_ver}" USE) + + llvm_arch="" + case ${CTARGET} in + x86*) llvm_arch="X86" ;; + arm*) llvm_arch="ARM" ;; + aarch64*) llvm_arch="AArch64" ;; + riscv*) llvm_arch="RISCV" ;; + mips*) llvm_arch="Mips" ;; + loongarch*) llvm_arch="LoongArch" ;; + powerpc*) llvm_arch="PowerPC" ;; + sparc*) llvm_arch="Sparc" ;; + esac + + supported_arch=0 + for flag in ${llvm_use} ; do + if [[ ${flag} == llvm_targets_* ]] ; then + target=${flag#llvm_targets_} + [[ ${llvm_arch} == ${target} ]] && supported_arch=1 + fi + done + + [[ ${supported_arch} -eq 0 ]] && die "Target architecture not supported by installed LLVM toolchain" + + USE="${CUSE}" doemerge ${CPKG} + else + USE="${BUSE}" doemerge ${BPKG} + fi # stage1: bare C compiler if is_s1 ; then @@ -1604,9 +1781,17 @@ if ! ex_fast ; then fi # then finally get around to the C compiler - USE="${GUSE} ${USE} ${GUSE_DISABLE_STAGE_1}" \ - CROSSCOMPILE_OPTS="" \ - doemerge ${GPKG} ${GPKG}-stage1 + if [[ "${LLVM}" == "yes" ]]; then + # Compile compiler-rt + USE="${RUSE} ${USE}" \ + CROSSCOMPILE_OPTS="" \ + doemerge ${RPKG} + else + USE="${GUSE} ${USE} ${GUSE_DISABLE_STAGE_1}" \ + CROSSCOMPILE_OPTS="" \ + doemerge ${GPKG} ${GPKG}-stage1 + fi + fi # stage2: kernel headers @@ -1630,8 +1815,8 @@ if ! ex_fast ; then fi # stage4: full compiler (C/C++/etc...) - if is_s4 ; then - EOPTS="${EOPTS_UP} --newuse" + if is_s4 && [[ "${LLVM}" != "yes" ]] ; then + EOPTS="${EOPTS_UP} --newuse" \ USE="${GUSE} ${USE} ${GUSE_DISABLE_STAGE_2}" \ doemerge ${GPKG} ${GPKG}-stage2 fi diff --git a/wrappers/Makefile b/wrappers/Makefile index 19a1da3..a55c2bc 100644 --- a/wrappers/Makefile +++ b/wrappers/Makefile @@ -1,10 +1,9 @@ -# Copyright 2008-2010 Gentoo Foundation +# Copyright 2008-2023 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 include ../settings.mk -PORTDIR ?= $(shell portageq envvar PORTDIR) -FNAMES = cross-emerge cross-fix-root cross-pkg-config emerge-wrapper +FNAMES = cross-ebuild cross-emerge cross-fix-root cross-pkg-config emerge-wrapper SITEDIR = $(PREFIX)/share/crossdev/include/site ETC_SITEDIR = $(EPREFIX)/etc/crossdev/include/site @@ -24,6 +23,5 @@ install: sed -i -e s:@SITEDIR@:$(SITEDIR):g $(DESTDIR)$(SITEDIR)/config.site sed -i -e s:@ETC_SITEDIR@:$(ETC_SITEDIR):g $(DESTDIR)$(SITEDIR)/config.site mv $(DESTDIR)$(SITEDIR)/config.site $(DESTDIR)$(PREFIX)/share/ - ln -sf $(PORTDIR)/profiles/embedded $(DESTDIR)$(PREFIX)/share/crossdev/etc/portage/make.profile .PHONY: all install diff --git a/wrappers/cross-ebuild b/wrappers/cross-ebuild new file mode 100644 index 0000000..a520e18 --- /dev/null +++ b/wrappers/cross-ebuild @@ -0,0 +1,46 @@ +#!/bin/sh +# Copyright 2008-2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +if [ -z "${CHOST}" ] ; then + CHOST=${0##*/} + CHOST=${CHOST%-ebuild} + CHOST=${CHOST#ebuild-} +fi +export CHOST + +BROOT="@GENTOO_PORTAGE_EPREFIX@" +if [ "${BROOT}" = "@"GENTOO_PORTAGE_EPREFIX"@" ] ; then + BROOT="" +fi + +: ${EPREFIX=} +: ${SYSROOT=${BROOT}/usr/${CHOST}} +: ${PORTAGE_CONFIGROOT=${SYSROOT}${EPREFIX}} +export EPREFIX SYSROOT PORTAGE_CONFIGROOT + +if [ -z "${CHOST}" ] ; then + echo "cross-ebuild: CHOST is not set properly" + exit 1 +fi + +if [ ! -d "${SYSROOT}" ] ; then + echo "cross-ebuild: ${SYSROOT} does not exist (is CHOST set properly?)" + exit 1 +fi + +# Portage defaults CBUILD to CHOST, so we have to remove CHOST +# from the env to get a "good" value for CBUILD +query_vars="CBUILD CFLAGS CXXFLAGS CPPFLAGS LDFLAGS" +clean_vars="${query_vars} CHOST SYSROOT PORTAGE_CONFIGROOT" +eval $(env $(printf -- '-u %s ' ${clean_vars}) \ + portageq envvar -v ${query_vars} | sed s:^:_E_:) +: ${CBUILD=${_E_CBUILD}} +: ${BUILD_CFLAGS=${_E_CFLAGS}} +: ${BUILD_CXXFLAGS=${_E_CXXFLAGS}} +: ${BUILD_CPPFLAGS=${_E_CPPFLAGS}} +: ${BUILD_LDFLAGS=${_E_LDFLAGS}} +export CBUILD BUILD_CFLAGS BUILD_CXXFLAGS BUILD_CPPFLAGS BUILD_LDFLAGS + +: ${CROSS_CMD:=ebuild} +exec ${CROSS_CMD} "$@" diff --git a/wrappers/cross-emerge b/wrappers/cross-emerge index a85d41e..eb2d5b5 100755 --- a/wrappers/cross-emerge +++ b/wrappers/cross-emerge @@ -19,11 +19,16 @@ fi : ${PORTAGE_CONFIGROOT=${SYSROOT}${EPREFIX}} export EPREFIX SYSROOT PORTAGE_CONFIGROOT -if [ -z "${CHOST}" ] || [ ! -d "${SYSROOT}" ] ; then +if [ -z "${CHOST}" ] ; then echo "cross-emerge: CHOST is not set properly" exit 1 fi +if [ ! -d "${SYSROOT}" ] ; then + echo "cross-emerge: ${SYSROOT} does not exist (is CHOST set properly?)" + exit 1 +fi + # Portage defaults CBUILD to CHOST, so we have to remove CHOST # from the env to get a "good" value for CBUILD query_vars="CBUILD CFLAGS CXXFLAGS CPPFLAGS LDFLAGS" diff --git a/wrappers/cross-pkg-config b/wrappers/cross-pkg-config index 62f0dfa..eb4047f 100755 --- a/wrappers/cross-pkg-config +++ b/wrappers/cross-pkg-config @@ -1,5 +1,5 @@ #!/bin/sh -# Copyright 2008-2014 Gentoo Foundation +# Copyright 2008-2022 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # @@ -20,6 +20,9 @@ error() { exit 1 } +# abort infinite loop due to misconfiguration +[ "${0##*/}" = "pkg-config" ] && error "aborting infinite loop! (make sure to delete uClinux-dist/tools/pkg-config)" + # # Allow very basic checks. This is not very sophisticated, but should get the # job done, practically speaking. @@ -48,32 +51,52 @@ if [ "$1" = "--cross-pkg-config-install" ] ; then exit 0 fi -unset EXTRA_PKG_CONFIG_LIBDIR +export PKG_CONFIG_LIBDIR= +unset PREFIX + if [ -z "${CHOST}" ] ; then CHOST=${0##*/} CHOST=${CHOST%-pkg-config} fi -if [ -z "${SYSROOT}" ] ; then - if [ "@CROSS_PKG_CONFIG_INSTALLED@" = "installed" ] ; then - # Manual install - SYSROOT="@CROSS_PKG_CONFIG_PATH@" - elif [ -n "${ROOT}" ] ; then - # Gentoo - SYSROOT=${ROOT} - elif [ -n "${STAGEDIR}" ] ; then - # uClinux-dist - SYSROOT=${STAGEDIR} - EXTRA_PKG_CONFIG_LIBDIR=${UCLINUX_PKG_CONFIG_LIBDIR} + +if [ -n "${ESYSROOT+x}" ] ; then + # Gentoo EAPI 7+ + : ${PKG_CONFIG_SYSROOT_DIR=${SYSROOT}} + PREFIX=${ESYSROOT%/} + PREFIX=${PREFIX#${SYSROOT%/}} +elif [ -n "${ROOT+x}" ] ; then + # Gentoo EAPI 0-6 + if [ -n "${SYSROOT%/}" ]; then + : ${PKG_CONFIG_SYSROOT_DIR=${SYSROOT}} + PREFIX=${EPREFIX%/} else - # /usr/<target> - SYSROOT="/usr/${CHOST}" - if [ -z "${CHOST}" ] || [ ! -d "${SYSROOT}" ] ; then - error "Need \$ROOT or \$STAGEDIR set first" - fi + : ${PKG_CONFIG_SYSROOT_DIR=} + PREFIX=${PORTAGE_OVERRIDE_EPREFIX%/} + fi +elif [ -n "${SYSROOT+x}" ] ; then + # Generic + : ${PKG_CONFIG_SYSROOT_DIR=${SYSROOT}} +elif [ "@CROSS_PKG_CONFIG_INSTALLED@" = "installed" ] ; then + # Manual install + : ${PKG_CONFIG_SYSROOT_DIR="@CROSS_PKG_CONFIG_PATH@"} +elif [ -n "${STAGEDIR}" ] ; then + # uClinux-dist + : ${PKG_CONFIG_SYSROOT_DIR=${STAGEDIR}} + PKG_CONFIG_LIBDIR=${UCLINUX_PKG_CONFIG_LIBDIR} +else + # /usr/<target> + : ${PKG_CONFIG_SYSROOT_DIR=/usr/${CHOST}} + + if [ -z "${CHOST}" ] || [ ! -d "${PKG_CONFIG_SYSROOT_DIR}" ] ; then + error "Need \$ROOT or \$STAGEDIR set first" fi fi -# abort infinite loop due to misconfiguration -[ "${0##*/}" = "pkg-config" ] && error "aborting infinite loop! (make sure to delete uClinux-dist/tools/pkg-config)" + +export PKG_CONFIG_SYSROOT_DIR=${PKG_CONFIG_SYSROOT_DIR%/} +PKG_CONFIG_ESYSROOT_DIR=${PKG_CONFIG_SYSROOT_DIR}${PREFIX} + +# https://github.com/pkgconf/pkgconf/issues/205 +export PKG_CONFIG_FDO_SYSROOT_RULES=1 # # Some distributions pollute the pkg-config environment. @@ -92,22 +115,20 @@ var="LIBDIR_${ABI}" eval libdir=\${${var}} if [ -z "${libdir}" ] ; then # Fall back to probing the compiler. + ## TODO: CLANG FIX libdir=$(realpath "$(${CC:-${CHOST}-gcc} ${CFLAGS} ${LDFLAGS} -print-file-name=pkgconfig)/..") # Chopping the basename isn't exactly correct, but it's good enough for now. - libdir=$(basename "${libdir}") + libdir=${libdir##*/} fi : ${libdir:=lib} -export PKG_CONFIG_SYSTEM_LIBRARY_PATH="/usr/${libdir}:/${libdir}" +export \ + PKG_CONFIG_SYSTEM_LIBRARY_PATH="${PKG_CONFIG_ESYSROOT_DIR}/usr/${libdir}:${PKG_CONFIG_ESYSROOT_DIR}/${libdir}" \ + PKG_CONFIG_SYSTEM_INCLUDE_PATH="${PKG_CONFIG_ESYSROOT_DIR}/usr/include" # # Set the pkg-config search paths to our staging directory. # -export PKG_CONFIG_LIBDIR="${SYSROOT}/usr/${libdir}/pkgconfig:${SYSROOT}/usr/share/pkgconfig" -if [ -n "${EXTRA_PKG_CONFIG_LIBDIR}" ] ; then - PKG_CONFIG_LIBDIR="${EXTRA_PKG_CONFIG_LIBDIR}:${PKG_CONFIG_LIBDIR}" -fi -: ${PKG_CONFIG_SYSROOT_DIR=${SYSROOT}} -export PKG_CONFIG_SYSROOT_DIR +PKG_CONFIG_LIBDIR="${PKG_CONFIG_LIBDIR}${PKG_CONFIG_LIBDIR:+:}${PKG_CONFIG_ESYSROOT_DIR}/usr/${libdir}/pkgconfig:${PKG_CONFIG_ESYSROOT_DIR}/usr/share/pkgconfig" # # Sanity check the output to catch common errors that do not @@ -118,20 +139,20 @@ ret=$? # We turn the output into a newline separate string of options, then use grep # to look for bad -Is and -Ls. Bad -Is and -Ls are ones that point to things -# outside the ${SYSROOT}. -bad_lines=$(echo "${output}" | # Get the pkg-config output. - tr -s ' ' '\n' | # Put each flags on its own line. - grep '^-[LI]' | # Find all -I and -L lines. - grep -v -E "..${SYSROOT}" # Find all things outside the SYSROOT. - ) +# outside the ${PKG_CONFIG_ESYSROOT_DIR}. +bad_lines=$( + printf "%s\n" ${output} | # Put each flags on its own line. + grep '^-[LI]' | # Find all -I and -L lines. + grep -v "^..${PKG_CONFIG_ESYSROOT_DIR}" # Find all things outside the sysroot. +) if [ -n "${bad_lines}" ] ; then warn "### falling down so here is a dump state ######" pkg-config --debug "$@" 1>&2 warn "### end of dump ###############################" warn "### suspicious compile flags dumped here ######" - echo "${bad_lines}" + printf "%s\n" "${bad_lines}" warn "### end of flag dump ##########################" error "host -I or -L paths detected: ${output}" fi -[ -n "${output}" ] && echo "${output}" +[ -n "${output}" ] && printf "%s\n" "${output}" exit ${ret} diff --git a/wrappers/emerge-wrapper b/wrappers/emerge-wrapper index 051948a..79c182e 100755 --- a/wrappers/emerge-wrapper +++ b/wrappers/emerge-wrapper @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2008-2010 Gentoo Foundation +# Copyright 2008-2023 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 if [[ $1 == "--help" || $1 == "-h" ]] ; then @@ -37,6 +37,7 @@ cross_wrap_etc() setup_warning=false cp -a "${PREFIX}"/share/crossdev/etc ${SYSROOT}/ || return 1 + ln -snf "${MAIN_REPO_PATH}/profiles/embedded" "${SYSROOT}/etc/portage/make.profile" || return 1 local confs=( ${SYSROOT}/etc/portage/make.conf @@ -86,6 +87,26 @@ cross_wrap_etc() -e "s:__CBUILD__:${CBUILD}:g" \ "${confs[@]}" + if [[ "${LLVM}" == "yes" ]] ; then + cat <<-EOF >>${SYSROOT}/etc/portage/profile/make.defaults + AR=llvm-ar + AS=llvm-as + CC="${CHOST}-clang" + CROSS_COMPILE="${CHOST}-" + CXX="${CHOST}-clang++" + DLLTOOL=llvm-dlltool + HOSTCC="${CC:=clang}" + HOSTCXX="${CXX:=clang++}" + LD=ld.lld + LLVM=1 + NM=llvm-nm + OBJCOPY=llvm-objcopy + RANLIB=llvm-ranlib + READELF=llvm-readelf + STRIP=llvm-strip + EOF + fi + return 0 } diff --git a/wrappers/etc/portage/make.conf b/wrappers/etc/portage/make.conf index 2ab65b3..b845ba6 100644 --- a/wrappers/etc/portage/make.conf +++ b/wrappers/etc/portage/make.conf @@ -9,15 +9,15 @@ ROOT=@GENTOO_PORTAGE_EPREFIX@/usr/${CHOST}/ ACCEPT_KEYWORDS="${ARCH} ~${ARCH}" -USE="${ARCH} -pam" +USE="${ARCH}" CFLAGS="-O2 -pipe -fomit-frame-pointer" CXXFLAGS="${CFLAGS}" FEATURES="-collision-protect sandbox buildpkg noman noinfo nodoc" # Be sure we dont overwrite pkgs from another repo.. -PKGDIR=${ROOT}packages/ +PKGDIR=${ROOT}var/cache/binpkgs/ PORTAGE_TMPDIR=${ROOT}tmp/ PKG_CONFIG_PATH="${ROOT}usr/lib/pkgconfig/" -#PORTDIR_OVERLAY="/usr/portage/local/" +#PORTDIR_OVERLAY="/var/db/repos/local/" diff --git a/wrappers/site/linux b/wrappers/site/linux index e97d26b..cb6b191 100644 --- a/wrappers/site/linux +++ b/wrappers/site/linux @@ -58,3 +58,6 @@ screen_cv_sys_select_broken_retval=${screen_cv_sys_select_broken_retval=no} screen_cv_sys_sockets_nofs=${screen_cv_sys_sockets_nofs=no} screen_cv_sys_sockets_usable=${screen_cv_sys_sockets_usable=yes} screen_cv_sys_terminfo_used=${screen_cv_sys_terminfo_used=yes} + +# Python +ac_cv_working_tzset=${ac_cv_working_tzset=yes} diff --git a/wrappers/site/linux-musl b/wrappers/site/linux-musl new file mode 100644 index 0000000..d126046 --- /dev/null +++ b/wrappers/site/linux-musl @@ -0,0 +1,4 @@ +# sys-devel/flex-2.5.35 +# bug #705800 and many others +ac_cv_func_malloc_0_nonnull=yes +ac_cv_func_realloc_0_nonnull=yes diff --git a/wrappers/site/mipsel-linux-gnu b/wrappers/site/mipsel-linux-gnu index 42f82bf..c96fad1 100644 --- a/wrappers/site/mipsel-linux-gnu +++ b/wrappers/site/mipsel-linux-gnu @@ -109,14 +109,14 @@ cv_mono_sizeof_sunpath=108 mono_cv_uscore=${mono_cv_uscore=no} # general -ac_cv_have_decl_sys_siglist=${ac_cv_have_decl_sys_siglist=yes} +ac_cv_have_decl_sys_siglist=${ac_cv_have_decl_sys_siglist=no} ac_cv_func_malloc_0_nonnull=${ac_cv_func_malloc_0_nonnull=yes} ac_cv_func_memcmp_working=${ac_cv_func_memcmp_working=yes} -ac_cv_type_uid_t={ac_cv_type_uid_t=yes} +ac_cv_type_uid_t=${ac_cv_type_uid_t=yes} # bash -bash_cv_under_sys_siglist=${bash_cv_under_sys_siglist=yes} -bash_cv_sys_siglist=${bash_cv_sys_siglist=yes} +bash_cv_under_sys_siglist=${bash_cv_under_sys_siglist=no} +bash_cv_sys_siglist=${bash_cv_sys_siglist=no} # clamav clamav_av_func_working_snprintf_long=${clamav_av_func_working_snprintf_long=yes} |