WindowsManifestMerger.h revision 341825
1//===-- WindowsManifestMerger.h ---------------------------------*- C++-*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===---------------------------------------------------------------------===// 9// 10// This file provides a utility for merging Microsoft .manifest files. These 11// files are xml documents which contain meta-information about applications, 12// such as whether or not admin access is required, system compatibility, 13// versions, etc. Part of the linking process of an executable may require 14// merging several of these .manifest files using a tree-merge following 15// specific rules. Unfortunately, these rules are not documented well 16// anywhere. However, a careful investigation of the behavior of the original 17// Microsoft Manifest Tool (mt.exe) revealed the rules of this merge. As the 18// saying goes, code is the best documentation, so please look below if you are 19// interested in the exact merging requirements. 20// 21// Ref: 22// https://msdn.microsoft.com/en-us/library/windows/desktop/aa374191(v=vs.85).aspx 23// 24//===---------------------------------------------------------------------===// 25 26#ifndef LLVM_INCLUDE_LLVM_SUPPORT_WINDOWS_MANIFEST_MERGER_H 27#define LLVM_INCLUDE_LLVM_SUPPORT_WINDOWS_MANIFEST_MERGER_H 28 29#include "llvm/Support/Error.h" 30 31namespace llvm { 32 33class MemoryBuffer; 34 35namespace windows_manifest { 36 37bool isAvailable(); 38 39class WindowsManifestError : public ErrorInfo<WindowsManifestError, ECError> { 40public: 41 static char ID; 42 WindowsManifestError(const Twine &Msg); 43 void log(raw_ostream &OS) const override; 44 45private: 46 std::string Msg; 47}; 48 49class WindowsManifestMerger { 50public: 51 WindowsManifestMerger(); 52 ~WindowsManifestMerger(); 53 Error merge(const MemoryBuffer &Manifest); 54 55 // Returns vector containing merged xml manifest, or uninitialized vector for 56 // empty manifest. 57 std::unique_ptr<MemoryBuffer> getMergedManifest(); 58 59private: 60 class WindowsManifestMergerImpl; 61 std::unique_ptr<WindowsManifestMergerImpl> Impl; 62}; 63 64} // namespace windows_manifest 65} // namespace llvm 66#endif 67