22
22
#include " clang/Tooling/DependencyScanning/DependencyScanningTool.h"
23
23
#include " clang/Tooling/DependencyScanning/DependencyScanningWorker.h"
24
24
#include " llvm/CAS/CachingOnDiskFileSystem.h"
25
+ #include " llvm/Support/Process.h"
25
26
26
27
using namespace clang ;
27
28
using namespace clang ::tooling::dependencies;
28
29
29
30
namespace {
30
31
struct DependencyScannerServiceOptions {
31
- ScanningOutputFormat Format = ScanningOutputFormat::Full;
32
+ ScanningOutputFormat ConfiguredFormat = ScanningOutputFormat::Full;
32
33
CASOptions CASOpts;
33
34
std::shared_ptr<cas::ObjectStore> CAS;
34
35
std::shared_ptr<cas::ActionCache> Cache;
36
+
37
+ ScanningOutputFormat getFormat () const ;
35
38
};
36
39
} // end anonymous namespace
37
40
@@ -93,7 +96,7 @@ void clang_experimental_DependencyScannerServiceOptions_dispose(
93
96
94
97
void clang_experimental_DependencyScannerServiceOptions_setDependencyMode (
95
98
CXDependencyScannerServiceOptions Opts, CXDependencyMode Mode) {
96
- unwrap (Opts)->Format = unwrap (Mode);
99
+ unwrap (Opts)->ConfiguredFormat = unwrap (Mode);
97
100
}
98
101
99
102
void clang_experimental_DependencyScannerServiceOptions_setCASDatabases (
@@ -122,10 +125,27 @@ clang_experimental_DependencyScannerService_create_v0(CXDependencyMode Format) {
122
125
IntrusiveRefCntPtr<llvm::cas::CachingOnDiskFileSystem> FS;
123
126
return wrap (new DependencyScanningService (
124
127
ScanningMode::DependencyDirectivesScan, unwrap (Format), CASOpts,
125
- /* ActionCache=*/ nullptr , FS,
128
+ /* CAS= */ nullptr , /* ActionCache=*/ nullptr , FS,
126
129
/* ReuseFilemanager=*/ false ));
127
130
}
128
131
132
+ ScanningOutputFormat DependencyScannerServiceOptions::getFormat () const {
133
+ if (ConfiguredFormat != ScanningOutputFormat::Full)
134
+ return ConfiguredFormat;
135
+
136
+ if (!CAS || !Cache)
137
+ return ConfiguredFormat;
138
+
139
+ if (llvm::sys::Process::GetEnv (" CLANG_CACHE_USE_INCLUDE_TREE" ))
140
+ return ScanningOutputFormat::FullIncludeTree;
141
+
142
+ if (llvm::sys::Process::GetEnv (" CLANG_CACHE_USE_CASFS_DEPSCAN" ))
143
+ return ScanningOutputFormat::FullTree;
144
+
145
+ // Note: default caching behaviour is currently cas-fs.
146
+ return ConfiguredFormat;
147
+ }
148
+
129
149
CXDependencyScannerService
130
150
clang_experimental_DependencyScannerService_create_v1 (
131
151
CXDependencyScannerServiceOptions Opts) {
@@ -137,11 +157,11 @@ clang_experimental_DependencyScannerService_create_v1(
137
157
assert (unwrap (Opts)->CASOpts .getKind () != CASOptions::UnknownCAS &&
138
158
" CAS and ActionCache must match CASOptions" );
139
159
FS = llvm::cantFail (
140
- llvm::cas::createCachingOnDiskFileSystem (std::move ( CAS) ));
160
+ llvm::cas::createCachingOnDiskFileSystem (CAS));
141
161
}
142
162
return wrap (new DependencyScanningService (
143
- ScanningMode::DependencyDirectivesScan, unwrap (Opts)->Format ,
144
- unwrap (Opts)->CASOpts , std::move (Cache), std::move (FS),
163
+ ScanningMode::DependencyDirectivesScan, unwrap (Opts)->getFormat () ,
164
+ unwrap (Opts)->CASOpts , std::move (CAS), std::move ( Cache), std::move (FS),
145
165
/* ReuseFilemanager=*/ false ));
146
166
}
147
167
@@ -257,7 +277,9 @@ static CXErrorCode getFileDependencies(CXDependencyScannerWorker W, int argc,
257
277
258
278
DependencyScanningWorker *Worker = unwrap (W);
259
279
260
- if (Worker->getScanningFormat () != ScanningOutputFormat::Full)
280
+ if (Worker->getScanningFormat () != ScanningOutputFormat::Full &&
281
+ Worker->getScanningFormat () != ScanningOutputFormat::FullTree &&
282
+ Worker->getScanningFormat () != ScanningOutputFormat::FullIncludeTree)
261
283
return CXError_InvalidArguments;
262
284
263
285
std::vector<std::string> Compilation{argv, argv + argc};
0 commit comments