blob: e9423c3286988fb7a8de1ff538f495d4d24b5a6b [file] [log] [blame]
Stephen Hines651f13c2014-04-23 16:59:28 -07001//===- 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"
Stephen Hines6bcf27b2014-05-29 04:14:42 -070016#include "clang/Basic/VirtualFileSystem.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070017#include "llvm/ADT/SmallString.h"
Stephen Hines6bcf27b2014-05-29 04:14:42 -070018#include "llvm/Support/CBindingWrapping.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070019#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
Stephen Hines6bcf27b2014-05-29 04:14:42 -070030DEFINE_SIMPLE_CONVERSION_FUNCTIONS(clang::vfs::YAMLVFSWriter,
31 CXVirtualFileOverlay)
Stephen Hines651f13c2014-04-23 16:59:28 -070032
33CXVirtualFileOverlay clang_VirtualFileOverlay_create(unsigned) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -070034 return wrap(new clang::vfs::YAMLVFSWriter());
Stephen Hines651f13c2014-04-23 16:59:28 -070035}
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
Stephen Hines6bcf27b2014-05-29 04:14:42 -070056 unwrap(VFO)->addFileMapping(virtualPath, realPath);
Stephen Hines651f13c2014-04-23 16:59:28 -070057 return CXError_Success;
58}
59
60enum CXErrorCode
61clang_VirtualFileOverlay_setCaseSensitivity(CXVirtualFileOverlay VFO,
62 int caseSensitive) {
63 if (!VFO)
64 return CXError_InvalidArguments;
Stephen Hines6bcf27b2014-05-29 04:14:42 -070065 unwrap(VFO)->setCaseSensitivity(caseSensitive);
Stephen Hines651f13c2014-04-23 16:59:28 -070066 return CXError_Success;
67}
68
Stephen Hines651f13c2014-04-23 16:59:28 -070069enum 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
Stephen Hines651f13c2014-04-23 16:59:28 -070076 llvm::SmallString<256> Buf;
77 llvm::raw_svector_ostream OS(Buf);
Stephen Hines6bcf27b2014-05-29 04:14:42 -070078 unwrap(VFO)->write(OS);
Stephen Hines651f13c2014-04-23 16:59:28 -070079
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) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -070088 delete unwrap(VFO);
Stephen Hines651f13c2014-04-23 16:59:28 -070089}
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}