<pre style='margin:0'>
Ken (kencu) pushed a commit to branch master
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/0d9645676913520cfd38de347cdfbe5b51c56dfb">https://github.com/macports/macports-ports/commit/0d9645676913520cfd38de347cdfbe5b51c56dfb</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new 0d964567691 clang-9.0: backport include-next fix
</span>0d964567691 is described below
<span style='display:block; white-space:pre;color:#808000;'>commit 0d9645676913520cfd38de347cdfbe5b51c56dfb
</span>Author: Ken Cunningham <kencu@macports.org>
AuthorDate: Wed May 5 18:33:24 2021 -0700
<span style='display:block; white-space:pre;color:#404040;'> clang-9.0: backport include-next fix
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> see: https://trac.macports.org/ticket/62770
</span>---
lang/llvm-9.0/Portfile | 5 +-
...clang-fix-include-next-sysroot-cpp-headers.diff | 78 ++++++++++++++++++++++
2 files changed, 82 insertions(+), 1 deletion(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/llvm-9.0/Portfile b/lang/llvm-9.0/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 9d2b95f3aa2..9fecfca9ed8 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/llvm-9.0/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/llvm-9.0/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -15,7 +15,7 @@ set clang_executable_version 9
</span> set lldb_executable_version 9.0.0
name llvm-${llvm_version}
revision 1
<span style='display:block; white-space:pre;background:#ffe0e0;'>-subport clang-${llvm_version} { revision 3 }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+subport clang-${llvm_version} { revision 4 }
</span> subport lldb-${llvm_version} { revision 1 }
set suffix mp-${llvm_version}
set sub_prefix ${prefix}/libexec/llvm-${llvm_version}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -199,6 +199,9 @@ if {${subport} eq "clang-${llvm_version}"} {
</span> # https://github.com/macports/macports-base/pull/179
patchfiles-append patch-libcxx-includes-config-optional-1013.diff
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ # https://reviews.llvm.org/D89001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patchfiles-append patch-clang-fix-include-next-sysroot-cpp-headers.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # https://llvm.org/bugs/show_bug.cgi?id=25681
if {${worksrcdir} eq "trunk" || ${worksrcdir} eq "release_${llvm_version_no_dot}"} {
# Cannot set cppflags due to https://cmake.org/Bug/view.php?id=12928
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/llvm-9.0/files/patch-clang-fix-include-next-sysroot-cpp-headers.diff b/lang/llvm-9.0/files/patch-clang-fix-include-next-sysroot-cpp-headers.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..9ff948910db
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/llvm-9.0/files/patch-clang-fix-include-next-sysroot-cpp-headers.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,78 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+https://reviews.llvm.org/D89001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Currently, Clang looks for libc++ headers alongside the installation
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+directory of Clang, and it also adds a search path for headers in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-isysroot. This is problematic if headers are found in both the toolchain
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+and in the sysroot, since #include_next will end up finding the libc++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+headers in the sysroot instead of the intended system headers.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This patch changes the logic such that if the toolchain contains libc++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+headers, no C++ header paths are added in the sysroot. However, if the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+toolchain does *not* contain libc++ headers, the sysroot is searched as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+usual.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This should not be a breaking change, since any code that previously
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+relied on some libc++ headers being found in the sysroot suffered from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+the #include_next issue described above, which renders any libc++ header
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+basically useless.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/tools/clang/lib/Driver/ToolChains/Darwin.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/tools/clang/lib/Driver/ToolChains/Darwin.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1964,21 +1964,42 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ switch (Type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case ToolChain::CST_Libcxx: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- // On Darwin, libc++ is installed alongside the compiler in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- // include/c++/v1, so get from '<install>/bin' to '<install>/include/c++/v1'.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- llvm::SmallString<128> P = llvm::StringRef(getDriver().getInstalledDir());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- // Note that P can be relative, so we have to '..' and not parent_path.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- llvm::sys::path::append(P, "..", "include", "c++", "v1");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- addSystemInclude(DriverArgs, CC1Args, P);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- // Also add <sysroot>/usr/include/c++/v1 unless -nostdinc is used,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- // to match the legacy behavior in CC1.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (!DriverArgs.hasArg(options::OPT_nostdinc)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- llvm::SmallString<128> P = Sysroot;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- llvm::sys::path::append(P, "usr", "include", "c++", "v1");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- addSystemInclude(DriverArgs, CC1Args, P);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // On Darwin, libc++ can be installed in one of the following two places:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // 1. Alongside the compiler in <install>/include/c++/v1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // 2. In a SDK (or a custom sysroot) in <sysroot>/usr/include/c++/v1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // The precendence of paths is as listed above, i.e. we take the first path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // that exists. Also note that we never include libc++ twice -- we take the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // first path that exists and don't send the other paths to CC1 (otherwise
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // include_next could break).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Check for (1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Get from '<install>/bin' to '<install>/include/c++/v1'.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Note that InstallBin can be relative, so we use '..' instead of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // parent_path.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ llvm::SmallString<128> InstallBin =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ llvm::StringRef(getDriver().getInstalledDir()); // <install>/bin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ llvm::sys::path::append(InstallBin, "..", "include", "c++", "v1");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (getVFS().exists(InstallBin)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ addSystemInclude(DriverArgs, CC1Args, InstallBin);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (DriverArgs.hasArg(options::OPT_v)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ llvm::errs() << "ignoring nonexistent directory \"" << InstallBin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ << "\"\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Otherwise, check for (2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ llvm::SmallString<128> SysrootUsr = Sysroot;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ llvm::sys::path::append(SysrootUsr, "usr", "include", "c++", "v1");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (getVFS().exists(SysrootUsr)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ addSystemInclude(DriverArgs, CC1Args, SysrootUsr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (DriverArgs.hasArg(options::OPT_v)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ llvm::errs() << "ignoring nonexistent directory \"" << SysrootUsr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ << "\"\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Otherwise, don't add any path.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span></pre><pre style='margin:0'>
</pre>