diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2021-09-18 15:54:34 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2021-09-20 21:18:39 +0200 |
commit | eb7c9f97959e4c074698eea72b7da20d25f19faa (patch) | |
tree | 2503b089bfc793685e6d972e49fded9699ba7648 /src | |
parent | ecfc610acff6a9359ae5e7f0b225c5b26b189591 (diff) |
Initial support for compiling with msvc/cl.exe on windows.
Diffstat (limited to 'src')
-rw-r--r-- | src/configure.cc | 14 | ||||
-rw-r--r-- | src/execute.cc | 47 | ||||
-rw-r--r-- | src/rebuild.h | 4 | ||||
-rw-r--r-- | src/task.cc | 2 | ||||
-rw-r--r-- | src/tasks.h | 7 |
5 files changed, 61 insertions, 13 deletions
diff --git a/src/configure.cc b/src/configure.cc index b3517dc..f796906 100644 --- a/src/configure.cc +++ b/src/configure.cc @@ -6,6 +6,7 @@ #include <iostream> #include <filesystem> #include <fstream> +#include <sstream> #include <getoptpp/getoptpp.hpp> @@ -18,10 +19,23 @@ std::filesystem::path configurationFile("configuration.cc"); std::filesystem::path configHeaderFile("config.h"); const std::map<std::string, std::string> default_configuration{}; + +#if !defined(_WIN32) const std::map<std::string, std::string>& __attribute__((weak)) configuration() { return default_configuration; } +#else +//extern const char * pWeakValue; +//extern const char * pDefaultWeakValue = NULL; +// +//#pragma comment(linker, "/alternatename:_pWeakValue=_pDefaultWeakValue") +const std::map<std::string, std::string>& configuration() +{ + return default_configuration; +} + +#endif bool hasConfiguration(const std::string& key) { diff --git a/src/execute.cc b/src/execute.cc index 610ccdd..df22f61 100644 --- a/src/execute.cc +++ b/src/execute.cc @@ -3,11 +3,16 @@ // See accompanying file LICENSE for details. #include "execute.h" -#include <unistd.h> #include <cstring> +#if !defined(_WIN32) +#include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <spawn.h> +#else +#include <processthreadsapi.h> +#include <synchapi.h> +#endif #include <iostream> /* @@ -18,6 +23,7 @@ https://stackoverflow.com/questions/4259629/what-is-the-difference-between-fork- */ +#if !defined(_WIN32) namespace { int parent_waitpid(pid_t pid) @@ -32,6 +38,7 @@ int parent_waitpid(pid_t pid) return WEXITSTATUS(status); } } // namespace :: +#endif int execute(const std::string& command, const std::vector<std::string>& args, @@ -45,9 +52,9 @@ int execute(const std::string& command, } argv.push_back(nullptr); + std::string cmd; if(verbose) { - std::string cmd; for(const auto& arg : argv) { if(arg == nullptr) @@ -64,27 +71,53 @@ int execute(const std::string& command, std::cout << cmd << "\n"; } +#if !defined(_WIN32) + #if 1 auto pid = vfork(); if(pid == 0) { + // 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 } - auto ret = parent_waitpid(pid); + + return 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(), nullptr)) + (char**)argv.data(), envp)) { return 1; } - auto ret = parent_waitpid(pid); + return parent_waitpid(pid); #else - auto ret = system(cmd.data()); + return system(cmd.data()); #endif - return ret; +#else + 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,0,0,&si,&pi)) + { + return 1; // Could not start process; + } + + // 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 } diff --git a/src/rebuild.h b/src/rebuild.h index 906d089..3679696 100644 --- a/src/rebuild.h +++ b/src/rebuild.h @@ -7,8 +7,8 @@ #include <array> #include "libctor.h" - -class Settings; +#include "settings.h" +//class Settings; struct BuildConfigurationEntry { diff --git a/src/task.cc b/src/task.cc index 1c6c233..69a47d6 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) diff --git a/src/tasks.h b/src/tasks.h index 54591a4..19373ec 100644 --- a/src/tasks.h +++ b/src/tasks.h @@ -9,9 +9,10 @@ #include <deque> #include "task.h" - -class BuildConfiguration; -class Settings; +#include "settings.h" +#include "libctor.h" +//class BuildConfiguration; +//class Settings; struct Target { |