Hi,
with GCC as cross-compiler the PREFIX define (which is set to the
CROSSDIR) makes sure that the linker includes the correct dirs.
Otherwise the cross-build will only find the host libraries, which
does not really work well.
Our clang doesn't do this so far. The changes in clang make sure that
* the library paths are passed to ld(1) and
* the library path /usr/lib is prefixed with the sysroot.
Then we need to make sure to invoke our cross-clang with --sysroot
${CROSSDIR}. For this, simply replace the cc and c++ binary with
a wrapper that calls clang with the correct mode and options.
Comments?
Patrick
diff --git a/Makefile.cross b/Makefile.cross
index 01c1c843953..9c5dbe8b5a5 100644
--- a/Makefile.cross
+++ b/Makefile.cross
@@ -238,10 +238,13 @@ ${CROSSGCC}: ${CROSSBINUTILS}
${MAKE} install)
mv ${CROSSDIR}/usr/bin/clang ${CROSSDIR}/usr/bin/${TARGET_CANON}-clang
mv ${CROSSDIR}/usr/bin/clang++
${CROSSDIR}/usr/bin/${TARGET_CANON}-clang++
- cp -f ${CROSSDIR}/usr/bin/${TARGET_CANON}-clang
${CROSSDIR}/usr/${TARGET_CANON}/bin/${TARGET_CANON}-cc
- cp -f ${CROSSDIR}/usr/bin/${TARGET_CANON}-clang++
${CROSSDIR}/usr/${TARGET_CANON}/bin/${TARGET_CANON}-c++
+ cp -f ${CROSSDIR}/usr/bin/${TARGET_CANON}-clang
${CROSSDIR}/usr/${TARGET_CANON}/bin/${TARGET_CANON}-clang
ln -sf ${TARGET_CANON}-cc ${CROSSDIR}/usr/${TARGET_CANON}/bin/cc
ln -sf ${TARGET_CANON}-c++ ${CROSSDIR}/usr/${TARGET_CANON}/bin/c++
+ echo
"#!/bin/sh\n${CROSSDIR}/usr/${TARGET_CANON}/bin/${TARGET_CANON}-clang --sysroot
${CROSSDIR} \"$$""@\"" >
${CROSSDIR}/usr/${TARGET_CANON}/bin/${TARGET_CANON}-cc; \
+ chmod +x ${CROSSDIR}/usr/${TARGET_CANON}/bin/${TARGET_CANON}-cc;
+ echo
"#!/bin/sh\n${CROSSDIR}/usr/${TARGET_CANON}/bin/${TARGET_CANON}-clang
--driver-mode=g++ --sysroot ${CROSSDIR} \"$$""@\"" >
${CROSSDIR}/usr/${TARGET_CANON}/bin/${TARGET_CANON}-c++; \
+ chmod +x ${CROSSDIR}/usr/${TARGET_CANON}/bin/${TARGET_CANON}-c++;
.elif ${COMPILER_VERSION:L} == "gcc3"
(cd ${.CURDIR}/gnu/usr.bin/gcc; \
MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
diff --git a/gnu/llvm/tools/clang/lib/Driver/ToolChains.cpp
b/gnu/llvm/tools/clang/lib/Driver/ToolChains.cpp
index 45622b22ab5..7ba8f25efdd 100644
--- a/gnu/llvm/tools/clang/lib/Driver/ToolChains.cpp
+++ b/gnu/llvm/tools/clang/lib/Driver/ToolChains.cpp
@@ -2977,7 +2977,7 @@ OpenBSD::OpenBSD(const Driver &D, const llvm::Triple
&Triple,
const ArgList &Args)
: Generic_ELF(D, Triple, Args) {
getFilePaths().push_back(getDriver().Dir + "/../lib");
- getFilePaths().push_back("/usr/lib");
+ getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
}
Tool *OpenBSD::buildAssembler() const {
diff --git a/gnu/llvm/tools/clang/lib/Driver/Tools.cpp
b/gnu/llvm/tools/clang/lib/Driver/Tools.cpp
index 656a8fbbdaf..34cbd620b4b 100644
--- a/gnu/llvm/tools/clang/lib/Driver/Tools.cpp
+++ b/gnu/llvm/tools/clang/lib/Driver/Tools.cpp
@@ -7623,8 +7623,10 @@ void openbsd::Linker::ConstructJob(Compilation &C, const
JobAction &JA,
}
}
- Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
- options::OPT_e, options::OPT_s, options::OPT_t,
+ Args.AddAllArgs(CmdArgs, options::OPT_L);
+ getToolChain().AddFilePathLibArgs(Args, CmdArgs);
+ Args.AddAllArgs(CmdArgs, {options::OPT_T_Group, options::OPT_e,
+ options::OPT_s, options::OPT_t,
options::OPT_Z_Flag, options::OPT_r});
AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);