CBuild
C++ build system with scripts written in c++
Loading...
Searching...
No Matches
register.cpp
Go to the documentation of this file.
1
23// C++ libraries
24#include "../../headers/map.hpp"
25#include "string"
26#include "vector"
27// Project headers
37// Bugfix
38namespace CBuild {
39namespace Registry {
40void null_handler() {}
41// Version handler
43} // namespace Registry
44} // namespace CBuild
45/* Custom tasks */
46namespace CBuild {
69class Version : public CBuild::Task {
70 public:
71 Version() : CBuild::Task("CBuild_version", {}) {}
72 void call(std::vector<std::string>) {
73 CBuild::print(std::string("CBuild version ") + CBUILD_VERSION_STR +
74 std::string(" by WolodiaM"));
75 CBuild::print(std::string("Compiled by GCC ") + CBUILD_COMPILER_VERSION);
76 CBuild::print(std::string("Compiled on ") + CBUILD_COMPILATION_DATE + std::string(" at ") +
78 CBuild::print("");
79 CBuild::print("Licensed under GPL v3 or later");
80 CBuild::print("Copyright (C) 2023 WolodiaM");
81 CBuild::print("");
83 }
84};
85class TaskList : public CBuild::Task {
86 public:
87 TaskList() : CBuild::Task("CBuild_tasklist", {}) {}
88 void call(std::vector<std::string>) {
89 CBuild::print("Registered tasks:");
90 for (auto task : CBuild::Registry::GetTasksList()) {
91 CBuild::print(std::string("\t") + task);
92 }
93 }
94};
96 public:
97 ToolchainList() : CBuild::Task("CBuild_toolchainlist", {}) {}
98 void call(std::vector<std::string>) {
99 CBuild::print("Registered targets:");
100 for (auto toolchain : CBuild::Registry::GetToolchainsList()) {
101 CBuild::print(std::string("\t") + toolchain);
102 }
103 }
104};
106 public:
107 GeneratorList() : CBuild::Task("CBuild_generatorlist", {}) {}
108 void call(std::vector<std::string>) {
109 CBuild::print("Registered generators:");
110 for (auto gen : CBuild::Registry::GetGeneratorsList()) {
111 CBuild::print(std::string("\t") + gen);
112 }
113 }
114};
115class CmdList : public CBuild::Task {
116 public:
117 CmdList() : CBuild::Task("CBuild_cmdlist", {}) {}
118 void call(std::vector<std::string>) {
119 CBuild::print("Registered user commands:");
120 for (auto cmd : CBuild::Registry::GetKeywordsList().keys()) {
121 CBuild::print(std::string("\t") + cmd);
122 }
123 }
124};
126 public:
127 CBuildRebuildScript() : CBuild::GXX<>("cbuild_rebuild_build_script", "CBuild") {}
128 void post_link() override {
129 CBuild::system(std::string("cp -rf ") + this->gen_out_name() + std::string(" ."));
130 }
131};
132} // namespace CBuild
133/* namesapce Registry */
134namespace CBuild {
135namespace Registry {
136// System tasks
144// System generators
147// Rebuild script
149// Registred data
150// Tasks pointers ;)
152// Executed tasks
154// Toolchains pointers ;)
156// Executed toolchains
158// Custom cmd line arguments to tasks mapping
160// Output generators
162} // namespace Registry
163} // namespace CBuild
164/* register.hpp */
166 // Register help task
167 Registry::RegisterKeyword("--help", &CBuild::Registry::help);
168 // Register init task
169 Registry::RegisterKeyword("--init", &CBuild::Registry::initw);
170 // Register version task
171 Registry::RegisterKeyword("--version", &CBuild::Registry::ver);
172 // Task list task
173 Registry::RegisterKeyword("--task-list", &CBuild::Registry::tasklist);
174 // Target list task
175 Registry::RegisterKeyword("--target-list", &CBuild::Registry::toolchainlist);
176 // User commands list
177 Registry::RegisterKeyword("--commands-list", &CBuild::Registry::cmdlist);
178 // Generator list task
179 Registry::RegisterKeyword("--generator-list", &CBuild::Registry::generatorlist);
180 // Register system generators
181 Registry::RegisterGenerator(&CBuild::Registry::makefileo, "make");
182 Registry::RegisterGenerator(&CBuild::Registry::ccjo, "ccj");
183 // Register rebuild target
190 CBuild::Registry::rebuild_script.add_link_arg("-Wl,-rpath,\\$ORIGIN/CBuild/CBuild");
192 Registry::RegisterTarget(&CBuild::Registry::rebuild_script);
193}
195 // Save task ptr connected to it's name
196 try {
197 Registry::tasks.push_back_check(task->self_name(), task);
198 } catch (std::exception& e) {
199 CBuild::print_full("Error: trying to register task with the same id: " + task->self_name(),
201 return;
202 }
203 // Save task excution state connected to it's name
204 Registry::task_executed.push_back(task->self_name(), false);
205}
206void CBuild::Registry::CallTask(std::string name, std::vector<std::string> args) {
207 // Load executed state of task
208 auto check = Registry::task_executed.get_ptr(name);
209 // Check if task exixtst and wasn't executed
210 if (check != NULL && check->data == false) {
211 // Load task
212 auto mod = Registry::tasks.get_ptr(name);
213 // Call all required tasks, recursion ;)
214 for (std::string s : mod->data->self_required()) {
215 Registry::CallTask(s, args);
216 }
217 // Call task
218 mod->data->call(args);
219 // Mark this task es exuted, very easy because of pointers ;)
220 check->data = true;
221 }
222 // Print error if task not found
223 if (check == NULL)
224 CBuild::print("Task " + name + " not found. Exiting ...", CBuild::RED);
225}
227 // Save toolchain ptr connected to it's name
228 try {
229 Registry::targets.push_back_check(target->get_id(), target);
230 } catch (std::exception& e) {
231 CBuild::print_full("Error: trying to register toolchain with the same id: " +
232 target->get_id(),
234 return;
235 }
236 // Save toolchain excution state connected to it's name
237 Registry::target_executed.push_back(target->get_id(), false);
238}
239CBuild::Toolchain* CBuild::Registry::GetToolchain(std::string name, bool force) {
240 // If we not in force build
241 if (!force) {
242 // Check if toolchain was executed before
243 auto check = Registry::target_executed.get_ptr(name);
244 if (check != NULL && check->data == false) {
245 // Return toolchain pointer if not
246 auto elem = Registry::targets.get_ptr(name);
247 // Mark toolcian as executed
248 check->data = true;
249 return elem->data;
250 }
251 }
252 // We in force build
253 else {
254 // Return toolchain ptr
255 auto elem = Registry::targets.get_ptr(name);
256 if (elem != NULL)
257 return elem->data;
258 }
259 // Some error occured
260 return NULL;
261}
263 // Return raw map of toolchains, return copy
264 return Registry::targets;
265}
267 // Register task
268 Registry::RegisterTask(func);
269 // Connect argument to this task
270 try {
271 Registry::keywords.push_back_check(key, func->self_name());
272 } catch (std::exception& e) {
273 CBuild::print_full("Error: trying to register simmilar keyword: " + key, CBuild::RED);
274 }
275}
277 // Return list of arguments
278 return Registry::keywords;
279}
280
281void CBuild::Registry::SetRebuildName(std::string name_) {
282 // Save name
284}
285void CBuild::Registry::AddLinkArg(std::string arg) {
286 // Add argument
288}
289void CBuild::Registry::AddCompileArg(std::string arg) {
290 // Add argument
292}
293void CBuild::Registry::ToolchainAll(bool force, std::string path, std::vector<std::string>* args) {
294 for (unsigned int i = 0; i < Registry::targets.size(); i++) {
295 auto elem = Registry::targets.at(i);
296 auto check = Registry::target_executed.get_ptr(elem.key);
297 if (check != NULL && check->data == false) {
298 check->data = true;
299 auto ptr = elem.data;
300 if (ptr != NULL) {
301 if (ptr->get_id() != std::string("cbuild_rebuild_build_script")) {
302 ptr->load_project_deps(path);
303 ptr->call(args, force);
304 }
305 }
306 }
307 }
308 // auto check = Registry::target_executed.get_ptr(name);
309 // if (check != NULL && check->data == false) {
310 // // Return toolchain pointer if not
311 // auto elem = Registry::targets.get_ptr(name);
312 // // Mark toolcian as executed
313 // check->data = true;
314 // return elem->data;
315 // }
316}
318 auto elem = Registry::generators.get_ptr(id);
319 if (elem != NULL) {
320 return elem->data;
321 }
322 return NULL;
323}
325 try {
326 Registry::generators.push_back_check(id, gen);
327 } catch (std::exception& e) {
328 CBuild::print_full("Error: trying to register generator with simmilar id: " + id, RED);
329 }
330}
331std::vector<std::string> CBuild::Registry::GetGeneratorsList() {
332 std::vector<std::string> ret;
333 for (auto gen : CBuild::Registry::generators) {
334 ret.push_back(gen.key);
335 }
336 return ret;
337}
338std::vector<std::string> CBuild::Registry::GetToolchainsList() {
339 std::vector<std::string> ret;
340 for (auto tg : CBuild::Registry::targets) {
341 ret.push_back(tg.key);
342 }
343 return ret;
344}
345std::vector<std::string> CBuild::Registry::GetTasksList() {
346 std::vector<std::string> ret;
347 for (auto ts : CBuild::Registry::tasks) {
348 ret.push_back(ts.key);
349 }
350 return ret;
351}
#define CBUILD_COMPILATION_DATE
#define CBUILD_VERSION_STR
#define CBUILD_COPY_CACHE_DIR
tmp dir in cache dir
#define CBUILD_SCRIPTS_DIR
Scripts dir of CBuild.
#define CBUILD_CACHE_DIR
Cache directory of CBuild.
#define CBUILD_COMPILATION_TIME
#define CBUILD_COMPILER_VERSION
Data about CBuild compilation.
#define CBUILD_BUILD_DIR
Build directory of CBuild.
Help print routine for CBuild.
Generator for compile_command.json.
void post_link() override
After linking.
Definition register.cpp:128
void call(std::vector< std::string >)
Executed on task call.
Definition register.cpp:118
void call(std::vector< std::string >)
Executed on task call.
Definition register.cpp:108
Init task.
Definition register.cpp:50
void call(std::vector< std::string >)
Executed on task call.
Definition register.cpp:53
void call(std::vector< std::string >)
Executed on task call.
Definition register.cpp:88
Task, can be runned from shell or code.
Definition Task.hpp:32
std::string self_name()
Return task name.
Definition Task.cpp:28
void call(std::vector< std::string >)
Executed on task call.
Definition register.cpp:98
Toolchain class.
Definition Build.hpp:65
virtual void set_standart(std::string std_)
Set standart for code (-std=std_)
Definition Build.cpp:126
std::string get_id()
Definition Build.hpp:244
virtual void add_compile_arg(std::string arg)
Directly add compiler argument.
Definition Build.cpp:38
virtual void add_folder(std::string path)
Add folder to compile path, scan is not recursive.
Definition Build.cpp:187
virtual void set_name(std::string name)
Change out file name.
Definition Build.cpp:166
virtual void add_library_include(std::string library)
Add system library include, library include folder need to be in PATH.
Definition Build.cpp:83
virtual std::string gen_out_name(std::string executable=".run", std::string dyn_lib=".so", std::string stat_lib=".a")
Generate output file name (after linking)
Definition Build.cpp:394
virtual void add_link_arg(std::string arg)
Add linker arguments.
Definition Build.cpp:44
virtual void set_type(CBuild::build_type type)
Set the type of build.
Definition Build.cpp:133
virtual void warn()
Enable more warnings.
Definition Build.cpp:110
Version task.
Definition register.cpp:69
void call(std::vector< std::string >)
Executed on task call.
Definition register.cpp:72
Generates compile_commands.json.
Definition ccj.hpp:38
Base for any generator.
Definition generator.hpp:36
Generate Makefile from task/target, works as command logger.
Definition makefile.hpp:37
Simple map implementation with some stack operation added.
Definition map.hpp:79
filesystem++ api
g++ toolchain implementation
Base class for generator of some output from command sequence.
Makefile generator.
Custom implementation of map datatype.
CBuild::TaskList tasklist
Definition register.cpp:140
CBuild::Init initw
Definition register.cpp:138
void SetVersionHandler(void(*handler)())
Set handler to add output to --version
Definition register.cpp:352
CBuild::ccj_out ccjo
Definition register.cpp:145
lib::map< std::string, CBuild::generator_base * > generators
Definition register.cpp:161
std::vector< std::string > GetToolchainsList()
Get list of registered toolchains.
Definition register.cpp:338
CBuild::Toolchain * GetToolchain(std::string name, bool force=false)
Get the registered toolchain.
Definition register.cpp:239
void RegisterTask(CBuild::Task *task)
Register new task.
Definition register.cpp:194
void(* handler)()
Definition register.cpp:42
void CallTask(std::string name, std::vector< std::string > args)
Run tasks.
Definition register.cpp:206
void SetRebuildName(std::string _name)
Set the rebuilt CBuild executable name.
Definition register.cpp:281
void AddLinkArg(std::string arg)
Add linker arg for CBuild rebuild.
Definition register.cpp:285
lib::map< std::string, std::string > GetKeywordsList()
Get list of all user registered keywords.
Definition register.cpp:276
lib::map< std::string, bool > task_executed
Definition register.cpp:153
lib::map< std::string, CBuild::Toolchain * > GetTargets()
Get list of all targets.
Definition register.cpp:262
lib::map< std::string, CBuild::Task * > tasks
Definition register.cpp:151
CBuild::Help help
Definition register.cpp:137
void RegisterGenerator(CBuild::generator_base *gen, std::string id)
Register generator for id.
Definition register.cpp:324
CBuild::Toolchain * GetRebuildTarget()
Get target used for rebuild of CBuild script.
Definition register.cpp:355
void null_handler()
Definition register.cpp:40
lib::map< std::string, std::string > keywords
Definition register.cpp:159
void init()
Internal init.
Definition register.cpp:165
std::vector< std::string > GetGeneratorsList()
Get list of registered generators.
Definition register.cpp:331
CBuild::generator_base * GetGenerator(std::string id)
Get generator for specified id.
Definition register.cpp:317
lib::map< std::string, CBuild::Toolchain * > targets
Definition register.cpp:155
void AddCompileArg(std::string arg)
Add compiler argument for CBuild rebuild.
Definition register.cpp:289
CBuild::GeneratorList generatorlist
Definition register.cpp:142
CBuild::Version ver
Definition register.cpp:139
void RegisterKeyword(std::string key, CBuild::Task *func)
Register new keyord for parsing, ! Dangerous, owerwriting existing keywords can lead to undefined beh...
Definition register.cpp:266
CBuild::CmdList cmdlist
Definition register.cpp:143
CBuild::makefile_out makefileo
Definition register.cpp:146
std::vector< std::string > GetTasksList()
Get list of registered tasks.
Definition register.cpp:345
CBuild::CBuildRebuildScript rebuild_script
Definition register.cpp:148
lib::map< std::string, bool > target_executed
Definition register.cpp:157
void RegisterTarget(CBuild::Toolchain *target)
Register new target for build.
Definition register.cpp:226
void ToolchainAll(bool force, std::string path, std::vector< std::string > *args)
Call and execute all toolchains.
Definition register.cpp:293
CBuild::ToolchainList toolchainlist
Definition register.cpp:141
bool exists(std::string path)
Check if file exists.
bool create(std::vector< std::string > paths, CBuild::fs::type what)
Create element.
@ DIRECTORY
Standard directory.
Filebuffer for CBuild ecosystem.
Definition Build.hpp:34
void print(std::string msg, color fg=CBuild::WHITE)
Print colored text to STDOUT.
Definition print.cpp:70
@ EXECUTABLE
Definition Build.hpp:55
@ RED
Definition print.hpp:34
ARG_TYPE(*)(lib::map< std::string, std::string > *, char **, int, int, CBuild::RType *) handler
Handler for specific argument.
int system(std::string cmd)
Call stdlib system() and print cmd to shell.
Definition system.cpp:47
void print_full(std::string msg, color fg=CBuild::WHITE)
Print colored text to STDOUT if verbose flag is set.
Definition print.cpp:75
Custom print that support color codes.
Register any things.
Command for compile_commands.json.