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);