r346652 - Make clang-based tools find libc++ on MacOS
Ilya Biryukov via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 9 05:14:47 PST 2019
Glad to help. The fix has landed. Let me know if the problem persists after
it's integrated.
On Tue, Jan 8, 2019 at 7:36 PM Nico Weber <thakis at chromium.org> wrote:
> That looks like it should help. Thanks for the quick fix!
>
> On Tue, Jan 8, 2019 at 1:11 PM Ilya Biryukov <ibiryukov at 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 <thakis at 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 at 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 at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>
>>>
>>
>> --
>> Regards,
>> Ilya Biryukov
>>
>
--
Regards,
Ilya Biryukov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190109/f0536b85/attachment-0001.html>
More information about the cfe-commits
mailing list