diff options
-rw-r--r-- | .gitignore | 5 | ||||
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | bootstrap.bat | 44 | ||||
-rwxr-xr-x | clbootstrap.sh | 50 | ||||
-rwxr-xr-x | clrun.sh | 22 | ||||
-rw-r--r-- | ctor.cc | 29 | ||||
-rw-r--r-- | src/bootstrap.cc | 22 | ||||
-rw-r--r-- | src/configure.cc | 176 | ||||
-rw-r--r-- | src/execute.cc | 139 | ||||
-rw-r--r-- | src/execute.h | 4 | ||||
-rw-r--r-- | src/libctor.cc | 9 | ||||
-rw-r--r-- | src/libctor.h | 1 | ||||
-rw-r--r-- | src/rebuild.cc | 41 | ||||
-rw-r--r-- | src/rebuild.h | 3 | ||||
-rw-r--r-- | src/task.cc | 23 | ||||
-rw-r--r-- | src/task.h | 1 | ||||
-rw-r--r-- | src/task_ar.cc | 12 | ||||
-rw-r--r-- | src/task_cc.cc | 31 | ||||
-rw-r--r-- | src/task_fn.cc | 2 | ||||
-rw-r--r-- | src/task_ld.cc | 15 | ||||
-rw-r--r-- | src/task_ld.h | 4 | ||||
-rw-r--r-- | src/task_so.cc | 3 | ||||
-rw-r--r-- | src/tasks.cc | 14 | ||||
-rw-r--r-- | src/tasks.h | 9 | ||||
-rw-r--r-- | src/tools.cc | 63 | ||||
-rw-r--r-- | src/tools.h | 1 | ||||
-rw-r--r-- | src/unittest.cc | 3 | ||||
-rw-r--r-- | src/unittest.h | 2 | ||||
-rw-r--r-- | src/util.cc | 1 | ||||
-rw-r--r-- | test/ctor.cc | 78 | ||||
-rw-r--r-- | test/execute_test.cc | 6 | ||||
-rw-r--r-- | test/source_type_test.cc | 8 | ||||
-rw-r--r-- | test/tasks_test.cc | 76 | ||||
-rw-r--r-- | test/tools_test.cc | 24 |
34 files changed, 182 insertions, 741 deletions
@@ -1,7 +1,8 @@ drumgizmo/ build/ ctor -ctor.exe +*.a +*.o +*.d configuration.cc config.h -examples @@ -1,4 +1,4 @@ -# Introduction + # Introduction Have you ever wondered, if you want to compile a C++ program, why you always need to learn another language to make it build properly with dependency diff --git a/bootstrap.bat b/bootstrap.bat deleted file mode 100644 index 2a8820a..0000000 --- a/bootstrap.bat +++ /dev/null @@ -1,44 +0,0 @@ -@echo off -:: Run with: -:: WINEDEBUG=-all wine start bootstrap.bat - -set BASE=C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133 -set ONECORELIB="%BASE%\lib\onecore\x86" -set path=%path%;%BASE%\bin\Hostx86\x86 -set INCLUDE="%BASE%\include" -set UCRT="C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt" -set UCRTLIB="C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x86" -set UM="C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um" -set UMLIB="C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x86" -set SHARED="C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared" -echo Bootstrapping... - -set CL=/I"%BASE%\include" /I%UCRT% /I%UM% /I%SHARED% /link /LIBPATH:%UMLIB% /LIBPATH:%ONECORELIB% /LIBPATH:%UCRTLIB% -set LINK=/LIBPATH:%UMLIB% /LIBPATH:%ONECORELIB% /LIBPATH:%UCRTLIB% -set LIB=/LIBPATH:%UMLIB% /LIBPATH:%ONECORELIB% /LIBPATH:%UCRTLIB% - -:: https://docs.microsoft.com/en-us/cpp/build/reference/cl-environment-variables?view=msvc-170 - -:: set INCLUDE="%BASE%\include";%UCRT%;%UM%;%SHARED% -:: set LIB= -:: set LIBPATH=%UMLIB%;%ONECORELIB%;%UCRTLIB% - -set CXX=cl.exe -set CC=cl.exe -set AR=lib.exe -set LD=link.exe -cl /nologo /std:c++20 /D_X86_ /EHsc /Isrc src/bootstrap.cc /link /SUBSYSTEM:CONSOLE /out:ctor.exe - -set /p DUMMY=Hit ENTER to continue... - -ctor.exe - -set /p DUMMY=Hit ENTER to continue... - -cl /nologo /std:c++20 /D_X86_ /EHsc /Isrc ctor.cc build/libctor.lib /link /SUBSYSTEM:CONSOLE /out:ctor.exe - -set /p DUMMY=Hit ENTER to continue... - -ctor.exe configure --name ctor.exe --ctor-includedir=src --ctor-libdir=build --cxx=cl.exe --cc=cl.exe --ar=lib.exe --ld=link.exe - -set /p DUMMY=!!!!!!!!!!!!!!!!!Hit ENTER to continue... diff --git a/clbootstrap.sh b/clbootstrap.sh deleted file mode 100755 index e3a420f..0000000 --- a/clbootstrap.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -set -e -set -x -export WINEDEBUG=-all - -rm -f ~/.wine/drive_c/number - -export BASE='C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133' -export ONECORELIB="$BASE\lib\onecore\x86" -export WINEPATH="$BASE\bin\Hostx86\x86" -export INCLUDE="$BASE\include" -export UCRT="C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt" -export UCRTLIB="C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x86" -export UM="C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um" -export UMLIB="C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x86" -export SHARED="C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared" -echo Bootstrapping... - -export CL="/I\"$BASE\include\" /I\"$UCRT\" /I\"$UM\" /I\"$SHARED\" /link /LIBPATH:\"$UMLIB\" /LIBPATH:\"$ONECORELIB\" /LIBPATH:\"$UCRTLIB\"" -export LINK="/LIBPATH:\"$UMLIB\" /LIBPATH:\"$ONECORELIB\" /LIBPATH:\"$UCRTLIB\"" -export LIB="/LIBPATH:\"$UMLIB\" /LIBPATH:\"$ONECORELIB\" /LIBPATH:\"$UCRTLIB\"" - -# https://docs.microsoft.com/en-us/cpp/build/reference/cl-environment-variables?view=msvc-170 - -# set INCLUDE="$BASE\include";$UCRT;$UM;$SHARED -# set LIB= -# set LIBPATH=$UMLIB;$ONECORELIB;$UCRTLIB - -rm -Rf ctor.exe build/ configuration.cc - -export CXX="cl.exe" -export CC="cl.exe" -export AR="lib.exe" -export LD="link.exe" -wine cl /nologo /std:c++20 /D_X86_ /EHsc /Isrc src/bootstrap.cc /link /SUBSYSTEM:CONSOLE /out:ctor.exe - -#echo -e "\n\n\nHit ENTER to continue...\n\n\n"; read - -wine ctor.exe - -#echo -e "\n\n\nHit ENTER to continue...\n\n\n"; read - -wine cl /nologo /std:c++20 /D_X86_ /EHsc /Isrc ctor.cc build/libctor.lib /link /SUBSYSTEM:CONSOLE /out:ctor.exe - -#echo -e "\n\n\nHit ENTER to continue...\n\n\n"; read - -wine ctor.exe configure --ctor-includedir=src --ctor-libdir=build --cxx=cl.exe --cc=cl.exe --ar=lib.exe --ld=link.exe - -#echo -e "\n\n\nHit ENTER to continue...\n\n\n"; read - diff --git a/clrun.sh b/clrun.sh deleted file mode 100755 index e920372..0000000 --- a/clrun.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -set -e -set -x -export WINEDEBUG=-all - -rm -f ~/.wine/drive_c/number - -export BASE='C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133' -export ONECORELIB="$BASE\lib\onecore\x86" -export WINEPATH="$BASE\bin\Hostx86\x86" -export INCLUDE="$BASE\include" -export UCRT="C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt" -export UCRTLIB="C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x86" -export UM="C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um" -export UMLIB="C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x86" -export SHARED="C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared" - -export CL="/I\"$BASE\include\" /I\"$UCRT\" /I\"$UM\" /I\"$SHARED\" /link /LIBPATH:\"$UMLIB\" /LIBPATH:\"$ONECORELIB\" /LIBPATH:\"$UCRTLIB\"" -export LINK="/LIBPATH:\"$UMLIB\" /LIBPATH:\"$ONECORELIB\" /LIBPATH:\"$UCRTLIB\"" -export LIB="/LIBPATH:\"$UMLIB\" /LIBPATH:\"$ONECORELIB\" /LIBPATH:\"$UCRTLIB\"" -wine ctor.exe - @@ -11,7 +11,7 @@ BuildConfigurations ctorConfigs(const Settings& settings) { { .type = TargetType::StaticLibrary, - .target = "libctor.lib", + .target = "libctor.a", .sources = { "src/build.cc", "src/configure.cc", @@ -29,30 +29,15 @@ BuildConfigurations ctorConfigs(const Settings& settings) "src/tools.cc", "src/util.cc", "src/unittest.cc", - "getopt-for-windows/getopt.c", }, .flags = { .cxxflags = { - "/std:c++20", -// "/O2", -// "/Wall", -// "/WX", - "/Isrc", - "/nologo", - "/EHsc", - "/D_X86_", - "/Igetopt-for-windows", - }, - .cflags = { - "/std:c++20", -// "/O2", -// "/Wall", -// "/WX", - "/Isrc", - "/nologo", - "/EHsc", - "/D_X86_", - "/Igetopt-for-windows", + "-std=c++20", + "-O3", + "-g", + "-Wall", + "-Werror", + "-Isrc", }, }, } diff --git a/src/bootstrap.cc b/src/bootstrap.cc index 97fe6fa..9a3c321 100644 --- a/src/bootstrap.cc +++ b/src/bootstrap.cc @@ -3,7 +3,6 @@ // See accompanying file LICENSE for details. #include <iostream> #include <array> -#include <cstdlib> #define BOOTSTRAP @@ -18,7 +17,6 @@ #include "tasks.cc" #include "build.cc" #include "tools.cc" -#include "../ctor.cc" std::filesystem::path configurationFile("configuration.cc"); std::filesystem::path configHeaderFile("config.h"); @@ -37,24 +35,6 @@ bool hasConfiguration(const std::string& key) const std::string& getConfiguration(const std::string& key, const std::string& defaultValue) { - if(key == cfg::host_cxx && std::getenv("CXX")) - { - static std::string s = std::getenv("CXX"); - return s; - } - - if(key == cfg::host_cc && std::getenv("CC")) - { - static std::string s = std::getenv("CC"); - return s; - } - - if(key == cfg::host_ar && std::getenv("AR")) - { - static std::string s = std::getenv("AR"); - return s; - } - return defaultValue; } @@ -71,7 +51,7 @@ int main(int argc, char* argv[]) settings.builddir = getConfiguration(cfg::builddir, "build"); settings.parallel_processes = - (std::max)(1u, std::thread::hardware_concurrency() * 2 - 1); + std::max(1u, std::thread::hardware_concurrency() * 2 - 1); settings.verbose = 0; auto all_tasks = getTasks(settings, {}, false); for(auto task : all_tasks) diff --git a/src/configure.cc b/src/configure.cc index 8348c19..a81f8ad 100644 --- a/src/configure.cc +++ b/src/configure.cc @@ -23,39 +23,15 @@ std::map<std::string, std::string> external_includedir; std::map<std::string, std::string> external_libdir; const Configuration default_configuration{}; -#if !defined(_WIN32) const Configuration& __attribute__((weak)) configuration() { return default_configuration; } -#else -//extern const char * pWeakValue; -//extern const char * pDefaultWeakValue = NULL; -// -//#pragma comment(linker, "/alternatename:_pWeakValue=_pDefaultWeakValue") -const Configuration& defConfiguration() -{ - return default_configuration; -} -#pragma comment(linker, "/alternatename:?configuration@@YAABUConfiguration@@XZ=?defConfiguration@@YAABUConfiguration@@XZ") -//https://stackoverflow.com/questions/2290587/gcc-style-weak-linking-in-visual-studio -//https://devblogs.microsoft.com/oldnewthing/20200731-00/?p=104024 - -//extern "C" -//{ -//void default_error_log() { /* do nothing */ } -//} -//// For expository simplification: assume x86 cdecl -//#pragma comment(linker, "/alternatename:_error_log=_default_error_log") - - -#endif namespace ctor { std::optional<std::string> includedir; std::optional<std::string> libdir; -std::map<std::string, std::string> conf_values; } bool hasConfiguration(const std::string& key) @@ -70,11 +46,6 @@ bool hasConfiguration(const std::string& key) return true; } - if(ctor::conf_values.find(key) != ctor::conf_values.end()) - { - return true; - } - const auto& c = configuration(); return c.tools.find(key) != c.tools.end(); } @@ -92,11 +63,6 @@ const std::string& getConfiguration(const std::string& key, return *ctor::libdir; } - if(ctor::conf_values.find(key) != ctor::conf_values.end()) - { - return ctor::conf_values[key]; - } - const auto& c = configuration(); if(hasConfiguration(key)) { @@ -122,24 +88,11 @@ std::string locate(const std::string& arch, const std::string& app) { std::stringstream ss(path_env); std::string path; - while (std::getline(ss, path, ';')) + while (std::getline(ss, path, ':')) { paths.push_back(path); } } - { - const auto& cfg = configuration(); - auto it = cfg.env.find("ctorPATH"); - if(it != cfg.env.end()) - { - std::stringstream ss(it->second); - std::string path; - while (std::getline(ss, path, ';')) - { - paths.push_back(path); - } - } - } for(const auto& path_str : paths) { std::filesystem::path path(path_str); @@ -174,10 +127,10 @@ class Args : public std::vector<char*> { public: - Args(const std::string& name, const std::vector<std::string>& args) + Args(const std::vector<std::string>& args) { resize(args.size() + 1); - (*this)[0] = strdup(name.data()); + (*this)[0] = strdup("./ctor"); for(std::size_t i = 0; i < size() - 1; ++i) { (*this)[i + 1] = strdup(args[i].data()); @@ -193,32 +146,15 @@ public: } }; -std::string esc(const std::string& in) -{ - std::string out; - for(auto c : in) - { - switch(c) - { - case '\\': out += "\\\\"; break; - case '"': out += "\\\""; break; - default: - out += c; - break; - } - } - return out; -} - // helper constant for the visitor template<class> inline constexpr bool always_false_v = false; -int regenerateCache(Settings& settings, - const std::string& name, +int regenerateCache(const Settings& default_settings, const std::vector<std::string>& args, const std::map<std::string, std::string>& env) { - Args vargs(name, args); + Settings settings{default_settings}; + Args vargs(args); dg::Options opt; int key{128}; @@ -249,13 +185,6 @@ int regenerateCache(Settings& settings, return 0; }); - opt.add("name", required_argument, 'n', - "Set the output name of the ctor command to override the current one.", - [&]() { - settings.name = optarg; - return 0; - }); - opt.add("cc", required_argument, key++, "Use specified c-compiler instead of gcc.", [&]() { @@ -382,19 +311,6 @@ int regenerateCache(Settings& settings, opt.process(vargs.size(), vargs.data()); - std::filesystem::path settings_file(settings.name); - std::filesystem::path argv0_file(vargs[0]); - - if(settings_file.is_relative()) - { - settings_file = std::filesystem::current_path() / settings_file; - } - if(argv0_file.is_relative()) - { - argv0_file = std::filesystem::current_path() / argv0_file; - } - - if(host_arch.empty()) { host_arch = build_arch; @@ -460,20 +376,6 @@ int regenerateCache(Settings& settings, std::string build_ar = locate(build_arch, ar_prog); std::string build_ld = locate(build_arch, ld_prog); - // Store current values for execution in this execution context. - if(!ctor_includedir.empty()) - { - ctor::conf_values[cfg::ctor_includedir] = ctor_includedir; - } - if(!ctor_libdir.empty()) - { - ctor::conf_values[cfg::ctor_libdir] = ctor_libdir; - } - ctor::conf_values[cfg::host_cxx] = host_cxx; - ctor::conf_values[cfg::build_cxx] = build_cxx; - ctor::conf_values[cfg::host_ld] = host_ld; - ctor::conf_values[cfg::build_ld] = build_ld; - std::cout << "Writing results to: " << configurationFile.string() << "\n"; { std::ofstream istr(configurationFile); @@ -485,34 +387,34 @@ int regenerateCache(Settings& settings, istr << " .args = {"; for(const auto& arg : args) { - istr << "\"" << esc(arg) << "\","; + istr << "\"" << arg << "\","; } istr << "},\n"; - istr << " .env = {\n"; + istr << " .env = {"; for(const auto& e : env) { - istr << " {\"" << e.first << "\", \"" << esc(e.second) << "\"},\n"; + istr << "{\"" << e.first << "\", \"" << e.second << "\"}, "; } - istr << " },\n"; + istr << "},\n"; istr << " .tools = {\n"; - istr << " { \"" << cfg::builddir << "\", \"" << esc(settings.builddir) << "\" },\n"; - istr << " { \"" << cfg::host_cc << "\", \"" << esc(host_cc) << "\" },\n"; - istr << " { \"" << cfg::host_cxx << "\", \"" << esc(host_cxx) << "\" },\n"; - istr << " { \"" << cfg::host_ar << "\", \"" << esc(host_ar) << "\" },\n"; - istr << " { \"" << cfg::host_ld << "\", \"" << esc(host_ld) << "\" },\n"; - istr << " { \"" << cfg::build_cc << "\", \"" << esc(build_cc) << "\" },\n"; - istr << " { \"" << cfg::build_cxx << "\", \"" << esc(build_cxx) << "\" },\n"; - istr << " { \"" << cfg::build_ar << "\", \"" << esc(build_ar) << "\" },\n"; - istr << " { \"" << cfg::build_ld << "\", \"" << esc(build_ld) << "\" },\n"; + istr << " { \"" << cfg::builddir << "\", \"" << settings.builddir << "\" },\n"; + istr << " { \"" << cfg::host_cc << "\", \"" << host_cc << "\" },\n"; + istr << " { \"" << cfg::host_cxx << "\", \"" << host_cxx << "\" },\n"; + istr << " { \"" << cfg::host_ar << "\", \"" << host_ar << "\" },\n"; + istr << " { \"" << cfg::host_ld << "\", \"" << host_ld << "\" },\n"; + istr << " { \"" << cfg::build_cc << "\", \"" << build_cc << "\" },\n"; + istr << " { \"" << cfg::build_cxx << "\", \"" << build_cxx << "\" },\n"; + istr << " { \"" << cfg::build_ar << "\", \"" << build_ar << "\" },\n"; + istr << " { \"" << cfg::build_ld << "\", \"" << build_ld << "\" },\n"; if(!ctor_includedir.empty()) { - istr << " { \"" << cfg::ctor_includedir << "\", \"" << esc(ctor_includedir) << "\" },\n"; + istr << " { \"" << cfg::ctor_includedir << "\", \"" << ctor_includedir << "\" },\n"; ctor::includedir = ctor_includedir; } if(!ctor_libdir.empty()) { - istr << " { \"" << cfg::ctor_libdir << "\", \"" << esc(ctor_libdir) << "\" },\n"; + istr << " { \"" << cfg::ctor_libdir << "\", \"" << ctor_libdir << "\" },\n"; ctor::libdir = ctor_libdir; } @@ -606,7 +508,7 @@ int configure(const Settings& global_settings, int argc, char* argv[]) args.push_back(argv[i]); } - auto env = configuration().env; + std::map<std::string, std::string> env; auto cc_env = getenv("CC"); if(cc_env) { @@ -631,32 +533,7 @@ int configure(const Settings& global_settings, int argc, char* argv[]) env["LD"] = ld_env; } - // Env vars for msvc - auto cl_env = getenv("CL"); - if(cl_env) - { - env["CL"] = cl_env; - } - - auto lib_env = getenv("LIB"); - if(lib_env) - { - env["LIB"] = lib_env; - } - - auto link_env = getenv("LINK"); - if(link_env) - { - env["LINK"] = link_env; - } - - auto path_env = getenv("PATH"); - if(path_env) - { - env["ctorPATH"] = path_env; - } - - auto ret = regenerateCache(settings, argv[0], args, env); + auto ret = regenerateCache(settings, args, env); if(ret != 0) { return ret; @@ -667,9 +544,8 @@ int configure(const Settings& global_settings, int argc, char* argv[]) return 0; } -int reconfigure(const Settings& global_settings, int argc, char* argv[]) +int reconfigure(const Settings& settings, int argc, char* argv[]) { - Settings settings{global_settings}; bool no_rerun{false}; std::vector<std::string> args; @@ -697,7 +573,7 @@ int reconfigure(const Settings& global_settings, int argc, char* argv[]) } std::cout << "\n"; - auto ret = regenerateCache(settings, argv[0], cfg.args, cfg.env); + auto ret = regenerateCache(settings, cfg.args, cfg.env); if(ret != 0) { return ret; @@ -710,5 +586,5 @@ int reconfigure(const Settings& global_settings, int argc, char* argv[]) return 0; // this was originally invoked by configure, don't loop } - return execute(argv[0], args, {}); + return execute(argv[0], args); } diff --git a/src/execute.cc b/src/execute.cc index 85c1da1..610ccdd 100644 --- a/src/execute.cc +++ b/src/execute.cc @@ -3,17 +3,11 @@ // See accompanying file LICENSE for details. #include "execute.h" -#include <cstring> -#if !defined(_WIN32) #include <unistd.h> +#include <cstring> #include <sys/types.h> #include <sys/wait.h> #include <spawn.h> -#else -#include <processthreadsapi.h> -#include <synchapi.h> -#include <processenv.h> -#endif #include <iostream> /* @@ -24,7 +18,6 @@ https://stackoverflow.com/questions/4259629/what-is-the-difference-between-fork- */ -#if !defined(_WIN32) namespace { int parent_waitpid(pid_t pid) @@ -39,12 +32,10 @@ int parent_waitpid(pid_t pid) return WEXITSTATUS(status); } } // namespace :: -#endif int execute(const std::string& command, const std::vector<std::string>& args, - const std::map<std::string, std::string>& env, - bool verbose, bool terminate) + bool verbose) { std::vector<const char*> argv; argv.push_back(command.data()); @@ -54,138 +45,46 @@ int execute(const std::string& command, } argv.push_back(nullptr); - std::string cmd; - for(const auto& arg : argv) + if(verbose) { - if(arg == nullptr) - { - break; - } - if(!cmd.empty()) + std::string cmd; + for(const auto& arg : argv) { - cmd += " "; + if(arg == nullptr) + { + break; + } + if(!cmd.empty()) + { + cmd += " "; + } + cmd += arg; } - cmd += arg; - } - if(verbose) - { std::cout << cmd << "\n"; } -#if !defined(_WIN32) - #if 1 auto pid = vfork(); if(pid == 0) { - for(const auto& [key, value] : env) - { - setenv(key, value); - } - // TODO: use execvpe to set LD_LIBRARY_PATH execv(command.data(), (char**)argv.data()); std::cout << "Could not execute " << command << ": " << strerror(errno) << "\n"; _exit(1); // execv only returns if an error occurred } - - return parent_waitpid(pid); + auto ret = parent_waitpid(pid); #elif 0 pid_t pid; - const char * envp[] = {nullptr}; // TODO: use this to set LD_LIBRARY_PATH if(posix_spawn(&pid, command.data(), nullptr, nullptr, - (char**)argv.data(), envp)) + (char**)argv.data(), nullptr)) { return 1; } - return parent_waitpid(pid); + auto ret = parent_waitpid(pid); #else - return system(cmd.data()); + auto ret = system(cmd.data()); #endif -#else - std::map<std::string, std::string> new_env; - auto env_strings = GetEnvironmentStrings(); - const char* ptr = env_strings; - std::string key; - std::string value; - bool key_state{true}; - while(true) - { - if(key_state) // searching for key - { - if(*ptr == '\0') - { - break; - } - - if(*ptr != '=') - { - key += *ptr; - } - else - { - key_state = false; - } - } - else - { - if(*ptr != '\0') - { - value += *ptr; - } - else - { - new_env.insert({key, value}); - key = {}; - value = {}; - key_state = true; - } - } - ++ptr; - } - FreeEnvironmentStrings(env_strings); - - // add new env vars (if any) - for(const auto& [key, value] : env) - { - //if(key == "CL" || key == "LINK" || key == "LIB") - { - new_env[key] = value; - } - } - - std::string env_str; - for(const auto& [k,v] : new_env) - { - env_str += k + "=" + v; - env_str += '\0'; - } - env_str += '\0'; - STARTUPINFO si; - PROCESS_INFORMATION pi; - ZeroMemory(&si,sizeof(si)); - si.cb=sizeof(si); - ZeroMemory(&pi,sizeof(pi)); - // TODO: Use SetDllDirectory(...) to set DLL search directory - if(!CreateProcess(nullptr, //"C:/WINDOWS/notepad.exe", - //"notepad.exe c:/readme.txt",0,0,0,0,0,0,&si,&pi)) - (char*)cmd.data(),0,0,0,0,env_str.data(),0,&si,&pi)) - { - return 1; // Could not start process; - } - - if(terminate) - { - ExitProcess(0); - } - // Now 'pi.hProcess' contains the process HANDLE, which you can use to - // wait for it like this: - const DWORD infinite = 0xFFFFFFFF; - WaitForSingleObject(pi.hProcess, infinite); - DWORD exitCode{0}; - GetExitCodeProcess(pi.hProcess, &exitCode); - return exitCode; -#endif + return ret; } diff --git a/src/execute.h b/src/execute.h index e0626ab..c750a83 100644 --- a/src/execute.h +++ b/src/execute.h @@ -5,9 +5,7 @@ #include <string> #include <vector> -#include <map> int execute(const std::string& command, const std::vector<std::string>& args, - const std::map<std::string, std::string>& env, - bool verbose = true, bool terminate = false); + bool verbose = true); diff --git a/src/libctor.cc b/src/libctor.cc index bfa09d6..d188771 100644 --- a/src/libctor.cc +++ b/src/libctor.cc @@ -33,7 +33,6 @@ int main(int argc, char* argv[]) settings.builddir = getConfiguration(cfg::builddir, settings.builddir); settings.parallel_processes = std::max(1u, std::thread::hardware_concurrency()) * 2 - 1; - settings.name = argv[0]; if(argc > 1 && std::string(argv[1]) == "configure") { @@ -97,14 +96,6 @@ int main(int argc, char* argv[]) return 0; }); - opt.add("name", required_argument, 'n', - "Set the output name of the ctor command to override the current one.", - [&]() { - std::this_thread::sleep_for(std::chrono::seconds(3)); - settings.name = optarg; - return 0; - }); - opt.add("add", required_argument, 'a', "Add specified file to the build configurations.", [&]() { diff --git a/src/libctor.h b/src/libctor.h index e4ea7e7..96e1115 100644 --- a/src/libctor.h +++ b/src/libctor.h @@ -69,7 +69,6 @@ struct Settings std::string builddir{"build"}; std::size_t parallel_processes{1}; int verbose{0}; // -1: completely silent, 0: normal, 1: verbose, ... - std::string name; }; struct BuildConfiguration; diff --git a/src/rebuild.cc b/src/rebuild.cc index cfbe790..9ddf5ba 100644 --- a/src/rebuild.cc +++ b/src/rebuild.cc @@ -152,63 +152,40 @@ bool recompileCheck(const Settings& global_settings, int argc, char* argv[], { std::cout << "Recompile check (" << numConfigFiles << "):\n"; } - std::filesystem::path settings_file(global_settings.name); - std::filesystem::path argv0_file(argv[0]); - - if(settings_file.is_relative()) - { - settings_file = std::filesystem::current_path() / settings_file; - } - if(argv0_file.is_relative()) - { - argv0_file = std::filesystem::current_path() / argv0_file; - } BuildConfiguration config; - config.type = TargetType::Executable; config.name = "ctor"; config.system = OutputSystem::Build; auto tool_chain = getToolChain(config.system); append(config.flags.cxxflags, - getOption(tool_chain, opt::optimization, "2")); + getOption(tool_chain, opt::optimization, "3")); append(config.flags.cxxflags, getOption(tool_chain, opt::cpp_std, "c++20")); - config.flags.cxxflags.push_back("/nologo"); if(hasConfiguration(cfg::ctor_includedir)) { append(config.flags.cxxflags, getOption(tool_chain, opt::include_path, getConfiguration(cfg::ctor_includedir))); } - if(hasConfiguration(cfg::ctor_libdir)) { append(config.flags.ldflags, getOption(tool_chain, opt::library_path, getConfiguration(cfg::ctor_libdir))); } -// append(config.flags.ldflags, getOption(tool_chain, opt::link, "ctor")); - config.flags.ldflags.push_back("build/libctor.lib"); + append(config.flags.ldflags, getOption(tool_chain, opt::link, "ctor")); append(config.flags.ldflags, getOption(tool_chain, opt::threads)); - config.flags.ldflags.push_back("/nologo"); - config.flags.ldflags.push_back("/SUBSYSTEM:CONSOLE"); - Settings settings{global_settings}; - settings.parallel_processes = 1; - settings.verbose = 2;//-1; // Make check completely silent. + settings.verbose = -1; // Make check completely silent. settings.builddir += "/ctor"; // override builddir to use ctor subdir + { std::filesystem::path buildfile = settings.builddir; - std::filesystem::path currentfile = settings.name; - - if(currentfile.is_relative()) - { - currentfile = std::filesystem::current_path() / currentfile; - } + std::filesystem::path currentfile = argv[0]; config.target = std::filesystem::relative(currentfile, buildfile).string(); } @@ -247,7 +224,7 @@ bool recompileCheck(const Settings& global_settings, int argc, char* argv[], } } - auto tasks = taskFactory({config}, settings, {}, true); + auto tasks = taskFactory({config}, settings, {}); for(auto task : tasks) { @@ -270,8 +247,6 @@ bool recompileCheck(const Settings& global_settings, int argc, char* argv[], } auto dirty_tasks = build(settings, "ctor", tasks, true); // dryrun - - bool was_rebuilt{false}; if(dirty_tasks) { std::cout << "Rebuilding config.\n"; @@ -280,7 +255,6 @@ bool recompileCheck(const Settings& global_settings, int argc, char* argv[], { return ret; } - was_rebuilt = true; } if(reconfigure) @@ -295,11 +269,12 @@ bool recompileCheck(const Settings& global_settings, int argc, char* argv[], { args.push_back(argv[i]); } - auto ret = execute(settings.name, args, {}); + auto ret = execute(argv[0], args); //if(ret != 0) { exit(ret); } + } return dirty_tasks; diff --git a/src/rebuild.h b/src/rebuild.h index 7b0ebb8..f1255c6 100644 --- a/src/rebuild.h +++ b/src/rebuild.h @@ -7,7 +7,8 @@ #include <array> #include "libctor.h" -//class Settings; + +class Settings; struct BuildConfigurationEntry { diff --git a/src/task.cc b/src/task.cc index 4736565..fb50765 100644 --- a/src/task.cc +++ b/src/task.cc @@ -3,7 +3,7 @@ // See accompanying file LICENSE for details. #include "task.h" -//#include <unistd.h> +#include <unistd.h> #include <iostream> Task::Task(const BuildConfiguration& config, const Settings& settings, @@ -147,24 +147,11 @@ std::string Task::compiler() const case OutputSystem::Build: return getConfiguration(cfg::build_cxx, "/usr/bin/g++"); } + default: + std::cerr << "Unknown CC target type\n"; + exit(1); + break; } - - std::cerr << "Unknown CC target type\n"; - exit(1); -} - -std::string Task::linker() const -{ - switch(outputSystem()) - { - case OutputSystem::Host: - return getConfiguration(cfg::host_ld, "/usr/bin/ld"); - case OutputSystem::Build: - return getConfiguration(cfg::build_ld, "/usr/bin/ld"); - } - - std::cerr << "Unknown CC target type\n"; - exit(1); } std::set<std::shared_ptr<Task>> Task::getDependsTasks() @@ -64,7 +64,6 @@ public: Language sourceLanguage() const; OutputSystem outputSystem() const; std::string compiler() const; - std::string linker() const; std::set<std::shared_ptr<Task>> getDependsTasks(); diff --git a/src/task_ar.cc b/src/task_ar.cc index 3fcfcf4..3e1746c 100644 --- a/src/task_ar.cc +++ b/src/task_ar.cc @@ -78,16 +78,13 @@ bool TaskAR::dirtyInner() int TaskAR::runInner() { std::vector<std::string> args; - //args.push_back("rcs"); + args.push_back("rcs"); + args.push_back(targetFile().string()); for(const auto& task : getDependsTasks()) { args.push_back(task->targetFile().string()); } - args.push_back("/nologo"); - args.push_back("/SUBSYSTEM:CONSOLE"); - args.push_back("/out:"+targetFile().string()); - { // Write flags to file. std::ofstream flagsStream(flagsFile); flagsStream << flagsString(); @@ -109,8 +106,7 @@ int TaskAR::runInner() break; } - const auto& cfg = configuration(); - return execute(tool, args, cfg.env, settings.verbose > 0); + return execute(tool, args, settings.verbose > 0); } int TaskAR::clean() @@ -172,7 +168,7 @@ std::string TaskAR::flagsString() const } flagsStr += flag; } - //flagsStr += "\n"; + flagsStr += "\n"; for(const auto& dep : config.depends) { diff --git a/src/task_cc.cc b/src/task_cc.cc index e9ef590..c4343b6 100644 --- a/src/task_cc.cc +++ b/src/task_cc.cc @@ -24,6 +24,7 @@ TaskCC::TaskCC(const BuildConfiguration& config, const Settings& settings, sourceFile /= source.file; std::filesystem::path base = sourceFile.parent_path(); + std::filesystem::create_directories(std::filesystem::path(settings.builddir) / base); base /= cleanUp(config.target); base += "-"; @@ -55,17 +56,14 @@ TaskCC::TaskCC(const BuildConfiguration& config, const Settings& settings, if(source.output.empty()) { _targetFile = base; - _targetFile += ".obj"; + _targetFile += ".o"; } else { _targetFile = source.output; } - - std::filesystem::create_directories(targetFile().parent_path()); - depsFile = targetFile().parent_path() / targetFile().stem(); - depsFile += ".deps"; + depsFile += ".d"; flagsFile = targetFile().parent_path() / targetFile().stem(); flagsFile += ".flags"; } @@ -187,8 +185,7 @@ int TaskCC::runInner() targetFile().lexically_normal().string() << "\n"; } - const auto& cfg = configuration(); - return execute(compiler(), args, cfg.env, settings.verbose > 0); + return execute(compiler(), args, settings.verbose > 0); } int TaskCC::clean() @@ -288,26 +285,8 @@ std::vector<std::string> TaskCC::getCompilerArgs() const auto compiler_flags = flags(); - // cl.exe (compiler - gcc/g++) - // https://docs.microsoft.com/en-us/cpp/build/reference/compiler-options-listed-alphabetically?view=msvc-170 - - // /c Compiles without linking. - // /Fo Object File Name (or path if .cc basename is re-used) - // /F Output-File - // /Fe (Name EXE File) - // /sourceDependencies <file> json file with dependenciy tree - // /I<dir> include path - // /LD Creates a dynamic-link library. - // /link <option> Passes the specified option to LINK. - - // link.exe (exe and dll linker - ld) - // https://docs.microsoft.com/en-us/cpp/build/reference/linker-options?view=msvc-170 - - // lib.exe (lib linker - ar) - // https://docs.microsoft.com/en-us/cpp/build/reference/overview-of-lib?view=msvc-170 std::vector<std::string> args; - append(args, getOption(tool_chain, opt::generate_dep_tree, depsFile.string())); -// args.push_back("-MMD"); // https://github.com/ninja-build/ninja/issues/1806 + append(args, getOption(tool_chain, opt::generate_dep_tree)); if(std::filesystem::path(config.target).extension() == ".so") { diff --git a/src/task_fn.cc b/src/task_fn.cc index 9ef8f96..ab00fae 100644 --- a/src/task_fn.cc +++ b/src/task_fn.cc @@ -97,7 +97,7 @@ std::vector<std::string> TaskFn::depends() const std::string TaskFn::target() const { - return _targetFile.string(); + return _targetFile; } std::filesystem::path TaskFn::targetFile() const diff --git a/src/task_ld.cc b/src/task_ld.cc index 3d89f90..20e823d 100644 --- a/src/task_ld.cc +++ b/src/task_ld.cc @@ -15,12 +15,11 @@ TaskLD::TaskLD(const BuildConfiguration& config, const Settings& settings, const std::string& target, const std::vector<std::string>& objects, - const std::string& sourceDir, bool is_self) + const std::string& sourceDir) : Task(config, settings, sourceDir) , config(config) , settings(settings) , sourceDir(sourceDir) - , is_self(is_self) { target_type = config.type; if(target_type == TargetType::Auto) @@ -96,15 +95,14 @@ int TaskLD::runInner() auto lib = depFile.stem().string().substr(3); // strip 'lib' prefix append(args, getOption(tool_chain, opt::link, lib)); } - else if(depFile.extension() == ".lib" || depFile.extension() == ".obj") + else if(depFile.extension() == ".a" || depFile.extension() == ".o") { args.push_back(depFile.string()); } } append(args, config.flags.ldflags); -// append(args, getOption(tool_chain, opt::output, targetFile().string())); - args.push_back("/out:"+targetFile().string()); + append(args, getOption(tool_chain, opt::output, targetFile().string())); { // Write flags to file. std::ofstream flagsStream(flagsFile); @@ -116,9 +114,8 @@ int TaskLD::runInner() std::cout << "LD => " << targetFile().string() << "\n"; } - auto tool = linker(); - const auto& cfg = configuration(); - return execute(tool, args, cfg.env, settings.verbose > 0, is_self); + auto tool = compiler(); + return execute(tool, args, settings.verbose > 0); } int TaskLD::clean() @@ -180,7 +177,7 @@ std::string TaskLD::flagsString() const } flagsStr += flag; } - //flagsStr += "\n"; break on win32 + flagsStr += "\n"; for(const auto& dep : config.depends) { diff --git a/src/task_ld.h b/src/task_ld.h index 348d23b..8625075 100644 --- a/src/task_ld.h +++ b/src/task_ld.h @@ -21,8 +21,7 @@ public: const Settings& settings, const std::string& target, const std::vector<std::string>& objects, - const std::string& _sourceDir, - bool is_self); + const std::string& _sourceDir); virtual ~TaskLD() = default; bool dirtyInner() override; @@ -48,5 +47,4 @@ private: const BuildConfiguration& config; const Settings& settings; std::string sourceDir; - bool is_self; }; diff --git a/src/task_so.cc b/src/task_so.cc index 98057ea..8c6dbd4 100644 --- a/src/task_so.cc +++ b/src/task_so.cc @@ -106,8 +106,7 @@ int TaskSO::runInner() } auto tool = compiler(); - const auto& cfg = configuration(); - return execute(tool, args, cfg.env, settings.verbose > 0); + return execute(tool, args, settings.verbose > 0); } int TaskSO::clean() diff --git a/src/tasks.cc b/src/tasks.cc index 435bef1..68b2476 100644 --- a/src/tasks.cc +++ b/src/tasks.cc @@ -79,8 +79,7 @@ const std::deque<Target>& getTargets(const Settings& settings, std::set<std::shared_ptr<Task>> taskFactory(const BuildConfiguration& config, const Settings& settings, - const std::string& sourceDir, - bool is_self) + const std::string& sourceDir) { std::set<std::shared_ptr<Task>> tasks; @@ -93,16 +92,15 @@ std::set<std::shared_ptr<Task>> taskFactory(const BuildConfiguration& config, { target_type = TargetType::Function; } - else if(targetFile.extension() == ".lib") + else if(targetFile.extension() == ".a") { target_type = TargetType::StaticLibrary; } - else if(targetFile.extension() == ".dll") + else if(targetFile.extension() == ".so") { target_type = TargetType::DynamicLibrary; } - else if(targetFile.extension() == "" || - targetFile.extension() == ".exe") + else if(targetFile.extension() == "") { target_type = TargetType::Executable; } @@ -162,7 +160,7 @@ std::set<std::shared_ptr<Task>> taskFactory(const BuildConfiguration& config, case TargetType::Executable: case TargetType::UnitTest: tasks.insert(std::make_shared<TaskLD>(config, settings, config.target, - objects, sourceDir, is_self)); + objects, sourceDir)); break; case TargetType::Object: @@ -208,7 +206,7 @@ std::set<std::shared_ptr<Task>> getTasks(const Settings& settings, std::find(std::begin(names), std::end(names), target.config.target) != std::end(names)) { std::vector<std::string> objects; - auto t = taskFactory(target.config, settings, target.path, false); + auto t = taskFactory(target.config, settings, target.path); tasks.insert(t.begin(), t.end()); } } diff --git a/src/tasks.h b/src/tasks.h index 97b115c..c547432 100644 --- a/src/tasks.h +++ b/src/tasks.h @@ -9,9 +9,9 @@ #include <deque> #include "task.h" -#include "libctor.h" -//class BuildConfiguration; -//class Settings; + +class BuildConfiguration; +class Settings; struct Target { @@ -40,5 +40,4 @@ std::set<std::shared_ptr<Task>> getTasks(const Settings& settings, //! link target and all its objects files (if any). std::set<std::shared_ptr<Task>> taskFactory(const BuildConfiguration& config, const Settings& settings, - const std::string& sourceDir, - bool is_self); + const std::string& sourceDir); diff --git a/src/tools.cc b/src/tools.cc index cd00f89..7e8ac78 100644 --- a/src/tools.cc +++ b/src/tools.cc @@ -8,14 +8,6 @@ #include <cassert> -/* -https://docs.microsoft.com/en-us/cpp/build/reference/compiler-options-listed-alphabetically?view=msvc-170 -/TC Specifies all source files are C. -/Tc Specifies a C source file. -/TP Specifies all source files are C++. -/Tp Specifies a C++ source file. -*/ - ToolChain getToolChain(OutputSystem system) { std::string compiler; @@ -41,11 +33,6 @@ ToolChain getToolChain(OutputSystem system) { return ToolChain::gcc; } - else if(cc_cmd.find("cl") != std::string::npos || - cc_cmd.find("CL") != std::string::npos) - { - return ToolChain::msvc; - } std::cerr << "Unsupported output system.\n"; return ToolChain::gcc; @@ -68,7 +55,7 @@ std::vector<std::string> getOptionGcc(opt option, const std::string& arg) case opt::warnings_as_errors: return {"-Werror"}; case opt::generate_dep_tree: - return {"-MMD", "-MF" + arg}; + return {"-MMD"}; case opt::no_link: return {"-c"}; case opt::include_path: @@ -96,50 +83,6 @@ std::vector<std::string> getOptionGcc(opt option, const std::string& arg) std::cerr << "Unsupported compiler option.\n"; return {}; } - -std::vector<std::string> getOptionMsvc(opt option, const std::string& arg) -{ - switch(option) - { - case opt::output: - return {"/Fo\""+arg+"\""}; - case opt::debug: - return {"/DEBUG"}; - case opt::strip: - return {};//{"-s"}; TODO - case opt::warn_all: - return {"/Wall"}; - case opt::warnings_as_errors: - return {"/WX"}; - case opt::generate_dep_tree: - return {"/sourceDependencies", arg}; - case opt::no_link: - return {"/c"}; - case opt::include_path: - return {"/I" + arg}; - case opt::library_path: - return {"/LIBPATH:" + arg}; - case opt::link: - return {}; //{"-l" + arg}; TODO - case opt::cpp_std: - return {"/std:" + arg}; - case opt::build_shared: - return {};//{"-shared"}; TODO - case opt::threads: - return {};// {"-pthread"}; TODO - case opt::optimization: - return {"/O" + arg}; // TODO: max 2 - case opt::position_independent_code: - return {};//{"-fPIC"}; TODO - case opt::position_independent_executable: - return {};//{"-fPIE"}; TODO - case opt::custom: - return {arg}; - } - - std::cerr << "Unsupported compiler option.\n"; - return {}; -} } std::vector<std::string> getOption(ToolChain tool_chain, @@ -151,8 +94,6 @@ std::vector<std::string> getOption(ToolChain tool_chain, case ToolChain::gcc: case ToolChain::clang: return getOptionGcc(option, arg); - case ToolChain::msvc: - return getOptionMsvc(option, arg); } std::cerr << "Unsupported tool-chain.\n"; @@ -188,8 +129,6 @@ std::pair<opt, std::string> getOption(const std::string& flag, case ToolChain::gcc: case ToolChain::clang: return getOptionGcc(flag); - case ToolChain::msvc: - break; // TODO } std::cerr << "Unsupported tool-chain.\n"; diff --git a/src/tools.h b/src/tools.h index 37282e1..39118d2 100644 --- a/src/tools.h +++ b/src/tools.h @@ -12,7 +12,6 @@ enum class ToolChain { gcc, clang, - msvc, }; enum class opt diff --git a/src/unittest.cc b/src/unittest.cc index 5524ea5..f18de47 100644 --- a/src/unittest.cc +++ b/src/unittest.cc @@ -7,7 +7,6 @@ #include "execute.h" #include "task.h" -#include "libctor.h" int runUnitTests(std::set<std::shared_ptr<Task>>& tasks, const Settings& settings) @@ -25,7 +24,7 @@ int runUnitTests(std::set<std::shared_ptr<Task>>& tasks, name = task->target(); } std::cout << name << ": " << std::flush; - auto ret = execute(task->targetFile().string(), {}, {}, settings.verbose > 0); + auto ret = execute(task->targetFile(), {}, settings.verbose > 0); ok &= ret == 0; if(ret == 0) { diff --git a/src/unittest.h b/src/unittest.h index 5118689..8dee33c 100644 --- a/src/unittest.h +++ b/src/unittest.h @@ -7,7 +7,7 @@ #include <memory> class Task; -struct Settings; +class Settings; int runUnitTests(std::set<std::shared_ptr<Task>>& tasks, const Settings& settings); diff --git a/src/util.cc b/src/util.cc index 7aedad1..92560b6 100644 --- a/src/util.cc +++ b/src/util.cc @@ -22,7 +22,6 @@ std::string readFile(const std::string& fileName) std::vector<std::string> readDeps(const std::string& depFile) { - return {};// TODO: parse json if(!std::filesystem::exists(depFile)) { return {}; diff --git a/test/ctor.cc b/test/ctor.cc index 9a6ec91..9b690a2 100644 --- a/test/ctor.cc +++ b/test/ctor.cc @@ -19,16 +19,11 @@ BuildConfigurations ctorTestConfigs(const Settings& settings) }, .flags = { .cxxflags = { - "/std:c++20", "/O2",// "/Wall",// "/WX", - "/I../src", "/Iuunit", - "/Isrc", "/Itest/uunit", - "/DOUTPUT=\\\"execute\\\"", - "/nologo", - "/EHsc", - "/D_X86_", + "-std=c++20", "-O3", "-s", "-Wall", "-Werror", + "-I../src", "-Iuunit", + "-DOUTPUT=\"execute\"", }, - //.ldflags = { "/pthread" }, - .ldflags = { "/nologo" }, + .ldflags = { "-pthread" }, }, }, { @@ -38,19 +33,14 @@ BuildConfigurations ctorTestConfigs(const Settings& settings) "tasks_test.cc", "testmain.cc", }, - .depends = { "libctor_nomain.lib" }, + .depends = { "libctor_nomain.a" }, .flags = { .cxxflags = { - "/std:c++20", "/O2",// "/Wall",// "/WX", - "/I../src", "/Iuunit", - "/Isrc", "/Itest/uunit", - "/DOUTPUT=\\\"tasks\\\"", - "/nologo", - "/EHsc", - "/D_X86_", + "-std=c++20", "-O3", "-s", "-Wall", "-Werror", + "-I../src", "-Iuunit", + "-DOUTPUT=\"tasks\"", }, - //.ldflags = { "/pthread" }, - .ldflags = { "/nologo" }, + .ldflags = { "-pthread" }, }, }, { @@ -60,19 +50,14 @@ BuildConfigurations ctorTestConfigs(const Settings& settings) "source_type_test.cc", "testmain.cc", }, - .depends = { "libctor_nomain.lib" }, + .depends = { "libctor_nomain.a" }, .flags = { .cxxflags = { - "/std:c++20", "/O2",// "/Wall",// "/WX", - "/I../src", "/Iuunit", - "/Isrc", "/Itest/uunit", - "/DOUTPUT=\\\"source_type\\\"", - "/nologo", - "/EHsc", - "/D_X86_", + "-std=c++20", "-O3", "-s", "-Wall", "-Werror", + "-I../src", "-Iuunit", + "-DOUTPUT=\"source_type\"", }, - //.ldflags = { "/pthread" }, - .ldflags = { "/nologo" }, + .ldflags = { "-pthread" }, }, }, { @@ -86,20 +71,15 @@ BuildConfigurations ctorTestConfigs(const Settings& settings) //.depends = { "libctor_nomain.a" }, .flags = { .cxxflags = { - "/std:c++20", "/O2",// "/Wall",// "/WX", - "/I../src", "/Iuunit", - "/Isrc", "/Itest/uunit", - "/DOUTPUT=\\\"tools\\\"", - "/nologo", - "/EHsc", - "/D_X86_", + "-std=c++20", "-O3", "-Wall", "-Werror", + "-I../src", "-Iuunit", + "-DOUTPUT=\"tools\"", }, - .ldflags = { "/nologo" }, }, }, { .type = TargetType::UnitTestLib, - .target = "libctor_nomain.lib", + .target = "libctor_nomain.a", .sources = { "../src/build.cc", "../src/configure.cc", @@ -115,29 +95,13 @@ BuildConfigurations ctorTestConfigs(const Settings& settings) "../src/tools.cc", "../src/util.cc", "../src/externals_manual.cc", - "../getopt-for-windows/getopt.c", }, .flags = { .cxxflags = { - "/std:c++20", "/O2",// "/Wall",// "/WX", - "/I../src", - "/Isrc", - "/nologo", - "/EHsc", - "/D_X86_", - "/Igetopt-for-windows", + "-std=c++20", "-O3", "-s", "-Wall", "-Werror", + "-I../src", }, - .cflags = { - //"/std:c++20", "/O2",// "/Wall",// "/WX", - "/I../src", - "/Isrc", - "/nologo", - "/EHsc", - "/D_X86_", - "/Igetopt-for-windows", - }, - //.ldflags = { "/pthread" }, - .ldflags = { "/nologo" }, + .ldflags = { "-pthread" }, }, }, }; diff --git a/test/execute_test.cc b/test/execute_test.cc index 739156f..9da18dc 100644 --- a/test/execute_test.cc +++ b/test/execute_test.cc @@ -13,9 +13,9 @@ public: void runit() { - uUNIT_ASSERT_EQUAL(0, execute("/bin/true", {}, {}, false)); - uUNIT_ASSERT_EQUAL(1, execute("/bin/false", {}, {}, false)); - uUNIT_ASSERT_EQUAL(1, execute("no-such-binary", {}, {}, false)); + uASSERT_EQUAL(0, execute("/bin/true", {}, false)); + uASSERT_EQUAL(1, execute("/bin/false", {}, false)); + uASSERT_EQUAL(1, execute("no-such-binary", {}, false)); } }; diff --git a/test/source_type_test.cc b/test/source_type_test.cc index c4d12e3..ed7e783 100644 --- a/test/source_type_test.cc +++ b/test/source_type_test.cc @@ -50,22 +50,22 @@ public: { { // c++ TestableTaskCC task("hello.cc"); - uUNIT_ASSERT_EQUAL(Language::Cpp, task.language()); + uASSERT_EQUAL(Language::Cpp, task.language()); } { // c TestableTaskCC task("hello.c"); - uUNIT_ASSERT_EQUAL(Language::C, task.language()); + uASSERT_EQUAL(Language::C, task.language()); } { // asm TestableTaskCC task("hello.s"); - uUNIT_ASSERT_EQUAL(Language::Asm, task.language()); + uASSERT_EQUAL(Language::Asm, task.language()); } { // custom/explicit language TestableTaskCC task( {"hello.foo", Language::Asm} ); - uUNIT_ASSERT_EQUAL(Language::Asm, task.language()); + uASSERT_EQUAL(Language::Asm, task.language()); } // Note: Failure state will result in exit(1) so cannot be tested diff --git a/test/tasks_test.cc b/test/tasks_test.cc index f74ef37..2e0ffc7 100644 --- a/test/tasks_test.cc +++ b/test/tasks_test.cc @@ -93,17 +93,17 @@ public: using namespace std::string_literals; Settings settings{}; const auto& targets = getTargets(settings); - uUNIT_ASSERT_EQUAL(4u, targets.size()); + uASSERT_EQUAL(4u, targets.size()); - uUNIT_ASSERT_EQUAL("target1"s, targets[0].config.target); - uUNIT_ASSERT_EQUAL("target2"s, targets[1].config.target); - uUNIT_ASSERT_EQUAL("target3"s, targets[2].config.target); - uUNIT_ASSERT_EQUAL("target4"s, targets[3].config.target); + uASSERT_EQUAL("target1"s, targets[0].config.target); + uASSERT_EQUAL("target2"s, targets[1].config.target); + uASSERT_EQUAL("target3"s, targets[2].config.target); + uASSERT_EQUAL("target4"s, targets[3].config.target); - uUNIT_ASSERT_EQUAL("test"s, targets[0].path); - uUNIT_ASSERT_EQUAL("test"s, targets[1].path); - uUNIT_ASSERT_EQUAL("test"s, targets[2].path); - uUNIT_ASSERT_EQUAL("test"s, targets[3].path); + uASSERT_EQUAL("test"s, targets[0].path); + uASSERT_EQUAL("test"s, targets[1].path); + uASSERT_EQUAL("test"s, targets[2].path); + uASSERT_EQUAL("test"s, targets[3].path); } void getTasks_test() @@ -112,27 +112,27 @@ public: Settings settings{ .builddir = "foo" }; { auto tasks = getTasks(settings); - uUNIT_ASSERT_EQUAL(6u, tasks.size()); + uASSERT_EQUAL(6u, tasks.size()); // Note: count() is used here because the order of // std::set<std::shared_ptr<T>> is not deterministic. - uUNIT_ASSERT_EQUAL(1u, count(tasks, "target1"s)); - uUNIT_ASSERT_EQUAL(1u, count(tasks, "target2"s)); - uUNIT_ASSERT_EQUAL(1u, count(tasks, "target3"s)); - uUNIT_ASSERT_EQUAL(1u, count(tasks, "target4"s)); - uUNIT_ASSERT_EQUAL(1u, count(tasks, "test/target1-foo_cc.o"s)); - uUNIT_ASSERT_EQUAL(1u, count(tasks, "test/target1-bar_c.o"s)); + uASSERT_EQUAL(1u, count(tasks, "target1"s)); + uASSERT_EQUAL(1u, count(tasks, "target2"s)); + uASSERT_EQUAL(1u, count(tasks, "target3"s)); + uASSERT_EQUAL(1u, count(tasks, "target4"s)); + uASSERT_EQUAL(1u, count(tasks, "test/target1-foo_cc.o"s)); + uASSERT_EQUAL(1u, count(tasks, "test/target1-bar_c.o"s)); } { auto tasks = getTasks(settings, {"target1", "target3"}); - uUNIT_ASSERT_EQUAL(4u, tasks.size()); - uUNIT_ASSERT_EQUAL(1u, count(tasks, "target1"s)); - uUNIT_ASSERT_EQUAL(1u, count(tasks, "target3"s)); - uUNIT_ASSERT_EQUAL(1u, count(tasks, "test/target1-foo_cc.o"s)); - uUNIT_ASSERT_EQUAL(1u, count(tasks, "test/target1-bar_c.o"s)); + uASSERT_EQUAL(4u, tasks.size()); + uASSERT_EQUAL(1u, count(tasks, "target1"s)); + uASSERT_EQUAL(1u, count(tasks, "target3"s)); + uASSERT_EQUAL(1u, count(tasks, "test/target1-foo_cc.o"s)); + uASSERT_EQUAL(1u, count(tasks, "test/target1-bar_c.o"s)); } { auto tasks = getTasks(settings, {"no-such-target"}); - uUNIT_ASSERT_EQUAL(0u, tasks.size()); + uASSERT_EQUAL(0u, tasks.size()); } } @@ -147,10 +147,10 @@ public: for(auto& task : dirtyTasks) { - uUNIT_ASSERT_EQUAL(0, task->registerDepTasks(allTasks)); + uASSERT_EQUAL(0, task->registerDepTasks(allTasks)); } - uUNIT_ASSERT_EQUAL(nullptr, getNextTask(allTasks, dirtyTasks)); + uASSERT_EQUAL(nullptr, getNextTask(allTasks, dirtyTasks)); } { // Zero (One task, no dirty) @@ -163,10 +163,10 @@ public: for(auto& task : dirtyTasks) { - uUNIT_ASSERT_EQUAL(0, task->registerDepTasks(allTasks)); + uASSERT_EQUAL(0, task->registerDepTasks(allTasks)); } - uUNIT_ASSERT_EQUAL(nullptr, getNextTask(allTasks, dirtyTasks)); + uASSERT_EQUAL(nullptr, getNextTask(allTasks, dirtyTasks)); } { // One (One task, one dirty) @@ -180,11 +180,11 @@ public: for(auto& task : dirtyTasks) { - uUNIT_ASSERT_EQUAL(0, task->registerDepTasks(allTasks)); + uASSERT_EQUAL(0, task->registerDepTasks(allTasks)); } - uUNIT_ASSERT_EQUAL(task1, getNextTask(allTasks, dirtyTasks)); - uUNIT_ASSERT_EQUAL(0u, dirtyTasks.size()); + uASSERT_EQUAL(task1, getNextTask(allTasks, dirtyTasks)); + uASSERT_EQUAL(0u, dirtyTasks.size()); } { // One (Two tasks, one dirty) @@ -200,11 +200,11 @@ public: for(auto& task : dirtyTasks) { - uUNIT_ASSERT_EQUAL(0, task->registerDepTasks(allTasks)); + uASSERT_EQUAL(0, task->registerDepTasks(allTasks)); } - uUNIT_ASSERT_EQUAL(task2, getNextTask(allTasks, dirtyTasks)); - uUNIT_ASSERT_EQUAL(0u, dirtyTasks.size()); + uASSERT_EQUAL(task2, getNextTask(allTasks, dirtyTasks)); + uASSERT_EQUAL(0u, dirtyTasks.size()); } { // One (Two tasks, one dirty which depends on the other) @@ -222,11 +222,11 @@ public: for(auto& task : dirtyTasks) { - uUNIT_ASSERT_EQUAL(0, task->registerDepTasks(allTasks)); + uASSERT_EQUAL(0, task->registerDepTasks(allTasks)); } - uUNIT_ASSERT_EQUAL(task2, getNextTask(allTasks, dirtyTasks)); - uUNIT_ASSERT_EQUAL(0u, dirtyTasks.size()); + uASSERT_EQUAL(task2, getNextTask(allTasks, dirtyTasks)); + uASSERT_EQUAL(0u, dirtyTasks.size()); } { // One (Two tasks, Both dirty, one depends on the other) @@ -245,11 +245,11 @@ public: for(auto& task : dirtyTasks) { - uUNIT_ASSERT_EQUAL(0, task->registerDepTasks(allTasks)); + uASSERT_EQUAL(0, task->registerDepTasks(allTasks)); } - uUNIT_ASSERT_EQUAL(task1, getNextTask(allTasks, dirtyTasks)); - uUNIT_ASSERT_EQUAL(1u, dirtyTasks.size()); + uASSERT_EQUAL(task1, getNextTask(allTasks, dirtyTasks)); + uASSERT_EQUAL(1u, dirtyTasks.size()); } } diff --git a/test/tools_test.cc b/test/tools_test.cc index 4000665..3e9de1b 100644 --- a/test/tools_test.cc +++ b/test/tools_test.cc @@ -116,41 +116,41 @@ public: { // host conf_host_cxx = "/usr/bin/g++"; - uUNIT_ASSERT_EQUAL(ToolChain::gcc, getToolChain(OutputSystem::Host)); + uASSERT_EQUAL(ToolChain::gcc, getToolChain(OutputSystem::Host)); conf_host_cxx = "/usr/bin/g++-10"; - uUNIT_ASSERT_EQUAL(ToolChain::gcc, getToolChain(OutputSystem::Host)); + uASSERT_EQUAL(ToolChain::gcc, getToolChain(OutputSystem::Host)); conf_host_cxx = "/usr/bin/x86_64-pc-linux-gnu-g++-9.3.0"; - uUNIT_ASSERT_EQUAL(ToolChain::gcc, getToolChain(OutputSystem::Host)); + uASSERT_EQUAL(ToolChain::gcc, getToolChain(OutputSystem::Host)); conf_host_cxx = "/usr/bin/clang++"; - uUNIT_ASSERT_EQUAL(ToolChain::clang, getToolChain(OutputSystem::Host)); + uASSERT_EQUAL(ToolChain::clang, getToolChain(OutputSystem::Host)); conf_host_cxx = "/usr/bin/clang++-10"; - uUNIT_ASSERT_EQUAL(ToolChain::clang, getToolChain(OutputSystem::Host)); + uASSERT_EQUAL(ToolChain::clang, getToolChain(OutputSystem::Host)); conf_host_cxx = "/usr/lib/llvm/12/bin/i686-pc-linux-gnu-clang++-12"; - uUNIT_ASSERT_EQUAL(ToolChain::clang, getToolChain(OutputSystem::Host)); + uASSERT_EQUAL(ToolChain::clang, getToolChain(OutputSystem::Host)); // build conf_build_cxx = "/usr/bin/g++"; - uUNIT_ASSERT_EQUAL(ToolChain::gcc, getToolChain(OutputSystem::Build)); + uASSERT_EQUAL(ToolChain::gcc, getToolChain(OutputSystem::Build)); conf_build_cxx = "/usr/bin/g++-10"; - uUNIT_ASSERT_EQUAL(ToolChain::gcc, getToolChain(OutputSystem::Build)); + uASSERT_EQUAL(ToolChain::gcc, getToolChain(OutputSystem::Build)); conf_build_cxx = "/usr/bin/x86_64-pc-linux-gnu-g++-9.3.0"; - uUNIT_ASSERT_EQUAL(ToolChain::gcc, getToolChain(OutputSystem::Build)); + uASSERT_EQUAL(ToolChain::gcc, getToolChain(OutputSystem::Build)); conf_build_cxx = "/usr/bin/clang++"; - uUNIT_ASSERT_EQUAL(ToolChain::clang, getToolChain(OutputSystem::Build)); + uASSERT_EQUAL(ToolChain::clang, getToolChain(OutputSystem::Build)); conf_build_cxx = "/usr/bin/clang++-10"; - uUNIT_ASSERT_EQUAL(ToolChain::clang, getToolChain(OutputSystem::Build)); + uASSERT_EQUAL(ToolChain::clang, getToolChain(OutputSystem::Build)); conf_build_cxx = "/usr/lib/llvm/12/bin/i686-pc-linux-gnu-clang++-12"; - uUNIT_ASSERT_EQUAL(ToolChain::clang, getToolChain(OutputSystem::Build)); + uASSERT_EQUAL(ToolChain::clang, getToolChain(OutputSystem::Build)); } void getOption_toolchain_test() |