Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[clang] Support --sysroot= for ${arch}-windows-msvc targets #96417

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions clang/include/clang/Driver/ToolChain.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,19 +94,22 @@ class ToolChain {
using path_list = SmallVector<std::string, 16>;

enum CXXStdlibType {
CST_Libcxx,
CST_Libstdcxx
CST_Libcxx, // LLVM libc++
CST_Libstdcxx, // GNU libstdc++
CST_Stl, // MSVC STL
};

enum RuntimeLibType {
RLT_CompilerRT,
RLT_Libgcc
RLT_Libgcc,
RLT_Vcruntime
};

enum UnwindLibType {
UNW_None,
UNW_CompilerRT,
UNW_Libgcc
UNW_Libgcc,
UNW_Vcruntime
};

enum class UnwindTableLevel {
Expand Down
10 changes: 10 additions & 0 deletions clang/lib/Driver/ToolChain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1155,6 +1155,8 @@ ToolChain::RuntimeLibType ToolChain::GetRuntimeLibType(
runtimeLibType = ToolChain::RLT_CompilerRT;
else if (LibName == "libgcc")
runtimeLibType = ToolChain::RLT_Libgcc;
else if (LibName == "vcruntime")
runtimeLibType = ToolChain::RLT_Vcruntime;
else if (LibName == "platform")
runtimeLibType = GetDefaultRuntimeLibType();
else {
Expand Down Expand Up @@ -1193,6 +1195,8 @@ ToolChain::UnwindLibType ToolChain::GetUnwindLibType(
unwindLibType = ToolChain::UNW_CompilerRT;
} else if (LibName == "libgcc")
unwindLibType = ToolChain::UNW_Libgcc;
else if (LibName == "vcruntime")
unwindLibType = ToolChain::UNW_Vcruntime;
else {
if (A)
getDriver().Diag(diag::err_drv_invalid_unwindlib_name)
Expand All @@ -1216,6 +1220,8 @@ ToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{
cxxStdlibType = ToolChain::CST_Libcxx;
else if (LibName == "libstdc++")
cxxStdlibType = ToolChain::CST_Libstdcxx;
else if (LibName == "stl")
cxxStdlibType = ToolChain::CST_Stl;
else if (LibName == "platform")
cxxStdlibType = GetDefaultCXXStdlibType();
else {
Expand Down Expand Up @@ -1354,6 +1360,10 @@ void ToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
case ToolChain::CST_Libstdcxx:
CmdArgs.push_back("-lstdc++");
break;

case ToolChain::CST_Stl:
// MSVC STL does not need to add -l
break;
}
}

Expand Down
128 changes: 127 additions & 1 deletion clang/lib/Driver/ToolChains/MSVC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,16 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back("-defaultlib:oldnames");
}

auto SysRoot = TC.getDriver().SysRoot;
if (!SysRoot.empty()) {
// If we have --sysroot, then we ignore all other setings
// libpath is $SYSROOT/lib and $SYSROOT/lib/${ARCH}-unknown-windows-msvc
const std::string MultiarchTriple =
TC.getMultiarchTriple(TC.getDriver(), TC.getTriple(), SysRoot);
std::string SysRootLib = "-libpath:" + SysRoot + "/lib";
CmdArgs.push_back(Args.MakeArgString(SysRootLib + '/' + MultiarchTriple));
CmdArgs.push_back(Args.MakeArgString(SysRootLib));
} else {
// If the VC environment hasn't been configured (perhaps because the user
// did not run vcvarsall), try to build a consistent link environment. If
// the environment variable is set however, assume the user knows what
Expand Down Expand Up @@ -133,6 +143,7 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back(
Args.MakeArgString(std::string("-libpath:") + WindowsSdkLibPath));
}
}

if (!C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L))
for (const auto &LibPath : Args.getAllArgValues(options::OPT_L))
Expand Down Expand Up @@ -427,6 +438,12 @@ MSVCToolChain::MSVCToolChain(const Driver &D, const llvm::Triple &Triple,
RocmInstallation(D, Triple, Args) {
getProgramPaths().push_back(getDriver().Dir);

auto SysRoot = getDriver().SysRoot;
if (!SysRoot.empty()) {
// We have sysroot so we ignore all VCTools settings
return;
}

std::optional<llvm::StringRef> VCToolsDir, VCToolsVersion;
if (Arg *A = Args.getLastArg(options::OPT__SLASH_vctoolsdir))
VCToolsDir = A->getValue();
Expand Down Expand Up @@ -644,6 +661,17 @@ void MSVCToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
"include");
}

auto SysRoot = getDriver().SysRoot;
if (!SysRoot.empty()) {
const Driver &D = getDriver();
const std::string MultiarchTriple =
getMultiarchTriple(D, getTriple(), SysRoot);
addSystemInclude(DriverArgs, CC1Args,
SysRoot + "/include/" + MultiarchTriple);
addSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
return;
}

// Add %INCLUDE%-like directories from the -imsvc flag.
for (const auto &Path : DriverArgs.getAllArgValues(options::OPT__SLASH_imsvc))
addSystemInclude(DriverArgs, CC1Args, Path);
Expand Down Expand Up @@ -772,7 +800,22 @@ void MSVCToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,

void MSVCToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
ArgStringList &CC1Args) const {
// FIXME: There should probably be logic here to find libc++ on Windows.
if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
options::OPT_nostdincxx))
return;
if (getDriver().SysRoot.empty())
return;
switch (GetCXXStdlibType(DriverArgs)) {
case ToolChain::CST_Stl:
addStlIncludePaths(DriverArgs, CC1Args);
break;
case ToolChain::CST_Libstdcxx:
addLibStdCXXIncludePaths(DriverArgs, CC1Args);
break;
case ToolChain::CST_Libcxx:
addLibCxxIncludePaths(DriverArgs, CC1Args);
break;
}
}

VersionTuple MSVCToolChain::computeMSVCVersion(const Driver *D,
Expand Down Expand Up @@ -1024,3 +1067,86 @@ void MSVCToolChain::addClangTargetOptions(
if (Arg *A = DriverArgs.getLastArgNoClaim(options::OPT_marm64x))
A->ignoreTargetSpecific();
}

void MSVCToolChain::addStlIncludePaths(
const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) const {
const Driver &D = getDriver();
std::string SysRoot = computeSysRoot();
std::string LibPath = SysRoot + "/include";
const std::string MultiarchTriple =
getMultiarchTriple(D, getTriple(), SysRoot);

std::string TargetDir = LibPath + "/" + MultiarchTriple + "/c++/stl";
addSystemInclude(DriverArgs, CC1Args, TargetDir);

// Second add the generic one.
addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/stl");
}

void MSVCToolChain::addLibCxxIncludePaths(
const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) const {
const Driver &D = getDriver();
std::string SysRoot = computeSysRoot();
std::string LibPath = SysRoot + "/include";
const std::string MultiarchTriple =
getMultiarchTriple(D, getTriple(), SysRoot);

std::string Version = detectLibcxxVersion(LibPath);
if (Version.empty())
return;

std::string TargetDir = LibPath + "/" + MultiarchTriple + "/c++/" + Version;
addSystemInclude(DriverArgs, CC1Args, TargetDir);

// Second add the generic one.
addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/" + Version);
}

void MSVCToolChain::addLibStdCXXIncludePaths(
const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) const {
// We cannot use GCCInstallationDetector here as the sysroot usually does
// not contain a full GCC installation.
// Instead, we search the given sysroot for /usr/include/xx, similar
// to how we do it for libc++.
const Driver &D = getDriver();
std::string SysRoot = computeSysRoot();
std::string LibPath = SysRoot + "/include";
const std::string MultiarchTriple =
getMultiarchTriple(D, getTriple(), SysRoot);

// This is similar to detectLibcxxVersion()
std::string Version;
{
std::error_code EC;
Generic_GCC::GCCVersion MaxVersion =
Generic_GCC::GCCVersion::Parse("0.0.0");
SmallString<128> Path(LibPath);
llvm::sys::path::append(Path, "c++");
for (llvm::vfs::directory_iterator LI = getVFS().dir_begin(Path, EC), LE;
!EC && LI != LE; LI = LI.increment(EC)) {
StringRef VersionText = llvm::sys::path::filename(LI->path());
if (VersionText[0] != 'v') {
auto Version = Generic_GCC::GCCVersion::Parse(VersionText);
if (Version > MaxVersion)
MaxVersion = Version;
}
}
if (MaxVersion.Major > 0)
Version = MaxVersion.Text;
}

if (Version.empty())
return;

std::string TargetDir = LibPath + "/c++/" + Version + "/" + MultiarchTriple;
addSystemInclude(DriverArgs, CC1Args, TargetDir);

// Second add the generic one.
addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/" + Version);
// Third the backward one.
addSystemInclude(DriverArgs, CC1Args,
LibPath + "/c++/" + Version + "/backward");
}
15 changes: 15 additions & 0 deletions clang/lib/Driver/ToolChains/MSVC.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,21 @@ class LLVM_LIBRARY_VISIBILITY MSVCToolChain : public ToolChain {
Tool *buildLinker() const override;
Tool *buildAssembler() const override;
private:
CXXStdlibType GetDefaultCXXStdlibType() const override {
return ToolChain::CST_Stl;
}
RuntimeLibType GetDefaultRuntimeLibType() const override {
return ToolChain::RLT_Vcruntime;
}
UnwindLibType GetDefaultUnwindLibType() const override {
return ToolChain::UNW_Vcruntime;
}
void addStlIncludePaths(const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) const;
void addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) const;
void addLibStdCXXIncludePaths(const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) const;
std::optional<llvm::StringRef> WinSdkDir, WinSdkVersion, WinSysRoot;
std::string VCToolChainPath;
llvm::ToolsetLayout VSLayout = llvm::ToolsetLayout::OlderVS;
Expand Down
25 changes: 25 additions & 0 deletions clang/lib/Driver/ToolChains/WebAssembly.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,8 @@ WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
return ToolChain::CST_Libcxx;
else if (Value == "libstdc++")
return ToolChain::CST_Libstdcxx;
else if (Value == "stl")
return ToolChain::CST_Stl;
else
getDriver().Diag(diag::err_drv_invalid_stdlib_name)
<< A->getAsString(Args);
Expand Down Expand Up @@ -534,6 +536,9 @@ void WebAssembly::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
case ToolChain::CST_Libstdcxx:
addLibStdCXXIncludePaths(DriverArgs, CC1Args);
break;
case ToolChain::CST_Stl:
addStlIncludePaths(DriverArgs, CC1Args);
break;
}
}

Expand Down Expand Up @@ -568,6 +573,26 @@ Tool *WebAssembly::buildLinker() const {
return new tools::wasm::Linker(*this);
}

void WebAssembly::addStlIncludePaths(
const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) const {
const Driver &D = getDriver();
std::string SysRoot = computeSysRoot();
std::string LibPath = SysRoot + "/include";
const std::string MultiarchTriple =
getMultiarchTriple(D, getTriple(), SysRoot);
bool IsKnownOs = (getTriple().getOS() != llvm::Triple::UnknownOS);

// First add the per-target include path if the OS is known.
if (IsKnownOs) {
std::string TargetDir = LibPath + "/" + MultiarchTriple + "/c++/stl";
addSystemInclude(DriverArgs, CC1Args, TargetDir);
}

// Second add the generic one.
addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/stl");
}

void WebAssembly::addLibCxxIncludePaths(
const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) const {
Expand Down
2 changes: 2 additions & 0 deletions clang/lib/Driver/ToolChains/WebAssembly.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ class LLVM_LIBRARY_VISIBILITY WebAssembly final : public ToolChain {
const llvm::Triple &TargetTriple,
StringRef SysRoot) const override;

void addStlIncludePaths(const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) const;
void addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) const;
void addLibStdCXXIncludePaths(const llvm::opt::ArgList &DriverArgs,
Expand Down
81 changes: 81 additions & 0 deletions clang/test/Driver/msvc-sysroot.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
// RUN: %clangxx --target=x86_64-unknown-windows-msvc -### \
// RUN: --sysroot=%S -fuse-ld=lld %s 2>&1 \
// RUN: | FileCheck --check-prefix=COMPILE_X86_64_STL %s
// COMPILE_X86_64_STL: clang{{.*}}" "-cc1"
// COMPILE_X86_64_STL: "-isysroot" "[[SYSROOT:[^"]+]]"
// COMPILE_X86_64_STL: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/x86_64-unknown-windows-msvc/c++/stl"
// COMPILE_X86_64_STL: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/stl"
// COMPILE_X86_64_STL: lld-link{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/x86_64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"

// RUN: %clangxx --target=x86_64-unknown-windows-msvc -### \
// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree/usr -stdlib=libc++ -fuse-ld=lld %s 2>&1 \
// RUN: | FileCheck --check-prefix=COMPILE_X86_64_LIBCXX %s
// COMPILE_X86_64_LIBCXX: clang{{.*}}" "-cc1"
// COMPILE_X86_64_LIBCXX: "-isysroot" "[[SYSROOT:[^"]+]]"
// COMPILE_X86_64_LIBCXX: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/x86_64-unknown-windows-msvc/c++/v1"
// COMPILE_X86_64_LIBCXX: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/v1"
// COMPILE_X86_64_LIBCXX: lld-link{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/x86_64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"

// RUN: %clangxx -### --target=x86_64-unknown-windows-msvc --stdlib=libstdc++ %s 2>&1 \
// RUN: -fuse-ld=lld --sysroot=%S/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr \
// RUN: | FileCheck -check-prefix=COMPILE_X86_64_LIBSTDCXX %s
// COMPILE_X86_64_LIBSTDCXX: "-cc1"
// COMPILE_X86_64_LIBSTDCXX: "-resource-dir" "[[RESOURCE_DIR:[^"]*]]"
// COMPILE_X86_64_LIBSTDCXX: "-isysroot" "[[SYSROOT:[^"]+]]"
// COMPILE_X86_64_LIBSTDCXX: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/4.8/x86_64-unknown-windows-msvc"
// COMPILE_X86_64_LIBSTDCXX: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/4.8"
// COMPILE_X86_64_LIBSTDCXX: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/4.8/backward"
// COMPILE_X86_64_LIBSTDCXX: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include"
// COMPILE_X86_64_LIBSTDCXX: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/x86_64-unknown-windows-msvc"
// COMPILE_X86_64_LIBSTDCXX: "-internal-isystem" "[[SYSROOT:[^"]+]]/include"
// COMPILE_X86_64_LIBSTDCXX: lld-link{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/x86_64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"

// RUN: %clangxx --target=aarch64-unknown-windows-msvc -### \
// RUN: --sysroot=%S -fuse-ld=lld %s 2>&1 \
// RUN: | FileCheck --check-prefix=COMPILE_AARCH64_STL %s
// COMPILE_AARCH64_STL: clang{{.*}}" "-cc1"
// COMPILE_AARCH64_STL: "-isysroot" "[[SYSROOT:[^"]+]]"
// COMPILE_AARCH64_STL: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/aarch64-unknown-windows-msvc/c++/stl"
// COMPILE_AARCH64_STL: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/stl"
// COMPILE_AARCH64_STL: lld-link{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/aarch64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"

// RUN: %clangxx --target=loongarch64-unknown-windows-msvc -stdlib=stl -### \
// RUN: --sysroot=%S -fuse-ld=lld %s 2>&1 \
// RUN: | FileCheck --check-prefix=COMPILE_LOONGARCH64_STL %s
// COMPILE_LOONGARCH64_STL: clang{{.*}}" "-cc1"
// COMPILE_LOONGARCH64_STL: "-isysroot" "[[SYSROOT:[^"]+]]"
// COMPILE_LOONGARCH64_STL: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/loongarch64-unknown-windows-msvc/c++/stl"
// COMPILE_LOONGARCH64_STL: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/stl"
// COMPILE_LOONGARCH64_STL: lld-link{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/loongarch64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"

// RUN: %clangxx --target=x86_64-unknown-windows-msvc -stdlib=stl -### \
// RUN: --sysroot=%S %s 2>&1 \
// RUN: | FileCheck --check-prefix=COMPILE_X86_64_STL_LINK %s
// COMPILE_X86_64_STL_LINK: clang{{.*}}" "-cc1"
// COMPILE_X86_64_STL_LINK: "-isysroot" "[[SYSROOT:[^"]+]]"
// COMPILE_X86_64_STL_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/x86_64-unknown-windows-msvc/c++/stl"
// COMPILE_X86_64_STL_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/stl"
// COMPILE_X86_64_STL_LINK: link.exe{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/x86_64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"

// RUN: %clangxx --target=loongarch64-unknown-windows-msvc -stdlib=libc++ -### \
// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree/usr %s 2>&1 \
// RUN: | FileCheck --check-prefix=COMPILE_LOONGARCH64_LIBCXX_LINK %s
// COMPILE_LOONGARCH64_LIBCXX_LINK: clang{{.*}}" "-cc1"
// COMPILE_LOONGARCH64_LIBCXX_LINK: "-isysroot" "[[SYSROOT:[^"]+]]"
// COMPILE_LOONGARCH64_LIBCXX_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/loongarch64-unknown-windows-msvc/c++/v1"
// COMPILE_LOONGARCH64_LIBCXX_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/v1"
// COMPILE_LOONGARCH64_LIBCXX_LINK: link.exe{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/loongarch64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"

// RUN: %clangxx --target=riscv64-unknown-windows-msvc -### --stdlib=libstdc++ %s 2>&1 \
// RUN: --sysroot=%S/Inputs/basic_linux_libstdcxx_libcxxv2_tree/usr \
// RUN: | FileCheck -check-prefix=COMPILE_RISCV64_LIBSTDCXX_LINK %s
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-cc1"
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-resource-dir" "[[RESOURCE_DIR:[^"]*]]"
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-isysroot" "[[SYSROOT:[^"]+]]"
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/4.8/riscv64-unknown-windows-msvc"
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/4.8"
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/c++/4.8/backward"
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include"
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include/riscv64-unknown-windows-msvc"
// COMPILE_RISCV64_LIBSTDCXX_LINK: "-internal-isystem" "[[SYSROOT:[^"]+]]/include"
// COMPILE_RISCV64_LIBSTDCXX_LINK: link.exe{{.*}}" "-libpath:[[SYSROOT:[^"]+]]/lib/riscv64-unknown-windows-msvc" "-libpath:[[SYSROOT:[^"]+]]/lib"
Loading
Loading