diff options
-rw-r--r-- | .gitignore | 4 | ||||
-rw-r--r-- | Makefile | 8 | ||||
-rw-r--r-- | cppbuild.cc | 30 | ||||
-rw-r--r-- | execute.cc | 8 | ||||
-rw-r--r-- | libcppbuild.cc | 53 | ||||
-rw-r--r-- | libcppbuild.h | 3 |
6 files changed, 103 insertions, 3 deletions
@@ -1,3 +1,5 @@ +drumgizmo/ +build/ cppbuild *.a -*.o
\ No newline at end of file +*.o @@ -1,10 +1,11 @@ -all: libcppbuild.a +all: libcppbuild.a cppbuild SRC = \ libcppbuild.cc \ task_cc.cc \ task_ld.cc \ task_ar.cc \ + task_so.cc \ task.cc \ execute.cc \ @@ -18,5 +19,8 @@ CXXFLAGS = -g -O3 -std=c++17 -I. libcppbuild.a: $(OBJ) ar rcs $@ $(OBJ) +cppbuild: cppbuild.cc libcppbuild.a + g++ $(CXXFLAGS) -pthread cppbuild.cc libcppbuild.a -o $@ + clean: - rm -f libcppbuild.a $(OBJ) + rm -f libcppbuild.a $(OBJ) cppbuild diff --git a/cppbuild.cc b/cppbuild.cc index 882fe63..b1b31ed 100644 --- a/cppbuild.cc +++ b/cppbuild.cc @@ -18,8 +18,38 @@ exit $? #include "libcppbuild.h" +/* +Nested build configurations for for example unit-tests in a test folder +#include "test/cppbuild.cc" +*/ + std::vector<BuildConfiguration> configs() { + reg(__FILE__); +/* +Glob convenience methods +std::string glob = getFilesInDir(...); +*/ + +/* +Compilation database +https://clang.llvm.org/docs/JSONCompilationDatabase.html +*/ + +/* +En feature mere kunne være: pre-post build hooks +De vil kunne udtrykkes som intra-build dependencies +Og så selvfølgelig med conditions +*/ + +/* +Target som er "shell script" eller sådan noget +så kan man kalde f.eks. imageconvert +*/ + +/* +Compiler selection per-target (for arm cross-compilation) +*/ return { { @@ -7,6 +7,14 @@ #include <spawn.h> #include <iostream> +/* +https://blog.famzah.net/2009/11/20/a-much-faster-popen-and-system-implementation-for-linux/ +https://github.com/famzah/popen-noshell/commit/1f9eaf4eeef348d1efe0f3c7fe8ab670653cfbb1 +https://blog.famzah.net/2018/12/19/posix_spawn-performance-benchmarks-and-usage-examples/ +https://stackoverflow.com/questions/4259629/what-is-the-difference-between-fork-and-vfork/5207945#5207945 + */ + + namespace { int parent_waitpid(pid_t pid) diff --git a/libcppbuild.cc b/libcppbuild.cc index 69d23ba..b400061 100644 --- a/libcppbuild.cc +++ b/libcppbuild.cc @@ -18,6 +18,7 @@ #include "task_ar.h" #include "task_so.h" #include "settings.h" +#include "execute.h" #include <unistd.h> @@ -82,8 +83,60 @@ std::shared_ptr<Task> getNextTask(const std::list<std::shared_ptr<Task>>& allTas return nullptr; } +namespace +{ +// Hack to get command-line args for re-launch +int g_argc; +char** g_argv; +} + +// TODO: Use c++20 when ready, somehing like this: +//void reg(const std::source_location location = +// std::source_location::current()) +void reg(const std::string& location) +{ + std::filesystem::path configFile(location); + std::filesystem::path binFile(configFile.stem()); + if(std::filesystem::last_write_time(binFile) <= + std::filesystem::last_write_time(configFile)) + { + std::cout << "Rebuilding config\n"; + auto ret = execute("/usr/bin/g++", + { + "-s", + "-O3", + "-std=c++17", + "-pthread", + configFile.string(), + "libcppbuild.a", + "-o", + binFile.string(), + }); + if(ret != 0) + { + std::cerr << "Failed.\n"; + exit(1); + } + else + { + std::cout << "Re-launch\n"; + std::vector<std::string> args; + for(int i = 1; i < g_argc; ++i) + { + args.push_back(g_argv[i]); + } + exit(execute(g_argv[0], args)); + } + } + +// g++ -s -O3 -std=c++17 -pthread $0 libcppbuild.a -o cppbuild +} + int main(int argc, char* argv[]) { + g_argc = argc; + g_argv = argv; + Settings settings; // TODO: Set from commandline settings.builddir = "build/foo"; diff --git a/libcppbuild.h b/libcppbuild.h index 50b4459..98f6716 100644 --- a/libcppbuild.h +++ b/libcppbuild.h @@ -3,6 +3,7 @@ #include <string> #include <vector> +//#include <source_location> struct BuildConfiguration { @@ -15,3 +16,5 @@ struct BuildConfiguration }; std::vector<BuildConfiguration> configs(); + +void reg(const std::string& location); |