diff --git a/wrapper/main.cpp b/wrapper/main.cpp index e2dba8c..405fae7 100644 --- a/wrapper/main.cpp +++ b/wrapper/main.cpp @@ -167,6 +167,16 @@ bool usegcclibstdcxx(Target &target, const char *, const char *, char **) { return true; } +bool compilerpath(Target &target, const char *, const char *path, char **) { + target.compilerpath = path; + return true; +} + +bool intrinsicpath(Target &target, const char *, const char *path, char **) { + target.intrinsicpath = path; + return true; +} + bool runprog(Target &target, const char *, const char *progname, char **cargs) { auto *prog = program::getprog(progname); @@ -258,6 +268,13 @@ constexpr struct Opt { {"-icxx-isystem", checkincludepath, true, true}, {"-cxx-isystem", checkincludepath, true, true}, {"-I", checkincludepath, true, true}, + + // sets a custom path for the compiler + {"-foc-compiler-path", compilerpath, true, false, "="}, + + // specifies an additional directory to search when looking for clang's + // intrinsic paths + {"-foc-intrinsic-path", intrinsicpath, true, false, "="} }; bool parse(int argc, char **argv, Target &target) { diff --git a/wrapper/target.cpp b/wrapper/target.cpp index e14ddeb..48f0c48 100644 --- a/wrapper/target.cpp +++ b/wrapper/target.cpp @@ -289,10 +289,15 @@ void Target::setCompilerPath() { compilerexecname += "-"; compilerexecname += compilername; } else { - if (!realPath(compilername.c_str(), compilerpath, ignoreCCACHE)) - compilerpath = compilername; + if (!compilerpath.empty()) { + compilerpath += "/"; + compilerpath += compilername; + } else { + if (!realPath(compilername.c_str(), compilerpath, ignoreCCACHE)) + compilerpath = compilername; - compilerexecname += compilername; + compilerexecname += compilername; + } } } @@ -404,6 +409,10 @@ do { \ TRYDIR2("/../include/clang"); TRYDIR2("/usr/include/clang"); + if (!intrinsicpath.empty()) { + TRYDIR2(intrinsicpath); + } + return false; #undef TRYDIR #undef TRYDIR2 diff --git a/wrapper/target.h b/wrapper/target.h index 9c96679..88074f9 100644 --- a/wrapper/target.h +++ b/wrapper/target.h @@ -149,6 +149,7 @@ struct Target { string_vector args; const char *language; char execpath[PATH_MAX + 1]; + std::string intrinsicpath; }; } // namespace target