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