From eb7c9f97959e4c074698eea72b7da20d25f19faa Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sat, 18 Sep 2021 15:54:34 +0200 Subject: Initial support for compiling with msvc/cl.exe on windows. --- src/configure.cc | 14 ++++++++++++++ src/execute.cc | 47 ++++++++++++++++++++++++++++++++++++++++------- src/rebuild.h | 4 ++-- src/task.cc | 2 +- src/tasks.h | 7 ++++--- 5 files changed, 61 insertions(+), 13 deletions(-) (limited to 'src') 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 #include #include +#include #include @@ -18,10 +19,23 @@ std::filesystem::path configurationFile("configuration.cc"); std::filesystem::path configHeaderFile("config.h"); const std::map default_configuration{}; + +#if !defined(_WIN32) const std::map& __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& 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 #include +#if !defined(_WIN32) +#include #include #include #include +#else +#include +#include +#endif #include /* @@ -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& 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 #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 +//#include #include 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 #include "task.h" - -class BuildConfiguration; -class Settings; +#include "settings.h" +#include "libctor.h" +//class BuildConfiguration; +//class Settings; struct Target { -- cgit v1.2.3