From 4f923fbdace27f27421bf18dfc9655b73bd68929 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sun, 13 Jun 2021 19:00:13 +0200 Subject: Move execution code into its own function and use from all tasks. --- Makefile | 5 ++-- cppbuild.cc | 8 +++++- execute.cc | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ execute.h | 9 +++++++ libcppbuild.h | 2 +- task_cc.cc | 83 +++++++---------------------------------------------------- task_ld.cc | 26 +++++++++---------- 7 files changed, 117 insertions(+), 92 deletions(-) create mode 100644 execute.cc create mode 100644 execute.h diff --git a/Makefile b/Makefile index a7b0ee7..b3f91cb 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,11 @@ all: libcppbuild.a cppbuild -libcppbuild.a: libcppbuild.cc libcppbuild.h task_cc.cc task_cc.h task_ld.cc task_ld.h task.h +libcppbuild.a: libcppbuild.cc libcppbuild.h task_cc.cc task_cc.h task_ld.cc task_ld.h task.h execute.cc execute.h g++ -g -std=c++17 libcppbuild.cc -c -o libcppbuild.o g++ -g -std=c++17 task_cc.cc -c -o task_cc.o g++ -g -std=c++17 task_ld.cc -c -o task_ld.o - ar rcs libcppbuild.a libcppbuild.o task_cc.o task_ld.o + g++ -g -std=c++17 execute.cc -c -o execute.o + ar rcs libcppbuild.a libcppbuild.o task_cc.o task_ld.o execute.o cppbuild: cppbuild.cc libcppbuild.h libcppbuild.a g++ -g -std=c++17 cppbuild.cc libcppbuild.a -pthread -o cppbuild diff --git a/cppbuild.cc b/cppbuild.cc index ae6fd8d..3604260 100644 --- a/cppbuild.cc +++ b/cppbuild.cc @@ -161,6 +161,12 @@ BuildConfiguration configs() }, // linker flags - "-lm -lX11 -lXext -pthread -lsndfile", + { + "-lm", + "-lX11", + "-lXext", + "-pthread", + "-lsndfile", + } }; } diff --git a/execute.cc b/execute.cc new file mode 100644 index 0000000..cb96bc5 --- /dev/null +++ b/execute.cc @@ -0,0 +1,76 @@ +#include "execute.h" + +#include +#include +#include +#include +#include +#include + +namespace +{ +int parent_waitpid(pid_t pid) +{ + int status; + + if(waitpid(pid, &status, 0) != pid) + { + return 1; + } + + return status; +} +} // namespace :: + +int execute(const std::string& command, + const std::vector& args, + bool verbose) +{ + std::vector argv; + argv.push_back(command.data()); + for(const auto& arg : args) + { + argv.push_back(arg.data()); + } + argv.push_back(nullptr); + + if(verbose) + { + std::string cmd; + for(const auto& arg : argv) + { + if(arg == nullptr) + { + break; + } + if(!cmd.empty()) + { + cmd += " "; + } + cmd += arg; + } + + std::cout << cmd << "\n"; + } + +#if 1 + auto pid = vfork(); + if(pid == 0) + { + execv(command.data(), (char**)argv.data()); + } + auto ret = parent_waitpid(pid); +#elif 0 + pid_t pid; + if(posix_spawn(&pid, command.data(), nullptr, nullptr, + (char**)argv.data(), nullptr)) + { + return 1; + } + auto ret = parent_waitpid(pid); +#else + auto ret = system(cmd.data()); +#endif + + return ret; +} diff --git a/execute.h b/execute.h new file mode 100644 index 0000000..f284230 --- /dev/null +++ b/execute.h @@ -0,0 +1,9 @@ +// -*- c++ -*- +#pragma once + +#include +#include + +int execute(const std::string& command, + const std::vector& args, + bool verbose = true); diff --git a/libcppbuild.h b/libcppbuild.h index e4a7801..a7b82d7 100644 --- a/libcppbuild.h +++ b/libcppbuild.h @@ -9,7 +9,7 @@ struct BuildConfiguration std::vector sources; std::vector cxxflags; std::vector cflags; - std::string ldflags; + std::vector ldflags; }; BuildConfiguration configs(); diff --git a/task_cc.cc b/task_cc.cc index 2a65698..34129a3 100644 --- a/task_cc.cc +++ b/task_cc.cc @@ -2,14 +2,10 @@ #include #include -#include -#include -#include -#include -#include #include "libcppbuild.h" #include "settings.h" +#include "execute.h" namespace { @@ -148,17 +144,6 @@ bool TaskCC::dirty() return false; } -int parent_waitpid(pid_t pid) -{ - int status; - - if(waitpid(pid, &status, 0) != pid) - { - return 1; - } - - return status; -} int TaskCC::run() { if(!std::filesystem::exists(sourceFile)) @@ -174,69 +159,19 @@ int TaskCC::run() comp = "/usr/bin/gcc"; flags = config.cflags; } - - char source[256]; - strcpy(source, std::string(sourceFile).data()); - char target[256]; - strcpy(target, std::string(targetFile).data()); - char pwd[256]; - strcpy(pwd, std::string(std::filesystem::current_path()).data()); - std::vector argv; - //args.push_back("/bin/echo"); - if(comp == "/usr/bin/gcc") - { - argv.push_back("/usr/bin/gcc"); - } - else - { - argv.push_back("/usr/bin/g++"); - } - - argv.push_back("-MMD"); - argv.push_back("-c"); - argv.push_back(source); - argv.push_back("-o"); - argv.push_back(target); + std::vector args; + args.push_back("-MMD"); + args.push_back("-c"); + args.push_back(std::string(sourceFile)); + args.push_back("-o"); + args.push_back(std::string(targetFile)); for(const auto& flag : flags) { - argv.push_back(flag.data()); - } - - std::string cmd; - for(const auto& arg : argv) - { - if(arg == nullptr) - { - break; - } - if(!cmd.empty()) - { - cmd += " "; - } - cmd += arg; - } - std::cout << cmd << "\n"; - -#if 0 - auto pid = vfork(); - if(pid == 0) - { - execv(comp.data(), (char**)argv.data()); - } - auto ret = parent_waitpid(pid); -#elif 0 - pid_t pid; - if(posix_spawn(&pid, comp.data(), nullptr, nullptr, (char**)argv.data(), nullptr)) - { - return 1;//exit(1); + args.push_back(flag); } - auto ret = parent_waitpid(pid); -#else - auto ret = system(cmd.data()); -#endif - return ret; + return execute(comp, args); } int TaskCC::clean() diff --git a/task_ld.cc b/task_ld.cc index 235523f..0cd4c95 100644 --- a/task_ld.cc +++ b/task_ld.cc @@ -2,14 +2,10 @@ #include #include -#include -#include -#include -#include -#include #include "libcppbuild.h" #include "settings.h" +#include "execute.h" TaskLD::TaskLD(const BuildConfiguration& config, const Settings& settings, @@ -22,8 +18,6 @@ TaskLD::TaskLD(const BuildConfiguration& config, targetFile /= target; for(const auto& object : objects) { - //std::filesystem::path objectFile = settings.builddir; - //objectFile /= object; std::filesystem::path objectFile = object; objectFiles.push_back(objectFile); } @@ -60,15 +54,19 @@ int TaskLD::run() objectlist += std::string(objectFile); } - std::string compiler = "g++ " + objectlist + " " + - config.ldflags + " " + - "-o " + std::string(targetFile); - std::cout << compiler << "\n"; - if(system(compiler.data())) + std::vector args; + for(const auto& objectFile : objectFiles) { - return 1; + args.push_back(std::string(objectFile)); } - return 0; + for(const auto& flag : config.ldflags) + { + args.push_back(flag); + } + args.push_back("-o"); + args.push_back(std::string(targetFile)); + + return execute("/usr/bin/g++", args); } int TaskLD::clean() -- cgit v1.2.3