summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2021-09-18 15:54:34 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2021-09-20 21:18:39 +0200
commiteb7c9f97959e4c074698eea72b7da20d25f19faa (patch)
tree2503b089bfc793685e6d972e49fded9699ba7648
parentecfc610acff6a9359ae5e7f0b225c5b26b189591 (diff)
Initial support for compiling with msvc/cl.exe on windows.
-rw-r--r--bootstrap.bat12
-rw-r--r--src/configure.cc14
-rw-r--r--src/execute.cc47
-rw-r--r--src/rebuild.h4
-rw-r--r--src/task.cc2
-rw-r--r--src/tasks.h7
6 files changed, 73 insertions, 13 deletions
diff --git a/bootstrap.bat b/bootstrap.bat
new file mode 100644
index 0000000..f394d56
--- /dev/null
+++ b/bootstrap.bat
@@ -0,0 +1,12 @@
+#!/bin/bash
+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..."
+cl.exe /std:c++20 /D_X86_ /EHsc /Isrc /I%BASE%\include /I%UCRT% /I%UM% /I%SHARED% /Iwingetopt/src wingetopt/src/getopt.c src/*.cc ctor.cc /link /LIBPATH:%UMLIB% /LIBPATH:%ONECORELIB% /LIBPATH:%UCRTLIB% /OUT:ctor.exe
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
{