D17858: clang: Also detect Clang builtin dirs at runtime on Unix
René J.V. Bertin
noreply at phabricator.kde.org
Thu Jan 10 15:04:27 GMT 2019
rjvbb marked 3 inline comments as done.
rjvbb added inline comments.
INLINE COMMENTS
> mwolff wrote in clangsupport.cpp:188
> the path is empty, so nothing will be printed here
>
> please revert to the old behavior and check the validity of the returned path in the conditional, then print builtinDir here
Doh, yes. With my previous implementation the path was never empty when clangBuiltinIncludePath() was called with its default argument. Evidently I had to forget that this was no longer true in the current implementation.
Reverting means we'll be checking the file presence twice in most cases, right? It bothers me a bit to hardcode the filename in 2 locations.
> mwolff wrote in clanghelpers.cpp:374
> the lambda is there to store the result in the `static const` value that will be returned. we don't want to compute the result multiple times
Now why does that remind me of the obfuscated C contests of old? :)
I'll add a comment so others won't make the same mistake.
> mwolff wrote in clanghelpers.cpp:397
> actually, thinking about this once more, it can be further simplified similar to the path above:
>
> dir = QStringLiteral(KDEV_CLANG_BUILTIN_DIR "/../../%1/include").arg(clangVersion());
> if (QFile::exists(dir + QLatin1Char('/') + entryToCheck)) {
> return dir;
> }
>
> then all code paths are basically the same in regard to the `entryToCheck` check, just for different base paths. This could thus be shared, too:
>
> auto isValidDir = [](const QString &dir) {
> return QFile::exists(dir + QLatin1String("/cpuid.h"));
> }
>
> then use this in the three conditionals
Done. I just added a `cleanPath()` as in the WIN32 code path, so we don't return a path containing a "detour" (../..).
> mwolff wrote in clanghelpers.h:108
> the code isn't actually only checking for minor upgrades, or?
No, the code just tries to generate the path corresponding to the current version from what it has. In practice this will correspond to minor upgrades because the typical path has 2 version components and we only correct one:
/usr/lib/llvm-6.0/lib/clang/6.0.1/include
We could correct the first one too but it seems very unlikely that the code will ever get to be executed after major upgrades because libclang itself will no longer be in /usr/lib/llvm-6.0/lib (but under /usr/lib/llvm-X.y or, theoretically, /usr/lib/llvm-6.y).
But yeah, if someone decides to install LLVM to a location that does NOT contain the major version number then my code should handle any upgrade or even downgrade, as long as the plugin still loads against the new libclang.
REPOSITORY
R32 KDevelop
REVISION DETAIL
https://phabricator.kde.org/D17858
To: rjvbb, #kdevelop, flherne, mwolff
Cc: arrowd, mwolff, flherne, kdevelop-devel, glebaccon, hase, antismap, iodelay, geetamc, Pilzschaf, akshaydeo, surgenight
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kdevelop-devel/attachments/20190110/1af81054/attachment-0001.html>
More information about the KDevelop-devel
mailing list