Skip to content

Commit a0dc3ac

Browse files
authored
Create FileGenerator with CustomGenerator (#213)
- FileGenerator created using CustomGenerator - Generator removed and renamed to FileGenerator
1 parent 7ee1538 commit a0dc3ac

30 files changed

+480
-842
lines changed

bootstrap/include/bootstrap/build_buildcc.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828

2929
namespace buildcc {
3030

31-
void schema_gen_cb(BaseGenerator &generator, const BaseTarget &flatc_exe);
31+
void schema_gen_cb(FileGenerator &generator, const BaseTarget &flatc_exe);
3232

33-
void buildcc_cb(BaseTarget &target, const BaseGenerator &schema_gen,
33+
void buildcc_cb(BaseTarget &target, const FileGenerator &schema_gen,
3434
const TargetInfo &flatbuffers_ho, const TargetInfo &fmt_ho,
3535
const TargetInfo &spdlog_ho, const TargetInfo &cli11_ho,
3636
const TargetInfo &taskflow_ho, const BaseTarget &tpl);
@@ -80,8 +80,8 @@ class BuildBuildCC {
8080
ExecutableTarget_generic &GetFlatc() {
8181
return storage_.Ref<ExecutableTarget_generic>(kFlatcExeName);
8282
}
83-
BaseGenerator &GetSchemaGen() {
84-
return storage_.Ref<BaseGenerator>(kSchemaGenName);
83+
FileGenerator &GetSchemaGen() {
84+
return storage_.Ref<FileGenerator>(kSchemaGenName);
8585
}
8686
TargetInfo &GetFlatbuffersHo() {
8787
return storage_.Ref<TargetInfo>(kFlatbuffersHoName);

bootstrap/main.buildcc.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ int main(int argc, char **argv) {
4949
ExecutableTarget_generic buildcc_hybrid_simple_example(
5050
"buildcc_hybrid_simple_example", toolchain, "example/hybrid/simple");
5151
Reg::Toolchain(custom_toolchain_arg.state)
52-
.Func([&]() { toolchain.Verify(); })
52+
// .Func([&]() { toolchain.Verify(); })
5353
.BuildPackage(buildcc)
5454
.Build(hybrid_simple_example_cb, buildcc_hybrid_simple_example,
5555
buildcc_lib)

bootstrap/src/build_buildcc.cpp

+4-6
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,14 @@
1818

1919
namespace buildcc {
2020

21-
void schema_gen_cb(BaseGenerator &generator, const BaseTarget &flatc_exe) {
21+
void schema_gen_cb(FileGenerator &generator, const BaseTarget &flatc_exe) {
2222
generator.AddInput("{gen_root_dir}/path.fbs", "path_fbs");
2323
generator.AddInput("{gen_root_dir}/custom_generator.fbs",
2424
"custom_generator_fbs");
25-
generator.AddInput("{gen_root_dir}/generator.fbs", "generator_fbs");
2625
generator.AddInput("{gen_root_dir}/target.fbs", "target_fbs");
2726

2827
generator.AddOutput("{gen_build_dir}/path_generated.h");
2928
generator.AddOutput("{gen_build_dir}/custom_generator_generated.h");
30-
generator.AddOutput("{gen_build_dir}/generator_generated.h");
3129
generator.AddOutput("{gen_build_dir}/target_generated.h");
3230

3331
generator.AddDefaultArguments({
@@ -36,12 +34,12 @@ void schema_gen_cb(BaseGenerator &generator, const BaseTarget &flatc_exe) {
3634
// generator.AddCommand("{flatc_compiler} --help");
3735
generator.AddCommand(
3836
"{flatc_compiler} -o {gen_build_dir} -I {gen_root_dir} --gen-object-api "
39-
"--cpp {path_fbs} {custom_generator_fbs} {generator_fbs} {target_fbs}");
37+
"--cpp {path_fbs} {custom_generator_fbs} {target_fbs}");
4038

4139
generator.Build();
4240
}
4341

44-
void buildcc_cb(BaseTarget &target, const BaseGenerator &schema_gen,
42+
void buildcc_cb(BaseTarget &target, const FileGenerator &schema_gen,
4543
const TargetInfo &flatbuffers_ho, const TargetInfo &fmt_ho,
4644
const TargetInfo &spdlog_ho, const TargetInfo &cli11_ho,
4745
const TargetInfo &taskflow_ho, const BaseTarget &tpl) {
@@ -201,7 +199,7 @@ void BuildBuildCC::Initialize() {
201199
env_.GetTargetBuildDir()));
202200

203201
// Schema
204-
(void)storage_.Add<BaseGenerator>(
202+
(void)storage_.Add<FileGenerator>(
205203
kSchemaGenName, kSchemaGenName,
206204
TargetEnv(env_.GetTargetRootDir() / "buildcc" / "schema",
207205
env_.GetTargetBuildDir() / toolchain_.GetName()));

buildcc/lib/args/include/args/register.h

+23-43
Original file line numberDiff line numberDiff line change
@@ -82,24 +82,17 @@ class Reg::Instance {
8282
}
8383
}
8484

85-
/**
86-
* @brief Reg::Instance for Target to be built
87-
*/
88-
template <typename C, typename... Params>
89-
void Build(const C &build_cb, BaseTarget &target, Params &&...params) {
90-
build_cb(target, std::forward<Params>(params)...);
91-
tf::Task task = BuildTargetTask(target);
92-
BuildStoreTask(target.GetUniqueId(), task);
93-
}
94-
95-
/**
96-
* @brief Reg::Instance for Generator to be built
97-
*/
98-
template <typename C, typename... Params>
99-
void Build(const C &build_cb, BaseGenerator &generator, Params &&...params) {
100-
build_cb(generator, std::forward<Params>(params)...);
101-
tf::Task task = BuildGeneratorTask(generator);
102-
BuildStoreTask(generator.GetUniqueId(), task);
85+
template <typename C, typename T, typename... Params>
86+
void Build(const C &build_cb, T &builder, Params &&...params) {
87+
constexpr bool is_supported_base = std::is_base_of_v<CustomGenerator, T> ||
88+
std::is_base_of_v<BaseTarget, T>;
89+
static_assert(
90+
is_supported_base,
91+
"Build only supports BaseTarget, CustomGenerator and derivatives");
92+
93+
build_cb(builder, std::forward<Params>(params)...);
94+
tf::Task task = BuildTask(builder);
95+
BuildStoreTask(builder.GetUniqueId(), task);
10396
}
10497

10598
/**
@@ -144,8 +137,8 @@ class Reg::Instance {
144137
private:
145138
private:
146139
// BuildTasks
147-
tf::Task BuildTargetTask(BaseTarget &target);
148-
tf::Task BuildGeneratorTask(BaseGenerator &generator);
140+
tf::Task BuildTask(BaseTarget &target);
141+
tf::Task BuildTask(CustomGenerator &generator);
149142
void BuildStoreTask(const std::string &unique_id, const tf::Task &task);
150143

151144
private:
@@ -167,11 +160,10 @@ class Reg::CallbackInstance {
167160
return *this;
168161
}
169162

170-
template <typename C, typename... Params>
171-
CallbackInstance &Build(const C &build_cb, BaseGenerator &generator,
172-
Params &&...params) {
163+
template <typename C, typename T, typename... Params>
164+
CallbackInstance &Build(const C &build_cb, T &builder, Params &&...params) {
173165
if (condition_) {
174-
Ref().Build(build_cb, generator, std::forward<Params>(params)...);
166+
Ref().Build(build_cb, builder, std::forward<Params>(params)...);
175167
};
176168
return *this;
177169
}
@@ -191,16 +183,14 @@ class Reg::ToolchainInstance {
191183
return *this;
192184
}
193185

194-
template <typename C, typename... Params>
195-
ToolchainInstance &Build(const C &build_cb, BaseGenerator &generator,
196-
Params &&...params) {
197-
return BuildInternal(build_cb, generator, std::forward<Params>(params)...);
198-
}
199-
template <typename C, typename... Params>
200-
ToolchainInstance &Build(const C &build_cb, BaseTarget &target,
201-
Params &&...params) {
202-
return BuildInternal(build_cb, target, std::forward<Params>(params)...);
186+
template <typename C, typename T, typename... Params>
187+
ToolchainInstance &Build(const C &build_cb, T &builder, Params &&...params) {
188+
if (condition_.build) {
189+
Ref().Build(build_cb, builder, std::forward<Params>(params)...);
190+
};
191+
return *this;
203192
}
193+
// TODO, Update/Change this
204194
template <typename P> ToolchainInstance &BuildPackage(P &package) {
205195
return Func([&]() { package.Setup(condition_); });
206196
}
@@ -209,16 +199,6 @@ class Reg::ToolchainInstance {
209199
ToolchainInstance &Test(const std::string &command, const BaseTarget &target,
210200
const TestConfig &config = TestConfig());
211201

212-
private:
213-
template <typename C, typename T, typename... Params>
214-
ToolchainInstance &BuildInternal(const C &build_cb, T &t,
215-
Params &&...params) {
216-
if (condition_.build) {
217-
Ref().Build(build_cb, t, std::forward<Params>(params)...);
218-
}
219-
return *this;
220-
}
221-
222202
private:
223203
ArgToolchainState condition_;
224204
};

buildcc/lib/args/mock/tasks.cpp

+3-5
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@
44

55
namespace buildcc {
66

7-
tf::Task Reg::Instance::BuildTargetTask(BaseTarget &target) {
7+
tf::Task Reg::Instance::BuildTask(BaseTarget &target) {
88
mock().actualCall(fmt::format("BuildTask_{}", target.GetName()).c_str());
99
return build_tf_.placeholder().name(target.GetUniqueId());
1010
}
11-
12-
tf::Task Reg::Instance::BuildGeneratorTask(BaseGenerator &generator) {
13-
mock().actualCall(
14-
fmt::format("BuildGeneratorTask_{}", generator.GetName()).c_str());
11+
tf::Task Reg::Instance::BuildTask(CustomGenerator &generator) {
12+
mock().actualCall(fmt::format("BuildTask_{}", generator.GetName()).c_str());
1513
return build_tf_.placeholder().name(generator.GetUniqueId());
1614
}
1715

buildcc/lib/args/src/tasks.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020

2121
namespace buildcc {
2222

23-
tf::Task Reg::Instance::BuildTargetTask(BaseTarget &target) {
23+
tf::Task Reg::Instance::BuildTask(BaseTarget &target) {
2424
return build_tf_.composed_of(target.GetTaskflow()).name(target.GetUniqueId());
2525
}
2626

27-
tf::Task Reg::Instance::BuildGeneratorTask(BaseGenerator &generator) {
27+
tf::Task Reg::Instance::BuildTask(CustomGenerator &generator) {
2828
return build_tf_.composed_of(generator.GetTaskflow())
2929
.name(generator.GetUniqueId());
3030
}

buildcc/lib/target/cmake/mock_target.cmake

-5
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,6 @@ add_library(mock_target STATIC
44
mock/custom_generator/runner.cpp
55
mock/custom_generator/recheck_states.cpp
66

7-
# Generator mocks
8-
src/generator/task.cpp
9-
mock/generator/runner.cpp
10-
mock/generator/recheck_states.cpp
11-
127
# Target mocks
138
src/target/tasks.cpp
149
mock/target/runner.cpp

buildcc/lib/target/cmake/target.cmake

-3
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@ set(TARGET_SRCS
33

44
src/custom_generator/recheck_states.cpp
55

6-
src/generator/task.cpp
7-
src/generator/recheck_states.cpp
8-
96
src/target/recheck_states.cpp
107
src/target/tasks.cpp
118
)

buildcc/lib/target/include/target/custom_generator.h

+49-15
Original file line numberDiff line numberDiff line change
@@ -56,19 +56,48 @@ typedef std::function<bool(CustomGeneratorContext &)> GenerateCb;
5656
typedef std::function<void(std::unordered_map<std::string, tf::Task> &)> DependencyCb;
5757
// clang-format on
5858

59-
struct UserRelInputOutputSchema : internal::RelInputOutputSchema {
59+
class CustomBlobHandler {
60+
public:
61+
bool CheckChanged(const std::vector<uint8_t> &previous,
62+
const std::vector<uint8_t> &current) const {
63+
env::assert_fatal(
64+
Verify(previous),
65+
"Stored blob is corrupted or User verification is incorrect");
66+
env::assert_fatal(
67+
Verify(current),
68+
"Current blob is corrupted or User verification is incorrect");
69+
return !IsEqual(previous, current);
70+
};
71+
72+
std::vector<uint8_t> GetSerializedData() {
73+
auto serialized_data = Serialize();
74+
env::assert_fatal(
75+
Verify(serialized_data),
76+
"Serialized data is corrupted or Serialize function is incorrect");
77+
return serialized_data;
78+
}
79+
80+
private:
81+
virtual bool Verify(const std::vector<uint8_t> &serialized_data) const = 0;
82+
virtual bool IsEqual(const std::vector<uint8_t> &previous,
83+
const std::vector<uint8_t> &current) const = 0;
84+
virtual std::vector<uint8_t> Serialize() const = 0;
85+
};
86+
87+
struct UserGenInfo : internal::GenInfo {
6088
fs_unordered_set inputs;
6189
GenerateCb generate_cb;
90+
std::shared_ptr<CustomBlobHandler> blob_handler{nullptr};
6291
};
6392

6493
struct UserCustomGeneratorSchema : public internal::CustomGeneratorSchema {
65-
std::unordered_map<std::string, UserRelInputOutputSchema> rels_map;
94+
std::unordered_map<std::string, UserGenInfo> gen_info_map;
6695

6796
void ConvertToInternal() {
68-
for (auto &r_miter : rels_map) {
97+
for (auto &r_miter : gen_info_map) {
6998
r_miter.second.internal_inputs = path_schema_convert(
7099
r_miter.second.inputs, internal::Path::CreateExistingPath);
71-
auto p = internal_rels_map.emplace(r_miter.first, r_miter.second);
100+
auto p = internal_gen_info_map.emplace(r_miter.first, r_miter.second);
72101
env::assert_fatal(p.second,
73102
fmt::format("Could not save {}", r_miter.first));
74103
}
@@ -86,13 +115,17 @@ class CustomGenerator : public internal::BuilderInterface {
86115
virtual ~CustomGenerator() = default;
87116
CustomGenerator(const CustomGenerator &) = delete;
88117

89-
/**
90-
* @brief Add default arguments for input, output and command requirements
91-
*
92-
* @param arguments Key-Value pair for arguments
93-
*/
118+
// From env::Command module, forwarding here
119+
// TODO, Create a Mixin
120+
void AddDefaultArgument(const std::string &identifier,
121+
const std::string &pattern);
94122
void AddDefaultArguments(
95123
const std::unordered_map<std::string, std::string> &arguments);
124+
std::string Construct(
125+
const std::string &pattern,
126+
const std::unordered_map<const char *, std::string> &arguments = {});
127+
const std::string &
128+
GetValueByIdentifier(const std::string &file_identifier) const;
96129

97130
/**
98131
* @brief Single Generator task for inputs->generate_cb->outputs
@@ -105,7 +138,8 @@ class CustomGenerator : public internal::BuilderInterface {
105138
*/
106139
void AddGenInfo(const std::string &id, const fs_unordered_set &inputs,
107140
const fs_unordered_set &outputs,
108-
const GenerateCb &generate_cb);
141+
const GenerateCb &generate_cb,
142+
std::shared_ptr<CustomBlobHandler> blob_handler = nullptr);
109143

110144
// Callbacks
111145
/**
@@ -127,6 +161,7 @@ class CustomGenerator : public internal::BuilderInterface {
127161
void Build() override;
128162

129163
// Getters
164+
const std::string &GetName() const { return name_; }
130165
const fs::path &GetBinaryPath() const {
131166
return serialization_.GetSerializedFile();
132167
}
@@ -140,10 +175,9 @@ class CustomGenerator : public internal::BuilderInterface {
140175
template <bool run> void TaskRunner(const std::string &id);
141176

142177
void GenerateTask();
143-
void BuildGenerate(std::unordered_map<std::string, UserRelInputOutputSchema>
144-
&gen_selected_map,
145-
std::unordered_map<std::string, UserRelInputOutputSchema>
146-
&dummy_gen_selected_map);
178+
void BuildGenerate(
179+
std::unordered_map<std::string, UserGenInfo> &gen_selected_map,
180+
std::unordered_map<std::string, UserGenInfo> &dummy_gen_selected_map);
147181

148182
// Recheck states
149183
void IdRemoved();
@@ -159,7 +193,7 @@ class CustomGenerator : public internal::BuilderInterface {
159193
UserCustomGeneratorSchema user_;
160194

161195
std::mutex success_schema_mutex_;
162-
std::unordered_map<std::string, UserRelInputOutputSchema> success_schema_;
196+
std::unordered_map<std::string, UserGenInfo> success_schema_;
163197

164198
// Internal
165199
env::Command command_;

0 commit comments

Comments
 (0)