That looks like it should help. Thanks for the quick fix! On Tue, Jan 8, 2019 at 1:11 PM Ilya Biryukov <ibiryu...@google.com> wrote:
> Hi Nico, > > This is clearly a bug, it's supposed to search in a sibling directory. > Are you running clang as './clang' in the scripts? The code seems to > break in that case, https://reviews.llvm.org/D56446 should fix this. > > On Tue, Jan 8, 2019 at 5:12 PM Nico Weber <tha...@chromium.org> wrote: > >> It looks like clang now looks for libc++ headers in -internal-isystem >> Release+Asserts/bin/include/c++/v1 , compared to -internal-isystem >> Release+Asserts/include/c++/v1. `make install` puts the libc++ headers in >> Release+Asserts/include, the old location. Was this an intentional change? >> >> As-is, this seems to break chromium's clang ability to find libc++ >> headers (https://crbug.com/919761) because we bundle libc++ headers in >> an "include" directory that's a sibling to the "bin" directory (and have >> been doing so for 4.5 years, since >> https://codereview.chromium.org/281753002). >> >> On Mon, Nov 12, 2018 at 8:58 AM Ilya Biryukov via cfe-commits < >> cfe-commits@lists.llvm.org> wrote: >> >>> Author: ibiryukov >>> Date: Mon Nov 12 05:55:55 2018 >>> New Revision: 346652 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=346652&view=rev >>> Log: >>> Make clang-based tools find libc++ on MacOS >>> >>> Summary: >>> When they read compiler args from compile_commands.json. >>> This change allows to run clang-based tools, like clang-tidy or clangd, >>> built from head using the compile_commands.json file produced for XCode >>> toolchains. >>> >>> On MacOS clang can find the C++ standard library relative to the >>> compiler installation dir. >>> >>> The logic to do this was based on resource dir as an approximation of >>> where the compiler is installed. This broke the tools that read >>> 'compile_commands.json' and don't ship with the compiler, as they >>> typically change resource dir. >>> >>> To workaround this, we now use compiler install dir detected by the >>> driver >>> to better mimic the behavior of the original compiler when replaying the >>> compilations using other tools. >>> >>> Reviewers: sammccall, arphaman, EricWF >>> >>> Reviewed By: sammccall >>> >>> Subscribers: ioeric, christof, kadircet, cfe-commits >>> >>> Differential Revision: https://reviews.llvm.org/D54310 >>> >>> Added: >>> cfe/trunk/test/Tooling/Inputs/mock-libcxx/ >>> cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/ >>> cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/c++/ >>> cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/c++/v1/ >>> cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/c++/v1/mock_vector >>> cfe/trunk/test/Tooling/clang-check-mac-libcxx-abspath.cpp >>> cfe/trunk/test/Tooling/clang-check-mac-libcxx-relpath.cpp >>> Modified: >>> cfe/trunk/include/clang/Lex/HeaderSearchOptions.h >>> cfe/trunk/lib/Frontend/CreateInvocationFromCommandLine.cpp >>> cfe/trunk/lib/Frontend/InitHeaderSearch.cpp >>> cfe/trunk/lib/Tooling/Tooling.cpp >>> >>> Modified: cfe/trunk/include/clang/Lex/HeaderSearchOptions.h >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearchOptions.h?rev=346652&r1=346651&r2=346652&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/include/clang/Lex/HeaderSearchOptions.h (original) >>> +++ cfe/trunk/include/clang/Lex/HeaderSearchOptions.h Mon Nov 12 >>> 05:55:55 2018 >>> @@ -108,6 +108,13 @@ public: >>> /// etc.). >>> std::string ResourceDir; >>> >>> + /// Compiler install dir as detected by the Driver. >>> + /// This is typically the directory that contains the clang >>> executable, i.e. >>> + /// the 'bin/' subdir of a clang distribution. >>> + /// Only used to add include dirs for libc++ on Darwin. Please avoid >>> relying >>> + /// on this field for other purposes. >>> + std::string InstallDir; >>> + >>> /// The directory used for the module cache. >>> std::string ModuleCachePath; >>> >>> >>> Modified: cfe/trunk/lib/Frontend/CreateInvocationFromCommandLine.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CreateInvocationFromCommandLine.cpp?rev=346652&r1=346651&r2=346652&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/lib/Frontend/CreateInvocationFromCommandLine.cpp (original) >>> +++ cfe/trunk/lib/Frontend/CreateInvocationFromCommandLine.cpp Mon Nov >>> 12 05:55:55 2018 >>> @@ -11,17 +11,18 @@ >>> // >>> >>> >>> //===----------------------------------------------------------------------===// >>> >>> -#include "clang/Frontend/Utils.h" >>> #include "clang/Basic/DiagnosticOptions.h" >>> +#include "clang/Driver/Action.h" >>> #include "clang/Driver/Compilation.h" >>> #include "clang/Driver/Driver.h" >>> -#include "clang/Driver/Action.h" >>> #include "clang/Driver/Options.h" >>> #include "clang/Driver/Tool.h" >>> #include "clang/Frontend/CompilerInstance.h" >>> #include "clang/Frontend/FrontendDiagnostic.h" >>> +#include "clang/Frontend/Utils.h" >>> #include "llvm/Option/ArgList.h" >>> #include "llvm/Support/Host.h" >>> +#include "llvm/Support/Path.h" >>> using namespace clang; >>> using namespace llvm::opt; >>> >>> @@ -102,5 +103,8 @@ std::unique_ptr<CompilerInvocation> clan >>> CCArgs.size(), >>> *Diags)) >>> return nullptr; >>> + // Patch up the install dir, so we find the same standard library as >>> the >>> + // original compiler on MacOS. >>> + CI->getHeaderSearchOpts().InstallDir = TheDriver.getInstalledDir(); >>> return CI; >>> } >>> >>> Modified: cfe/trunk/lib/Frontend/InitHeaderSearch.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitHeaderSearch.cpp?rev=346652&r1=346651&r2=346652&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/lib/Frontend/InitHeaderSearch.cpp (original) >>> +++ cfe/trunk/lib/Frontend/InitHeaderSearch.cpp Mon Nov 12 05:55:55 2018 >>> @@ -476,14 +476,9 @@ void InitHeaderSearch::AddDefaultInclude >>> if (triple.isOSDarwin()) { >>> // On Darwin, libc++ may be installed alongside the compiler in >>> // include/c++/v1. >>> - if (!HSOpts.ResourceDir.empty()) { >>> - // Remove version from foo/lib/clang/version >>> - StringRef NoVer = >>> llvm::sys::path::parent_path(HSOpts.ResourceDir); >>> - // Remove clang from foo/lib/clang >>> - StringRef Lib = llvm::sys::path::parent_path(NoVer); >>> - // Remove lib from foo/lib >>> - SmallString<128> P = llvm::sys::path::parent_path(Lib); >>> - >>> + if (!HSOpts.InstallDir.empty()) { >>> + // Get from foo/bin to foo. >>> + SmallString<128> >>> P(llvm::sys::path::parent_path(HSOpts.InstallDir)); >>> // Get foo/include/c++/v1 >>> llvm::sys::path::append(P, "include", "c++", "v1"); >>> AddUnmappedPath(P, CXXSystem, false); >>> >>> Modified: cfe/trunk/lib/Tooling/Tooling.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/Tooling.cpp?rev=346652&r1=346651&r2=346652&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/lib/Tooling/Tooling.cpp (original) >>> +++ cfe/trunk/lib/Tooling/Tooling.cpp Mon Nov 12 05:55:55 2018 >>> @@ -327,6 +327,9 @@ bool ToolInvocation::run() { >>> Invocation->getPreprocessorOpts().addRemappedFile(It.getKey(), >>> Input.release()); >>> } >>> + // Patch up the install dir, so we find the same standard library as >>> the >>> + // original compiler on MacOS. >>> + Invocation->getHeaderSearchOpts().InstallDir = >>> Driver->getInstalledDir(); >>> return runInvocation(BinaryName, Compilation.get(), >>> std::move(Invocation), >>> std::move(PCHContainerOps)); >>> } >>> >>> Added: >>> cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/c++/v1/mock_vector >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/c%2B%2B/v1/mock_vector?rev=346652&view=auto >>> >>> ============================================================================== >>> --- cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/c++/v1/mock_vector >>> (added) >>> +++ cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/c++/v1/mock_vector >>> Mon Nov 12 05:55:55 2018 >>> @@ -0,0 +1 @@ >>> +class vector {}; >>> >>> Added: cfe/trunk/test/Tooling/clang-check-mac-libcxx-abspath.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/clang-check-mac-libcxx-abspath.cpp?rev=346652&view=auto >>> >>> ============================================================================== >>> --- cfe/trunk/test/Tooling/clang-check-mac-libcxx-abspath.cpp (added) >>> +++ cfe/trunk/test/Tooling/clang-check-mac-libcxx-abspath.cpp Mon Nov 12 >>> 05:55:55 2018 >>> @@ -0,0 +1,17 @@ >>> +// Clang on MacOS can find libc++ living beside the installed compiler. >>> +// This test makes sure our libTooling-based tools emulate this >>> properly. >>> +// >>> +// RUN: rm -rf %t >>> +// RUN: mkdir %t >>> +// >>> +// Install the mock libc++ (simulates the libc++ directory structure). >>> +// RUN: cp -r %S/Inputs/mock-libcxx %t/ >>> +// >>> +// Pretend clang is installed beside the mock library that we provided. >>> +// RUN: echo '[{"directory":"%t","command":"%t/mock-libcxx/bin/clang++ >>> -stdlib=libc++ -target x86_64-apple-darwin -c >>> test.cpp","file":"test.cpp"}]' | sed -e 's/\\/\//g' > >>> %t/compile_commands.json >>> +// RUN: cp "%s" "%t/test.cpp" >>> +// clang-check will produce an error code if the mock library is not >>> found. >>> +// RUN: clang-check -p "%t" "%t/test.cpp" >>> + >>> +#include <mock_vector> >>> +vector v; >>> >>> Added: cfe/trunk/test/Tooling/clang-check-mac-libcxx-relpath.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/clang-check-mac-libcxx-relpath.cpp?rev=346652&view=auto >>> >>> ============================================================================== >>> --- cfe/trunk/test/Tooling/clang-check-mac-libcxx-relpath.cpp (added) >>> +++ cfe/trunk/test/Tooling/clang-check-mac-libcxx-relpath.cpp Mon Nov 12 >>> 05:55:55 2018 >>> @@ -0,0 +1,17 @@ >>> +// Clang on MacOS can find libc++ living beside the installed compiler. >>> +// This test makes sure our libTooling-based tools emulate this >>> properly. >>> +// >>> +// RUN: rm -rf %t >>> +// RUN: mkdir %t >>> +// >>> +// Install the mock libc++ (simulates the libc++ directory structure). >>> +// RUN: cp -r %S/Inputs/mock-libcxx %t/ >>> +// >>> +// Pretend clang is installed beside the mock library that we provided. >>> +// RUN: echo '[{"directory":"%t","command":"mock-libcxx/bin/clang++ >>> -stdlib=libc++ -target x86_64-apple-darwin -c >>> test.cpp","file":"test.cpp"}]' | sed -e 's/\\/\//g' > >>> %t/compile_commands.json >>> +// RUN: cp "%s" "%t/test.cpp" >>> +// clang-check will produce an error code if the mock library is not >>> found. >>> +// RUN: clang-check -p "%t" "%t/test.cpp" >>> + >>> +#include <mock_vector> >>> +vector v; >>> >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> cfe-commits@lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>> >> > > -- > Regards, > Ilya Biryukov >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits