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 | |
| parent | ecfc610acff6a9359ae5e7f0b225c5b26b189591 (diff) | |
Initial support for compiling with msvc/cl.exe on windows.
| -rw-r--r-- | bootstrap.bat | 12 | ||||
| -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 | 
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  {  | 
