1//===- BuildSystem.cpp - Utilities for use by build systems ---------------===// 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 implements various utilities for use by build systems. 11// 12//===----------------------------------------------------------------------===// 13 14#include "clang-c/BuildSystem.h" 15#include "CXString.h" 16#include "clang/Basic/VirtualFileSystem.h" 17#include "llvm/ADT/SmallString.h" 18#include "llvm/Support/CBindingWrapping.h" 19#include "llvm/Support/Path.h" 20#include "llvm/Support/TimeValue.h" 21#include "llvm/Support/raw_ostream.h" 22 23using namespace clang; 24using namespace llvm::sys; 25 26unsigned long long clang_getBuildSessionTimestamp(void) { 27 return llvm::sys::TimeValue::now().toEpochTime(); 28} 29 30DEFINE_SIMPLE_CONVERSION_FUNCTIONS(clang::vfs::YAMLVFSWriter, 31 CXVirtualFileOverlay) 32 33CXVirtualFileOverlay clang_VirtualFileOverlay_create(unsigned) { 34 return wrap(new clang::vfs::YAMLVFSWriter()); 35} 36 37enum CXErrorCode 38clang_VirtualFileOverlay_addFileMapping(CXVirtualFileOverlay VFO, 39 const char *virtualPath, 40 const char *realPath) { 41 if (!VFO || !virtualPath || !realPath) 42 return CXError_InvalidArguments; 43 if (!path::is_absolute(virtualPath)) 44 return CXError_InvalidArguments; 45 if (!path::is_absolute(realPath)) 46 return CXError_InvalidArguments; 47 48 for (path::const_iterator 49 PI = path::begin(virtualPath), 50 PE = path::end(virtualPath); PI != PE; ++PI) { 51 StringRef Comp = *PI; 52 if (Comp == "." || Comp == "..") 53 return CXError_InvalidArguments; 54 } 55 56 unwrap(VFO)->addFileMapping(virtualPath, realPath); 57 return CXError_Success; 58} 59 60enum CXErrorCode 61clang_VirtualFileOverlay_setCaseSensitivity(CXVirtualFileOverlay VFO, 62 int caseSensitive) { 63 if (!VFO) 64 return CXError_InvalidArguments; 65 unwrap(VFO)->setCaseSensitivity(caseSensitive); 66 return CXError_Success; 67} 68 69enum CXErrorCode 70clang_VirtualFileOverlay_writeToBuffer(CXVirtualFileOverlay VFO, unsigned, 71 char **out_buffer_ptr, 72 unsigned *out_buffer_size) { 73 if (!VFO || !out_buffer_ptr || !out_buffer_size) 74 return CXError_InvalidArguments; 75 76 llvm::SmallString<256> Buf; 77 llvm::raw_svector_ostream OS(Buf); 78 unwrap(VFO)->write(OS); 79 80 StringRef Data = OS.str(); 81 *out_buffer_ptr = (char*)malloc(Data.size()); 82 *out_buffer_size = Data.size(); 83 memcpy(*out_buffer_ptr, Data.data(), Data.size()); 84 return CXError_Success; 85} 86 87void clang_VirtualFileOverlay_dispose(CXVirtualFileOverlay VFO) { 88 delete unwrap(VFO); 89} 90 91 92struct CXModuleMapDescriptorImpl { 93 std::string ModuleName; 94 std::string UmbrellaHeader; 95}; 96 97CXModuleMapDescriptor clang_ModuleMapDescriptor_create(unsigned) { 98 return new CXModuleMapDescriptorImpl(); 99} 100 101enum CXErrorCode 102clang_ModuleMapDescriptor_setFrameworkModuleName(CXModuleMapDescriptor MMD, 103 const char *name) { 104 if (!MMD || !name) 105 return CXError_InvalidArguments; 106 107 MMD->ModuleName = name; 108 return CXError_Success; 109} 110 111enum CXErrorCode 112clang_ModuleMapDescriptor_setUmbrellaHeader(CXModuleMapDescriptor MMD, 113 const char *name) { 114 if (!MMD || !name) 115 return CXError_InvalidArguments; 116 117 MMD->UmbrellaHeader = name; 118 return CXError_Success; 119} 120 121enum CXErrorCode 122clang_ModuleMapDescriptor_writeToBuffer(CXModuleMapDescriptor MMD, unsigned, 123 char **out_buffer_ptr, 124 unsigned *out_buffer_size) { 125 if (!MMD || !out_buffer_ptr || !out_buffer_size) 126 return CXError_InvalidArguments; 127 128 llvm::SmallString<256> Buf; 129 llvm::raw_svector_ostream OS(Buf); 130 OS << "framework module " << MMD->ModuleName << " {\n"; 131 OS << " umbrella header \""; 132 OS.write_escaped(MMD->UmbrellaHeader) << "\"\n"; 133 OS << '\n'; 134 OS << " export *\n"; 135 OS << " module * { export * }\n"; 136 OS << "}\n"; 137 138 StringRef Data = OS.str(); 139 *out_buffer_ptr = (char*)malloc(Data.size()); 140 *out_buffer_size = Data.size(); 141 memcpy(*out_buffer_ptr, Data.data(), Data.size()); 142 return CXError_Success; 143} 144 145void clang_ModuleMapDescriptor_dispose(CXModuleMapDescriptor MMD) { 146 delete MMD; 147} 148