Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/shaderc
Path: blob/main/glslc/src/dependency_info.h
1560 views
1
// Copyright 2015 The Shaderc Authors. All rights reserved.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
// http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#ifndef GLSLC_DEPENDENCY_INFO_H
16
#define GLSLC_DEPENDENCY_INFO_H
17
18
#include <unordered_set>
19
#include <string>
20
#include <string>
21
22
namespace glslc {
23
24
// An object to handle everything about dumping dependency info. Internally it
25
// has two valid dumping mode: 1) Dump to extra dependency info files, such as
26
// *.d files. This mode is used when we want to generate dependency info and
27
// also compile. 2) Overwrite the original compilation output and dump
28
// dependency info as compilation output. This mode is used when we do not want
29
// to compile the source code and want the dependency info only.
30
class DependencyInfoDumpingHandler {
31
public:
32
DependencyInfoDumpingHandler();
33
34
// Sets the dependency target explicitly. It's the same as the argument to
35
// -MT.
36
void SetTarget(const std::string& target_label) {
37
user_specified_dep_target_label_ = target_label;
38
}
39
40
// Sets the name of the file where dependency info will be written.
41
void SetDependencyFileName(const std::string& dep_file_name) {
42
user_specified_dep_file_name_ = dep_file_name;
43
}
44
45
// Dump depdendency info to a) an extra dependency info file, b) an string
46
// which holds the compilation output. The choice depends on the dump
47
// mode of the handler. Returns true if dumping is succeeded, false otherwise.
48
//
49
// The dependency file name and target are deduced based on 1) user
50
// specified dependency file name and target name, 2) the output filename when
51
// the compiler is in 'does not need linking' and 'not preprocessing-only'
52
// mode. It is passed through compilation_output_file_name.
53
//
54
// When the handler is set to dump dependency info as extra dependency info
55
// files, this method will open a file with the dependency file name and write
56
// the dependency info to it. Error messages caused by writing to the file are
57
// emitted to stderr.
58
//
59
// When the handler is set to dump dependency info as compilation output, the
60
// compilation output string, which is passed through compilation_output_ptr,
61
// will be cleared and this method will write dependency info to it. Then the
62
// dependency info should be emitted as normal compilation output.
63
//
64
// If the dump mode is not set when this method is called, return false.
65
bool DumpDependencyInfo(std::string compilation_output_file_name,
66
std::string source_file_name,
67
std::string* compilation_output_ptr,
68
const std::unordered_set<std::string>& dependent_files);
69
70
// Sets to always dump dependency info as an extra file, instead of the normal
71
// compilation output. This means the output name specified by -o options
72
// won't be used for the dependency info file.
73
void SetDumpToExtraDependencyInfoFiles() { mode_ = dump_as_extra_file; }
74
75
// Sets to dump dependency info as normal compilation output. The dependency
76
// info will be either saved in a file with -o option specified file, or, if
77
// no output file name specified, to stdout.
78
void SetDumpAsNormalCompilationOutput() {
79
mode_ = dump_as_compilation_output;
80
}
81
82
// Returns true if the handler's dumping mode is set to dump dependency info
83
// as extra dependency info files.
84
bool DumpingToExtraDependencyInfoFiles() {
85
return mode_ == dump_as_extra_file;
86
}
87
88
// Returns true if the handler's dumping mode is set to dump dependency info
89
// as normal compilation output.
90
bool DumpingAsCompilationOutput() {
91
return mode_ == dump_as_compilation_output;
92
}
93
94
// Returns true if the handler's dumping mode is not set.
95
bool DumpingModeNotSet() { return mode_ == not_set; }
96
97
// Returns true if the handler is at valid state for dumping dependency info.
98
bool IsValid(std::string* error_msg_ptr, size_t num_files);
99
100
private:
101
typedef enum {
102
// not_set mode tells that the dumping mode is not set yet, so the handler
103
// is not ready for dumping dependency info. Calling DumpDependencyInfo when
104
// the handler is in this mode will cause failure.
105
not_set = 0,
106
// Dumping dependency info as normal compilation output mode. In this mode,
107
// the dependency info will be dumped as compilation output by overwriting
108
// the string which holds the compilation output.
109
dump_as_compilation_output,
110
// Dumping dependency info as extra dependency info files mode. In this
111
// mode, dependency info will be dumped to a user specified dependency info
112
// file or a *.d file. Compilation output will still be generated along with
113
// the dependency info.
114
dump_as_extra_file,
115
} dump_mode;
116
117
// Returns the target file label to be used in depdendency info file. If -MT
118
// defined a label, use that string as the label. Otherwise returns the
119
// compilation output filename deduced in 'doesn't need linking' and 'not
120
// preprocessing-only' mode.
121
std::string GetTarget(const std::string& compilation_output_file_name);
122
123
// Returns the dependency file name to be used. If -MF defined a file name
124
// before, use it. Othwise, returns a filename formed by appending .d to the
125
// output filename deduced in 'doesn't need linking' and 'no
126
// preprocessing-only' mode.
127
std::string GetDependencyFileName(
128
const std::string& compilation_output_file_name);
129
130
std::string user_specified_dep_file_name_;
131
std::string user_specified_dep_target_label_;
132
dump_mode mode_;
133
};
134
}
135
136
#endif // GLSLC_DEPENDENCY_INFO_H
137
138