aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcrossdev395
-rw-r--r--wrappers/Makefile6
-rw-r--r--wrappers/cross-ebuild46
-rwxr-xr-xwrappers/cross-emerge7
-rwxr-xr-xwrappers/cross-pkg-config93
-rwxr-xr-xwrappers/emerge-wrapper23
-rw-r--r--wrappers/etc/portage/make.conf6
-rw-r--r--wrappers/site/linux3
-rw-r--r--wrappers/site/linux-musl4
-rw-r--r--wrappers/site/mipsel-linux-gnu8
10 files changed, 437 insertions, 154 deletions
diff --git a/crossdev b/crossdev
index 7ec9a9d..7a5ad37 100755
--- a/crossdev
+++ b/crossdev
@@ -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}