1 //===- BuildSystem.cpp - Utilities for use by build systems ---------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements various utilities for use by build systems.
12 //===----------------------------------------------------------------------===//
14 #include "clang-c/BuildSystem.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"
23 using namespace clang;
24 using namespace llvm::sys;
26 unsigned long long clang_getBuildSessionTimestamp(void) {
27 return llvm::sys::TimeValue::now().toEpochTime();
30 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(clang::vfs::YAMLVFSWriter,
33 CXVirtualFileOverlay clang_VirtualFileOverlay_create(unsigned) {
34 return wrap(new clang::vfs::YAMLVFSWriter());
38 clang_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;
48 for (path::const_iterator
49 PI = path::begin(virtualPath),
50 PE = path::end(virtualPath); PI != PE; ++PI) {
52 if (Comp == "." || Comp == "..")
53 return CXError_InvalidArguments;
56 unwrap(VFO)->addFileMapping(virtualPath, realPath);
57 return CXError_Success;
61 clang_VirtualFileOverlay_setCaseSensitivity(CXVirtualFileOverlay VFO,
64 return CXError_InvalidArguments;
65 unwrap(VFO)->setCaseSensitivity(caseSensitive);
66 return CXError_Success;
70 clang_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;
76 llvm::SmallString<256> Buf;
77 llvm::raw_svector_ostream OS(Buf);
78 unwrap(VFO)->write(OS);
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;
87 void clang_free(void *buffer) {
91 void clang_VirtualFileOverlay_dispose(CXVirtualFileOverlay VFO) {
96 struct CXModuleMapDescriptorImpl {
97 std::string ModuleName;
98 std::string UmbrellaHeader;
101 CXModuleMapDescriptor clang_ModuleMapDescriptor_create(unsigned) {
102 return new CXModuleMapDescriptorImpl();
106 clang_ModuleMapDescriptor_setFrameworkModuleName(CXModuleMapDescriptor MMD,
109 return CXError_InvalidArguments;
111 MMD->ModuleName = name;
112 return CXError_Success;
116 clang_ModuleMapDescriptor_setUmbrellaHeader(CXModuleMapDescriptor MMD,
119 return CXError_InvalidArguments;
121 MMD->UmbrellaHeader = name;
122 return CXError_Success;
126 clang_ModuleMapDescriptor_writeToBuffer(CXModuleMapDescriptor MMD, unsigned,
127 char **out_buffer_ptr,
128 unsigned *out_buffer_size) {
129 if (!MMD || !out_buffer_ptr || !out_buffer_size)
130 return CXError_InvalidArguments;
132 llvm::SmallString<256> Buf;
133 llvm::raw_svector_ostream OS(Buf);
134 OS << "framework module " << MMD->ModuleName << " {\n";
135 OS << " umbrella header \"";
136 OS.write_escaped(MMD->UmbrellaHeader) << "\"\n";
139 OS << " module * { export * }\n";
142 StringRef Data = OS.str();
143 *out_buffer_ptr = (char*)malloc(Data.size());
144 *out_buffer_size = Data.size();
145 memcpy(*out_buffer_ptr, Data.data(), Data.size());
146 return CXError_Success;
149 void clang_ModuleMapDescriptor_dispose(CXModuleMapDescriptor MMD) {