From: James Y Knight Date: Wed, 22 May 2019 20:39:51 +0000 (+0000) Subject: Add back --sysroot support for darwin header search. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ef51dce2c7d014cfe77ad7266f093ccc1b544332;p=clang Add back --sysroot support for darwin header search. Before e97b5f5cf37e ([clang][Darwin] Refactor header search path logic into the driver), both --sysroot and -isysroot worked to specify where to look for system and C++ headers on Darwin. However, that change caused clang to start ignoring --sysroot. This fixes the regression, and adds tests. (I also note that on all other platforms, clang seems to almost completely ignore -isysroot, but that's another issue...) Differential Revision: https://reviews.llvm.org/D62268 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@361429 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/ToolChains/Darwin.cpp b/lib/Driver/ToolChains/Darwin.cpp index 3596be4160..478e1111e1 100644 --- a/lib/Driver/ToolChains/Darwin.cpp +++ b/lib/Driver/ToolChains/Darwin.cpp @@ -1805,13 +1805,21 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { } } +// Returns the effective header sysroot path to use. This comes either from +// -isysroot or --sysroot. +llvm::StringRef DarwinClang::GetHeaderSysroot(const llvm::opt::ArgList &DriverArgs) const { + if(DriverArgs.hasArg(options::OPT_isysroot)) + return DriverArgs.getLastArgValue(options::OPT_isysroot); + if (!getDriver().SysRoot.empty()) + return getDriver().SysRoot; + return "/"; +} + void DarwinClang::AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const { const Driver &D = getDriver(); - llvm::StringRef Sysroot = "/"; - if (const Arg *A = DriverArgs.getLastArg(options::OPT_isysroot)) - Sysroot = A->getValue(); + llvm::StringRef Sysroot = GetHeaderSysroot(DriverArgs); bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc); bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc); @@ -1897,12 +1905,7 @@ void DarwinClang::AddClangCXXStdlibIncludeArgs( DriverArgs.hasArg(options::OPT_nostdincxx)) return; - llvm::SmallString<128> Sysroot; - if (const Arg *A = DriverArgs.getLastArg(options::OPT_isysroot)) { - Sysroot = A->getValue(); - } else { - Sysroot = "/"; - } + llvm::StringRef Sysroot = GetHeaderSysroot(DriverArgs); switch (GetCXXStdlibType(DriverArgs)) { case ToolChain::CST_Libcxx: { diff --git a/lib/Driver/ToolChains/Darwin.h b/lib/Driver/ToolChains/Darwin.h index 610f338ebc..2dc7c85880 100644 --- a/lib/Driver/ToolChains/Darwin.h +++ b/lib/Driver/ToolChains/Darwin.h @@ -539,6 +539,8 @@ private: llvm::StringRef Version, llvm::StringRef ArchDir, llvm::StringRef BitDir) const; + + llvm::StringRef GetHeaderSysroot(const llvm::opt::ArgList &DriverArgs) const; }; } // end namespace toolchains diff --git a/test/Driver/darwin-header-search-libcxx.cpp b/test/Driver/darwin-header-search-libcxx.cpp index 9113b291e7..d22b8a8cbe 100644 --- a/test/Driver/darwin-header-search-libcxx.cpp +++ b/test/Driver/darwin-header-search-libcxx.cpp @@ -36,6 +36,7 @@ // Check with both headers in the sysroot and headers alongside the installation // (the headers in should be added after the toolchain headers). +// Ensure that both -isysroot and --sysroot work, and that isysroot has precedence. // // RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ // RUN: -target x86_64-apple-darwin \ @@ -46,6 +47,28 @@ // RUN: | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr \ // RUN: -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain \ // RUN: --check-prefix=CHECK-LIBCXX-SYSROOT_AND_TOOLCHAIN-1 %s +// +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target x86_64-apple-darwin \ +// RUN: -stdlib=libc++ \ +// RUN: -ccc-install-dir %S/Inputs/basic_darwin_toolchain/usr/bin \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: --sysroot %S/Inputs/basic_darwin_sdk_usr \ +// RUN: | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr \ +// RUN: -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain \ +// RUN: --check-prefix=CHECK-LIBCXX-SYSROOT_AND_TOOLCHAIN-1 %s +// +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target x86_64-apple-darwin \ +// RUN: -stdlib=libc++ \ +// RUN: -ccc-install-dir %S/Inputs/basic_darwin_toolchain/usr/bin \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: -isysroot %S/Inputs/basic_darwin_sdk_usr \ +// RUN: --sysroot %S/Inputs/basic_darwin_sdk_no_libcxx \ +// RUN: | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr \ +// RUN: -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain \ +// RUN: --check-prefix=CHECK-LIBCXX-SYSROOT_AND_TOOLCHAIN-1 %s +// // CHECK-LIBCXX-SYSROOT_AND_TOOLCHAIN-1: "{{[^"]*}}clang{{[^"]*}}" "-cc1" // CHECK-LIBCXX-SYSROOT_AND_TOOLCHAIN-1: "-internal-isystem" "[[TOOLCHAIN]]/usr/bin/../include/c++/v1" // CHECK-LIBCXX-SYSROOT_AND_TOOLCHAIN-1: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v1" diff --git a/test/Driver/darwin-header-search-system.cpp b/test/Driver/darwin-header-search-system.cpp index 3d16c7d2d2..fa2ad0ec62 100644 --- a/test/Driver/darwin-header-search-system.cpp +++ b/test/Driver/darwin-header-search-system.cpp @@ -3,7 +3,8 @@ // General tests that the system header search paths detected by the driver // and passed to CC1 are correct on Darwin platforms. -// Check system headers (everything below and ) +// Check system headers (everything below and ). Ensure +// that both sysroot and isysroot are checked, and that isysroot has precedence. // // RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ // RUN: -target x86_64-apple-darwin \ @@ -13,6 +14,26 @@ // RUN: | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr_and_usr_local \ // RUN: -DRESOURCE=%S/Inputs/resource_dir \ // RUN: --check-prefix=CHECK-SYSTEM %s +// +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target x86_64-apple-darwin \ +// RUN: -ccc-install-dir %S/Inputs/basic_darwin_toolchain_no_libcxx/usr/bin \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: --sysroot %S/Inputs/basic_darwin_sdk_usr_and_usr_local \ +// RUN: | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr_and_usr_local \ +// RUN: -DRESOURCE=%S/Inputs/resource_dir \ +// RUN: --check-prefix=CHECK-SYSTEM %s +// +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target x86_64-apple-darwin \ +// RUN: -ccc-install-dir %S/Inputs/basic_darwin_toolchain_no_libcxx/usr/bin \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: -isysroot %S/Inputs/basic_darwin_sdk_usr_and_usr_local \ +// RUN: --sysroot / \ +// RUN: | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr_and_usr_local \ +// RUN: -DRESOURCE=%S/Inputs/resource_dir \ +// RUN: --check-prefix=CHECK-SYSTEM %s +// // CHECK-SYSTEM: "{{[^"]*}}clang{{[^"]*}}" "-cc1" // CHECK-SYSTEM: "-internal-isystem" "[[SYSROOT]]/usr/local/include" // CHECK-SYSTEM: "-internal-isystem" "[[RESOURCE]]/include"