1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===- BuildSystem.cpp - Utilities for use by build systems ---------------===// 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// The LLVM Compiler Infrastructure 4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// This file is distributed under the University of Illinois Open Source 6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// License. See LICENSE.TXT for details. 7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===// 9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// This file implements various utilities for use by build systems. 11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===// 13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang-c/BuildSystem.h" 15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "CXString.h" 166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "clang/Basic/VirtualFileSystem.h" 17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/ADT/SmallString.h" 186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "llvm/Support/CBindingWrapping.h" 19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/Path.h" 20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/TimeValue.h" 21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/raw_ostream.h" 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesusing namespace clang; 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesusing namespace llvm::sys; 25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesunsigned long long clang_getBuildSessionTimestamp(void) { 27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return llvm::sys::TimeValue::now().toEpochTime(); 28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEFINE_SIMPLE_CONVERSION_FUNCTIONS(clang::vfs::YAMLVFSWriter, 316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CXVirtualFileOverlay) 32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 33651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesCXVirtualFileOverlay clang_VirtualFileOverlay_create(unsigned) { 346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return wrap(new clang::vfs::YAMLVFSWriter()); 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesenum CXErrorCode 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclang_VirtualFileOverlay_addFileMapping(CXVirtualFileOverlay VFO, 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const char *virtualPath, 40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const char *realPath) { 41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!VFO || !virtualPath || !realPath) 42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_InvalidArguments; 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!path::is_absolute(virtualPath)) 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_InvalidArguments; 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!path::is_absolute(realPath)) 46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_InvalidArguments; 47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (path::const_iterator 49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PI = path::begin(virtualPath), 50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PE = path::end(virtualPath); PI != PE; ++PI) { 51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef Comp = *PI; 52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Comp == "." || Comp == "..") 53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_InvalidArguments; 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unwrap(VFO)->addFileMapping(virtualPath, realPath); 57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_Success; 58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesenum CXErrorCode 61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclang_VirtualFileOverlay_setCaseSensitivity(CXVirtualFileOverlay VFO, 62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int caseSensitive) { 63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!VFO) 64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_InvalidArguments; 656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unwrap(VFO)->setCaseSensitivity(caseSensitive); 66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_Success; 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesenum CXErrorCode 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclang_VirtualFileOverlay_writeToBuffer(CXVirtualFileOverlay VFO, unsigned, 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines char **out_buffer_ptr, 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned *out_buffer_size) { 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!VFO || !out_buffer_ptr || !out_buffer_size) 74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_InvalidArguments; 75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::SmallString<256> Buf; 77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::raw_svector_ostream OS(Buf); 786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unwrap(VFO)->write(OS); 79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef Data = OS.str(); 81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines *out_buffer_ptr = (char*)malloc(Data.size()); 82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines *out_buffer_size = Data.size(); 83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines memcpy(*out_buffer_ptr, Data.data(), Data.size()); 84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_Success; 85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid clang_VirtualFileOverlay_dispose(CXVirtualFileOverlay VFO) { 886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines delete unwrap(VFO); 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct CXModuleMapDescriptorImpl { 93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string ModuleName; 94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string UmbrellaHeader; 95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 97651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesCXModuleMapDescriptor clang_ModuleMapDescriptor_create(unsigned) { 98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new CXModuleMapDescriptorImpl(); 99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesenum CXErrorCode 102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclang_ModuleMapDescriptor_setFrameworkModuleName(CXModuleMapDescriptor MMD, 103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const char *name) { 104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!MMD || !name) 105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_InvalidArguments; 106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MMD->ModuleName = name; 108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_Success; 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesenum CXErrorCode 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclang_ModuleMapDescriptor_setUmbrellaHeader(CXModuleMapDescriptor MMD, 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const char *name) { 114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!MMD || !name) 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_InvalidArguments; 116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MMD->UmbrellaHeader = name; 118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_Success; 119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesenum CXErrorCode 122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclang_ModuleMapDescriptor_writeToBuffer(CXModuleMapDescriptor MMD, unsigned, 123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines char **out_buffer_ptr, 124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned *out_buffer_size) { 125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!MMD || !out_buffer_ptr || !out_buffer_size) 126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_InvalidArguments; 127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::SmallString<256> Buf; 129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::raw_svector_ostream OS(Buf); 130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "framework module " << MMD->ModuleName << " {\n"; 131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << " umbrella header \""; 132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS.write_escaped(MMD->UmbrellaHeader) << "\"\n"; 133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << '\n'; 134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << " export *\n"; 135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << " module * { export * }\n"; 136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "}\n"; 137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef Data = OS.str(); 139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines *out_buffer_ptr = (char*)malloc(Data.size()); 140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines *out_buffer_size = Data.size(); 141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines memcpy(*out_buffer_ptr, Data.data(), Data.size()); 142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return CXError_Success; 143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid clang_ModuleMapDescriptor_dispose(CXModuleMapDescriptor MMD) { 146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines delete MMD; 147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 148