The "tools-prefix" method for building world with clang. First of all, Makefile.inc1 is modified to build the clang libraries and binaries during the cross-tools stage, iff CC=clang. The lib/clang/clang.build.mk file, which contains common build settings for all llvm and clang sources, is modified to add a CLANG_PREFIX macro to CFLAGS, iff TOOLS_PREFIX is defined. In the clang sources, the files that define the built-in search paths for headers, startup objects and libraries, are modified to use the (optional) CLANG_PREFIX macro as prefix for all those paths. diff --git a/Makefile.inc1 b/Makefile.inc1 index d2581c5..6e58396 100644 --- a/Makefile.inc1 +++ b/Makefile.inc1 @@ -1078,8 +1078,15 @@ _kgzip= usr.sbin/kgzip .endif .endif +.if ${CC:T:Mclang} == "clang" +_clang= usr.bin/clang +_clang_libs= lib/clang +.endif + cross-tools: .for _tool in \ + ${_clang_libs} \ + ${_clang} \ gnu/usr.bin/binutils \ gnu/usr.bin/cc \ usr.bin/xlint/lint1 usr.bin/xlint/lint2 usr.bin/xlint/xlint \ diff --git a/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp b/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp index a78d153..3506590 100644 --- a/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp +++ b/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp @@ -26,6 +26,10 @@ #include // ::getenv +#ifndef CLANG_PREFIX +#define CLANG_PREFIX +#endif + using namespace clang::driver; using namespace clang::driver::toolchains; @@ -869,11 +873,9 @@ FreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple, bool Lib32) getProgramPaths().push_back(getDriver().Dir + "/../libexec"); getProgramPaths().push_back("/usr/libexec"); if (Lib32) { - getFilePaths().push_back(getDriver().Dir + "/../lib32"); - getFilePaths().push_back("/usr/lib32"); + getFilePaths().push_back(CLANG_PREFIX "/usr/lib32"); } else { - getFilePaths().push_back(getDriver().Dir + "/../lib"); - getFilePaths().push_back("/usr/lib"); + getFilePaths().push_back(CLANG_PREFIX "/usr/lib"); } } diff --git a/contrib/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp b/contrib/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp index fcfee71..9187148 100644 --- a/contrib/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp +++ b/contrib/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp @@ -30,6 +30,9 @@ #define WIN32_LEAN_AND_MEAN 1 #include #endif +#ifndef CLANG_PREFIX +#define CLANG_PREFIX +#endif using namespace clang; using namespace clang::frontend; @@ -408,9 +411,10 @@ static bool getWindowsSDKDir(std::string &path) { void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple, const HeaderSearchOptions &HSOpts) { -#if 0 /* Remove unneeded include paths. */ // FIXME: temporary hack: hard-coded paths. - AddPath("/usr/local/include", System, true, false, false); +#ifndef __FreeBSD__ + AddPath(CLANG_PREFIX "/usr/local/include", System, true, false, false); +#endif // Builtin includes use #include_next directives and should be positioned // just prior C include dirs. @@ -421,7 +425,6 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple, P.appendComponent("include"); AddPath(P.str(), System, false, false, false, /*IgnoreSysRoot=*/ true); } -#endif // Add dirs specified via 'configure --with-c-include-dirs'. llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS); @@ -518,13 +521,15 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple, case llvm::Triple::MinGW32: AddPath("c:/mingw/include", System, true, false, false); break; + case llvm::Triple::FreeBSD: + AddPath(CLANG_PREFIX "/usr/include/clang/" CLANG_VERSION_STRING, + System, false, false, false); + break; default: break; } - AddPath("/usr/include/clang/" CLANG_VERSION_STRING, - System, false, false, false); - AddPath("/usr/include", System, false, false, false); + AddPath(CLANG_PREFIX "/usr/include", System, false, false, false); } void InitHeaderSearch:: @@ -726,8 +731,10 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple) { case llvm::Triple::FreeBSD: // FreeBSD 8.0 // FreeBSD 7.3 - AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2", "", "", "", triple); - AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2/backward", "", "", "", triple); + AddGnuCPlusPlusIncludePaths(CLANG_PREFIX "/usr/include/c++/4.2", + "", "", "", triple); + AddGnuCPlusPlusIncludePaths(CLANG_PREFIX "/usr/include/c++/4.2/backward", + "", "", "", triple); break; case llvm::Triple::Minix: AddGnuCPlusPlusIncludePaths("/usr/gnu/include/c++/4.4.3", diff --git a/lib/clang/clang.build.mk b/lib/clang/clang.build.mk index 6351eda..86384db 100644 --- a/lib/clang/clang.build.mk +++ b/lib/clang/clang.build.mk @@ -28,6 +28,10 @@ LLVM_REQUIRES_RTTI= CFLAGS+=-fno-rtti .endif +.ifdef TOOLS_PREFIX +CFLAGS+=-DCLANG_PREFIX=\"${TOOLS_PREFIX}\" +.endif + .PATH: ${LLVM_SRCS}/${SRCDIR} TBLGEN=tblgen ${CFLAGS:M-I*}