Index: lld/COFF/DriverUtils.cpp =================================================================== --- lld/COFF/DriverUtils.cpp +++ lld/COFF/DriverUtils.cpp @@ -360,22 +360,20 @@ return OS.str(); } -static Expected> +static std::unique_ptr createManifestXmlWithInternalMt(std::string &DefaultXml) { std::unique_ptr DefaultXmlCopy = MemoryBuffer::getMemBufferCopy(DefaultXml); windows_manifest::WindowsManifestMerger Merger; if (auto E = Merger.merge(*DefaultXmlCopy.get())) - return std::move(E); + fatal(E, "internal manifest tool failed on default xml"); for (StringRef Filename : Config->ManifestInput) { std::unique_ptr Manifest = check(MemoryBuffer::getFile(Filename)); - if (auto E = Merger.merge(*Manifest.get())) { - warn("internal manifest tool failed on file " + Filename); - return std::move(E); - } + if (auto E = Merger.merge(*Manifest.get())) + fatal(E, "internal manifest tool failed on file " + Filename); } return Merger.getMergedManifest(); @@ -385,7 +383,8 @@ createManifestXmlWithExternalMt(std::string &DefaultXml) { const Triple HostTriple(Triple::normalize(LLVM_HOST_TRIPLE)); if (!HostTriple.isOSWindows()) - fatal("manifest ignored because no external manifest tool available"); + fatal("external mt.exe is not available because this is not a Windows " + "system"); // Create the default manifest file as a temporary file. TemporaryFile Default("defaultxml", "manifest"); std::error_code EC; @@ -418,22 +417,13 @@ if (Config->ManifestInput.empty()) return DefaultXml; - // If manifest files are supplied by the user using /MANIFESTINPUT - // option, we need to merge them with the default manifest. If libxml2 - // is enabled, we may merge them with LLVM's own library. - Expected> OutputBufferOrError = - createManifestXmlWithInternalMt(DefaultXml); - if (OutputBufferOrError) - return OutputBufferOrError.get()->getBuffer(); - // Using built-in library failed, possibly because libxml2 is not installed. - // Shell out to mt.exe instead. - handleAllErrors(OutputBufferOrError.takeError(), - [&](ErrorInfoBase &EIB) { - warn("error with internal manifest tool: " + EIB.message()); - }); std::unique_ptr OutputBuffer; - OutputBuffer = createManifestXmlWithExternalMt(DefaultXml); - return OutputBuffer->getBuffer(); + if (windows_manifest::isAvailable()) + OutputBuffer = createManifestXmlWithInternalMt(DefaultXml); + else + OutputBuffer = createManifestXmlWithExternalMt(DefaultXml); + + return OutputBuffer.get()->getBuffer(); } static std::unique_ptr Index: lld/test/COFF/manifestinput-error.test =================================================================== --- /dev/null +++ lld/test/COFF/manifestinput-error.test @@ -0,0 +1,10 @@ +# UNSUPPORTED: manifest_tool +# UNSUPPORTED: libxml2 + +# RUN: yaml2obj %p/Inputs/ret42.yaml > %t.obj +# RUN: not lld-link /out:%t.exe /entry:main \ +# RUN: /manifest:embed \ +# RUN: /manifestuac:"level='requireAdministrator'" \ +# RUN: /manifestinput:%p/Inputs/manifestinput.test %t.obj 2>&1 | FileCheck %s + +# CHECK: error: external mt.exe is not available because this is not a Windows system Index: lld/test/COFF/manifestinput-nowarning.test =================================================================== --- /dev/null +++ lld/test/COFF/manifestinput-nowarning.test @@ -0,0 +1,11 @@ +# UNSUPPORTED: libxml2 +# REQUIRES: manifest_tool + +# RUN: yaml2obj %p/Inputs/ret42.yaml > %t.obj +# RUN: lld-link /out:%t.exe /entry:main \ +# RUN: /manifest:embed \ +# RUN: /manifestuac:"level='requireAdministrator'" \ +# RUN: /manifestinput:%p/Inputs/manifestinput.test %t.obj | \ +# RUN: FileCheck -allow-empty %s + +# CHECK-NOT: warning: error with internal manifest tool: no libxml2 Index: lld/test/lit.cfg =================================================================== --- lld/test/lit.cfg +++ lld/test/lit.cfg @@ -270,3 +270,6 @@ if (lit.util.which('cvtres', config.environment['PATH'])) or \ (config.llvm_libxml2_enabled == "1"): config.available_features.add('manifest_tool') + +if (config.llvm_libxml2_enabled == "1"): + config.available_features.add('libxml2') \ No newline at end of file Index: llvm/include/llvm/WindowsManifest/WindowsManifestMerger.h =================================================================== --- llvm/include/llvm/WindowsManifest/WindowsManifestMerger.h +++ llvm/include/llvm/WindowsManifest/WindowsManifestMerger.h @@ -35,6 +35,8 @@ namespace windows_manifest { +bool isAvailable(); + class WindowsManifestError : public ErrorInfo { public: static char ID; Index: llvm/lib/WindowsManifest/WindowsManifestMerger.cpp =================================================================== --- llvm/lib/WindowsManifest/WindowsManifestMerger.cpp +++ llvm/lib/WindowsManifest/WindowsManifestMerger.cpp @@ -682,6 +682,8 @@ : nullptr; } +bool windows_manifest::isAvailable() { return true; } + #else WindowsManifestMerger::WindowsManifestMergerImpl::~WindowsManifestMergerImpl() { @@ -697,6 +699,8 @@ return nullptr; } +bool windows_manifest::isAvailable() { return false; } + #endif WindowsManifestMerger::WindowsManifestMerger()