xref: /llvm-project/clang/tools/libclang/BuildSystem.cpp (revision 75e164f61d391979b4829bf2746a5d74b94e95f2)
1fdd4f30fSDmitri Gribenko //===- BuildSystem.cpp - Utilities for use by build systems ---------------===//
2fdd4f30fSDmitri Gribenko //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fdd4f30fSDmitri Gribenko //
7fdd4f30fSDmitri Gribenko //===----------------------------------------------------------------------===//
8fdd4f30fSDmitri Gribenko //
9fdd4f30fSDmitri Gribenko // This file implements various utilities for use by build systems.
10fdd4f30fSDmitri Gribenko //
11fdd4f30fSDmitri Gribenko //===----------------------------------------------------------------------===//
12fdd4f30fSDmitri Gribenko 
13fdd4f30fSDmitri Gribenko #include "clang-c/BuildSystem.h"
140b9682efSArgyrios Kyrtzidis #include "CXString.h"
150b9682efSArgyrios Kyrtzidis #include "llvm/ADT/SmallString.h"
169c785294SJustin Bogner #include "llvm/Support/CBindingWrapping.h"
17b66261a0SPavel Labath #include "llvm/Support/Chrono.h"
1852525730SSerge Pavlov #include "llvm/Support/ErrorHandling.h"
19*75e164f6Sserge-sans-paille #include "llvm/Support/MemAlloc.h"
200b9682efSArgyrios Kyrtzidis #include "llvm/Support/Path.h"
21fc51490bSJonas Devlieghere #include "llvm/Support/VirtualFileSystem.h"
22757fcd6dSChandler Carruth #include "llvm/Support/raw_ostream.h"
23fdd4f30fSDmitri Gribenko 
240b9682efSArgyrios Kyrtzidis using namespace clang;
250b9682efSArgyrios Kyrtzidis using namespace llvm::sys;
260b9682efSArgyrios Kyrtzidis 
clang_getBuildSessionTimestamp(void)27fdd4f30fSDmitri Gribenko unsigned long long clang_getBuildSessionTimestamp(void) {
28b66261a0SPavel Labath   return llvm::sys::toTimeT(std::chrono::system_clock::now());
29fdd4f30fSDmitri Gribenko }
30fdd4f30fSDmitri Gribenko 
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(llvm::vfs::YAMLVFSWriter,CXVirtualFileOverlay)31fc51490bSJonas Devlieghere DEFINE_SIMPLE_CONVERSION_FUNCTIONS(llvm::vfs::YAMLVFSWriter,
329c785294SJustin Bogner                                    CXVirtualFileOverlay)
330b9682efSArgyrios Kyrtzidis 
340b9682efSArgyrios Kyrtzidis CXVirtualFileOverlay clang_VirtualFileOverlay_create(unsigned) {
35fc51490bSJonas Devlieghere   return wrap(new llvm::vfs::YAMLVFSWriter());
360b9682efSArgyrios Kyrtzidis }
370b9682efSArgyrios Kyrtzidis 
380b9682efSArgyrios Kyrtzidis enum CXErrorCode
clang_VirtualFileOverlay_addFileMapping(CXVirtualFileOverlay VFO,const char * virtualPath,const char * realPath)390b9682efSArgyrios Kyrtzidis clang_VirtualFileOverlay_addFileMapping(CXVirtualFileOverlay VFO,
400b9682efSArgyrios Kyrtzidis                                         const char *virtualPath,
410b9682efSArgyrios Kyrtzidis                                         const char *realPath) {
420b9682efSArgyrios Kyrtzidis   if (!VFO || !virtualPath || !realPath)
430b9682efSArgyrios Kyrtzidis     return CXError_InvalidArguments;
440b9682efSArgyrios Kyrtzidis   if (!path::is_absolute(virtualPath))
450b9682efSArgyrios Kyrtzidis     return CXError_InvalidArguments;
460b9682efSArgyrios Kyrtzidis   if (!path::is_absolute(realPath))
470b9682efSArgyrios Kyrtzidis     return CXError_InvalidArguments;
480b9682efSArgyrios Kyrtzidis 
490b9682efSArgyrios Kyrtzidis   for (path::const_iterator
500b9682efSArgyrios Kyrtzidis          PI = path::begin(virtualPath),
510b9682efSArgyrios Kyrtzidis          PE = path::end(virtualPath); PI != PE; ++PI) {
520b9682efSArgyrios Kyrtzidis     StringRef Comp = *PI;
530b9682efSArgyrios Kyrtzidis     if (Comp == "." || Comp == "..")
540b9682efSArgyrios Kyrtzidis       return CXError_InvalidArguments;
550b9682efSArgyrios Kyrtzidis   }
560b9682efSArgyrios Kyrtzidis 
579c785294SJustin Bogner   unwrap(VFO)->addFileMapping(virtualPath, realPath);
580b9682efSArgyrios Kyrtzidis   return CXError_Success;
590b9682efSArgyrios Kyrtzidis }
600b9682efSArgyrios Kyrtzidis 
61a9ab4d46SArgyrios Kyrtzidis enum CXErrorCode
clang_VirtualFileOverlay_setCaseSensitivity(CXVirtualFileOverlay VFO,int caseSensitive)62a9ab4d46SArgyrios Kyrtzidis clang_VirtualFileOverlay_setCaseSensitivity(CXVirtualFileOverlay VFO,
63a9ab4d46SArgyrios Kyrtzidis                                             int caseSensitive) {
64a9ab4d46SArgyrios Kyrtzidis   if (!VFO)
65a9ab4d46SArgyrios Kyrtzidis     return CXError_InvalidArguments;
669c785294SJustin Bogner   unwrap(VFO)->setCaseSensitivity(caseSensitive);
67a9ab4d46SArgyrios Kyrtzidis   return CXError_Success;
68a9ab4d46SArgyrios Kyrtzidis }
69a9ab4d46SArgyrios Kyrtzidis 
700b9682efSArgyrios Kyrtzidis enum CXErrorCode
clang_VirtualFileOverlay_writeToBuffer(CXVirtualFileOverlay VFO,unsigned,char ** out_buffer_ptr,unsigned * out_buffer_size)7174c96c0cSArgyrios Kyrtzidis clang_VirtualFileOverlay_writeToBuffer(CXVirtualFileOverlay VFO, unsigned,
7274c96c0cSArgyrios Kyrtzidis                                        char **out_buffer_ptr,
7374c96c0cSArgyrios Kyrtzidis                                        unsigned *out_buffer_size) {
7474c96c0cSArgyrios Kyrtzidis   if (!VFO || !out_buffer_ptr || !out_buffer_size)
750b9682efSArgyrios Kyrtzidis     return CXError_InvalidArguments;
760b9682efSArgyrios Kyrtzidis 
770b9682efSArgyrios Kyrtzidis   llvm::SmallString<256> Buf;
780b9682efSArgyrios Kyrtzidis   llvm::raw_svector_ostream OS(Buf);
799c785294SJustin Bogner   unwrap(VFO)->write(OS);
800b9682efSArgyrios Kyrtzidis 
8174c96c0cSArgyrios Kyrtzidis   StringRef Data = OS.str();
8252525730SSerge Pavlov   *out_buffer_ptr = static_cast<char*>(llvm::safe_malloc(Data.size()));
8374c96c0cSArgyrios Kyrtzidis   *out_buffer_size = Data.size();
8474c96c0cSArgyrios Kyrtzidis   memcpy(*out_buffer_ptr, Data.data(), Data.size());
850b9682efSArgyrios Kyrtzidis   return CXError_Success;
860b9682efSArgyrios Kyrtzidis }
870b9682efSArgyrios Kyrtzidis 
clang_free(void * buffer)8845a5bfefSYaron Keren void clang_free(void *buffer) {
8945a5bfefSYaron Keren   free(buffer);
9045a5bfefSYaron Keren }
9145a5bfefSYaron Keren 
clang_VirtualFileOverlay_dispose(CXVirtualFileOverlay VFO)920b9682efSArgyrios Kyrtzidis void clang_VirtualFileOverlay_dispose(CXVirtualFileOverlay VFO) {
939c785294SJustin Bogner   delete unwrap(VFO);
940b9682efSArgyrios Kyrtzidis }
95d502a10cSArgyrios Kyrtzidis 
96d502a10cSArgyrios Kyrtzidis 
97d502a10cSArgyrios Kyrtzidis struct CXModuleMapDescriptorImpl {
98d502a10cSArgyrios Kyrtzidis   std::string ModuleName;
99d502a10cSArgyrios Kyrtzidis   std::string UmbrellaHeader;
100d502a10cSArgyrios Kyrtzidis };
101d502a10cSArgyrios Kyrtzidis 
clang_ModuleMapDescriptor_create(unsigned)102d502a10cSArgyrios Kyrtzidis CXModuleMapDescriptor clang_ModuleMapDescriptor_create(unsigned) {
103d502a10cSArgyrios Kyrtzidis   return new CXModuleMapDescriptorImpl();
104d502a10cSArgyrios Kyrtzidis }
105d502a10cSArgyrios Kyrtzidis 
106d502a10cSArgyrios Kyrtzidis enum CXErrorCode
clang_ModuleMapDescriptor_setFrameworkModuleName(CXModuleMapDescriptor MMD,const char * name)107d502a10cSArgyrios Kyrtzidis clang_ModuleMapDescriptor_setFrameworkModuleName(CXModuleMapDescriptor MMD,
108d502a10cSArgyrios Kyrtzidis                                                  const char *name) {
109d502a10cSArgyrios Kyrtzidis   if (!MMD || !name)
110d502a10cSArgyrios Kyrtzidis     return CXError_InvalidArguments;
111d502a10cSArgyrios Kyrtzidis 
112d502a10cSArgyrios Kyrtzidis   MMD->ModuleName = name;
113d502a10cSArgyrios Kyrtzidis   return CXError_Success;
114d502a10cSArgyrios Kyrtzidis }
115d502a10cSArgyrios Kyrtzidis 
116d502a10cSArgyrios Kyrtzidis enum CXErrorCode
clang_ModuleMapDescriptor_setUmbrellaHeader(CXModuleMapDescriptor MMD,const char * name)117d502a10cSArgyrios Kyrtzidis clang_ModuleMapDescriptor_setUmbrellaHeader(CXModuleMapDescriptor MMD,
118d502a10cSArgyrios Kyrtzidis                                             const char *name) {
119d502a10cSArgyrios Kyrtzidis   if (!MMD || !name)
120d502a10cSArgyrios Kyrtzidis     return CXError_InvalidArguments;
121d502a10cSArgyrios Kyrtzidis 
122d502a10cSArgyrios Kyrtzidis   MMD->UmbrellaHeader = name;
123d502a10cSArgyrios Kyrtzidis   return CXError_Success;
124d502a10cSArgyrios Kyrtzidis }
125d502a10cSArgyrios Kyrtzidis 
126d502a10cSArgyrios Kyrtzidis enum CXErrorCode
clang_ModuleMapDescriptor_writeToBuffer(CXModuleMapDescriptor MMD,unsigned,char ** out_buffer_ptr,unsigned * out_buffer_size)127d502a10cSArgyrios Kyrtzidis clang_ModuleMapDescriptor_writeToBuffer(CXModuleMapDescriptor MMD, unsigned,
128d502a10cSArgyrios Kyrtzidis                                        char **out_buffer_ptr,
129d502a10cSArgyrios Kyrtzidis                                        unsigned *out_buffer_size) {
130d502a10cSArgyrios Kyrtzidis   if (!MMD || !out_buffer_ptr || !out_buffer_size)
131d502a10cSArgyrios Kyrtzidis     return CXError_InvalidArguments;
132d502a10cSArgyrios Kyrtzidis 
133d502a10cSArgyrios Kyrtzidis   llvm::SmallString<256> Buf;
134d502a10cSArgyrios Kyrtzidis   llvm::raw_svector_ostream OS(Buf);
135d502a10cSArgyrios Kyrtzidis   OS << "framework module " << MMD->ModuleName << " {\n";
136d502a10cSArgyrios Kyrtzidis   OS << "  umbrella header \"";
137d502a10cSArgyrios Kyrtzidis   OS.write_escaped(MMD->UmbrellaHeader) << "\"\n";
138d502a10cSArgyrios Kyrtzidis   OS << '\n';
139d502a10cSArgyrios Kyrtzidis   OS << "  export *\n";
140d502a10cSArgyrios Kyrtzidis   OS << "  module * { export * }\n";
141d502a10cSArgyrios Kyrtzidis   OS << "}\n";
142d502a10cSArgyrios Kyrtzidis 
143d502a10cSArgyrios Kyrtzidis   StringRef Data = OS.str();
14452525730SSerge Pavlov   *out_buffer_ptr = static_cast<char*>(llvm::safe_malloc(Data.size()));
145d502a10cSArgyrios Kyrtzidis   *out_buffer_size = Data.size();
146d502a10cSArgyrios Kyrtzidis   memcpy(*out_buffer_ptr, Data.data(), Data.size());
147d502a10cSArgyrios Kyrtzidis   return CXError_Success;
148d502a10cSArgyrios Kyrtzidis }
149d502a10cSArgyrios Kyrtzidis 
clang_ModuleMapDescriptor_dispose(CXModuleMapDescriptor MMD)150d502a10cSArgyrios Kyrtzidis void clang_ModuleMapDescriptor_dispose(CXModuleMapDescriptor MMD) {
151d502a10cSArgyrios Kyrtzidis   delete MMD;
152d502a10cSArgyrios Kyrtzidis }
153