Patch thirdy-party libraries to build for WinRT

- Patch enet code.
- Patch OpenSSL code and add shims for unavailable API.
- Add extra definition header for Freetype.
This commit is contained in:
George Marques 2016-09-03 19:41:36 -03:00
parent c9b82498b4
commit 5f5db46e8d
No known key found for this signature in database
GPG key ID: 046BD46A3201E43D
8 changed files with 283 additions and 2 deletions

View file

@ -642,6 +642,7 @@ openssl_sources = [
#env.drivers_sources+=openssl_sources
env.Append(CPPPATH=["#drivers/builtin_openssl2"])
env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/crypto"])
env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/openssl"])
env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/evp"])
@ -650,6 +651,9 @@ env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/modes"])
#env_ssl.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/store"])
env_drivers.Append(CPPFLAGS=["-DOPENSSL_NO_ASM","-DOPENSSL_THREADS","-DL_ENDIAN"])
if "platform" in env and env["platform"] == "winrt":
openssl_sources += ['winrt.cpp']
# Workaround for compilation error with GCC/Clang when -Werror is too greedy (GH-4517)
import os
if not (os.name=="nt" and os.getenv("VSINSTALLDIR")!=None): # not Windows and not MSVC

View file

@ -118,8 +118,10 @@
# ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0400
# endif
#ifndef WINRT_ENABLED
# include <wincrypt.h>
# include <tlhelp32.h>
#endif
/*
* Limit the time spent walking through the heap, processes, threads and
@ -161,7 +163,7 @@ typedef struct tagCURSORINFO {
# define CURSOR_SHOWING 0x00000001
# endif /* CURSOR_SHOWING */
# if !defined(OPENSSL_SYS_WINCE)
# if !defined(OPENSSL_SYS_WINCE) && !defined(WINRT_ENABLED)
typedef BOOL(WINAPI *CRYPTACQUIRECONTEXTW) (HCRYPTPROV *, LPCWSTR, LPCWSTR,
DWORD, DWORD);
typedef BOOL(WINAPI *CRYPTGENRANDOM) (HCRYPTPROV, DWORD, BYTE *);
@ -196,6 +198,7 @@ typedef NET_API_STATUS(NET_API_FUNCTION *NETFREE) (LPBYTE);
# endif /* 1 */
# endif /* !OPENSSL_SYS_WINCE */
#if !defined(WINRT_ENABLED)
int RAND_poll(void)
{
MEMORYSTATUS m;
@ -580,6 +583,8 @@ int RAND_poll(void)
return (1);
}
#endif // WINRT_ENABLED
int RAND_event(UINT iMsg, WPARAM wParam, LPARAM lParam)
{
double add_entropy = 0;
@ -682,7 +687,7 @@ static void readtimer(void)
static void readscreen(void)
{
# if !defined(OPENSSL_SYS_WINCE) && !defined(OPENSSL_SYS_WIN32_CYGWIN)
# if !defined(OPENSSL_SYS_WINCE) && !defined(OPENSSL_SYS_WIN32_CYGWIN) && !defined(WINRT_ENABLED)
HDC hScrDC; /* screen DC */
HBITMAP hBitmap; /* handle for our bitmap */
BITMAP bm; /* bitmap properties */

View file

@ -81,6 +81,9 @@
# include <sys/time.h>
# endif
# endif
#ifdef WINRT_ENABLED
#include <winsock2.h>
#endif
#ifdef __cplusplus
extern "C" {

View file

@ -0,0 +1,155 @@
/* Snippets extracted from https://github.com/Microsoft/openssl/blob/ec7e430e06e4e3ac87c183dee33cb216814cf980/ms/winrt.cpp
* Adapted for Godot definitions
*/
/* winrt.cpp
* Copyright 2014 Microsoft Corporation
* C++/CX Entropy/shims for Windows Phone/Windows Store platform
* written by Alejandro Jimenez Martinez
* (aljim@microsoft.com) for the OpenSSL project 2014.
*/
#include <windows.h>
#if defined(WINAPI_FAMILY)
extern "C"
{
unsigned entropyRT(BYTE *buffer, unsigned len);
void RAND_add(const void *buf,int num,double entropy);
int RAND_poll(void);
}
#endif
unsigned entropyRT(BYTE *buffer, unsigned len)
{
using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::Security::Cryptography;
using namespace Windows::Storage::Streams;
IBuffer ^buf = CryptographicBuffer::GenerateRandom(len);
Array<unsigned char> ^arr;
CryptographicBuffer::CopyToByteArray(buf, &arr);
unsigned arrayLen = arr->Length;
// Make sure not to overflow the copy
arrayLen = (arrayLen > len) ? len : arrayLen;
memcpy(buffer, arr->Data, arrayLen);
return arrayLen;
}
int RAND_poll(void)
{
BYTE buf[60];
unsigned collected = entropyRT(buf , sizeof(buf));
RAND_add(buf, collected, collected);
return 1;
}
#if defined(WINRT_ENABLED)
extern "C"
{
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void* GetModuleHandle(
_In_opt_ LPCTSTR lpModuleName
)
{
return NULL;
}
//no log for phone
int RegisterEventSource(
_In_ LPCTSTR lpUNCServerName,
_In_ LPCTSTR lpSourceName
)
{
return NULL;
}
int ReportEvent(
_In_ HANDLE hEventLog,
_In_ WORD wType,
_In_ WORD wCategory,
_In_ DWORD dwEventID,
_In_ PSID lpUserSid,
_In_ WORD wNumStrings,
_In_ DWORD dwDataSize,
_In_ LPCTSTR *lpStrings,
_In_ LPVOID lpRawData
)
{
return 0;
}
int MessageBox(
_In_opt_ HWND hWnd,
_In_opt_ LPCTSTR lpText,
_In_opt_ LPCTSTR lpCaption,
_In_ UINT uType
)
{
return 0;
}
int __cdecl GetProcessWindowStation(void)
{
return NULL;
}
BOOL __cdecl GetUserObjectInformationW(
_In_ HANDLE hObj,
_In_ int nIndex,
_Out_opt_ PVOID pvInfo,
_In_ DWORD nLength,
_Out_opt_ LPDWORD lpnLengthNeeded
)
{
return 0;
}
int __cdecl GetStdHandle(
_In_ DWORD nStdHandle
)
{
return 0;
}
BOOL DeregisterEventSource(
_Inout_ HANDLE hEventLog
)
{
return 0;
}
char *getenv(
const char *varname
)
{
//hardcoded environmental variables used for the appx testing application for store/phone
if (!strcmp(varname, "OPENSSL_CONF"))
{
return "./openssl.cnf";
}
return 0;
}
int setenv(const char *envname, const char *envval, int overwrite)
{
return -1;
}
int _getch(void)
{
return 0;
}
int _kbhit()
{
return 0;
}
BOOL __cdecl FlushConsoleInputBuffer(
_In_ HANDLE hConsoleInput
)
{
return 0;
}
int winrt_GetTickCount(void)
{
LARGE_INTEGER t;
return(int) (QueryPerformanceCounter(&t) ? t.QuadPart : 0);
}
void *OPENSSL_UplinkTable [26]= {0};
} //extern C
#endif /*defined(WINRT_ENABLED)*/

View file

@ -0,0 +1,64 @@
diff --git a/drivers/builtin_openssl2/crypto/rand/rand_win.c b/drivers/builtin_openssl2/crypto/rand/rand_win.c
index 06670ae..70fd52a 100644
--- a/drivers/builtin_openssl2/crypto/rand/rand_win.c
+++ b/drivers/builtin_openssl2/crypto/rand/rand_win.c
@@ -118,8 +118,10 @@
# ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0400
# endif
+#ifndef WINRT_ENABLED
# include <wincrypt.h>
# include <tlhelp32.h>
+#endif
/*
* Limit the time spent walking through the heap, processes, threads and
@@ -161,7 +163,7 @@ typedef struct tagCURSORINFO {
# define CURSOR_SHOWING 0x00000001
# endif /* CURSOR_SHOWING */
-# if !defined(OPENSSL_SYS_WINCE)
+# if !defined(OPENSSL_SYS_WINCE) && !defined(WINRT_ENABLED)
typedef BOOL(WINAPI *CRYPTACQUIRECONTEXTW) (HCRYPTPROV *, LPCWSTR, LPCWSTR,
DWORD, DWORD);
typedef BOOL(WINAPI *CRYPTGENRANDOM) (HCRYPTPROV, DWORD, BYTE *);
@@ -196,6 +198,7 @@ typedef NET_API_STATUS(NET_API_FUNCTION *NETFREE) (LPBYTE);
# endif /* 1 */
# endif /* !OPENSSL_SYS_WINCE */
+#if !defined(WINRT_ENABLED)
int RAND_poll(void)
{
MEMORYSTATUS m;
@@ -580,6 +583,8 @@ int RAND_poll(void)
return (1);
}
+#endif // WINRT_ENABLED
+
int RAND_event(UINT iMsg, WPARAM wParam, LPARAM lParam)
{
double add_entropy = 0;
@@ -682,7 +687,7 @@ static void readtimer(void)
static void readscreen(void)
{
-# if !defined(OPENSSL_SYS_WINCE) && !defined(OPENSSL_SYS_WIN32_CYGWIN)
+# if !defined(OPENSSL_SYS_WINCE) && !defined(OPENSSL_SYS_WIN32_CYGWIN) && !defined(WINRT_ENABLED)
HDC hScrDC; /* screen DC */
HBITMAP hBitmap; /* handle for our bitmap */
BITMAP bm; /* bitmap properties */
diff --git a/drivers/builtin_openssl2/openssl/dtls1.h b/drivers/builtin_openssl2/openssl/dtls1.h
index 64ad3c8..a58aca2 100644
--- a/drivers/builtin_openssl2/openssl/dtls1.h
+++ b/drivers/builtin_openssl2/openssl/dtls1.h
@@ -81,6 +81,9 @@
# include <sys/time.h>
# endif
# endif
+#ifdef WINRT_ENABLED
+#include <winsock2.h>
+#endif
#ifdef __cplusplus
extern "C" {

View file

@ -48,6 +48,11 @@ ft_sources=[\
if (env["freetype"]=="builtin"):
# Include header for WinRT to fix build issues
if "platform" in env and env["platform"] == "winrt":
env.Append(CCFLAGS=['/FI', '"drivers/freetype/winrtdef.h"'])
# fix for Windows' shell miserably failing on long lines, split in two libraries
half1=[]
half2=[]

View file

@ -0,0 +1,32 @@
/*************************************************************************/
/* winrtdef.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* http://www.godotengine.org */
/*************************************************************************/
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
// "generic" is a reserved keyword in C++/CX code
// this avoids the errors in the variable name from Freetype code
#define generic freetype_generic

View file

@ -28,7 +28,9 @@ enet_initialize (void)
return -1;
}
#ifndef WINRT_ENABLED
timeBeginPeriod (1);
#endif
return 0;
}
@ -36,11 +38,22 @@ enet_initialize (void)
void
enet_deinitialize (void)
{
#ifndef WINRT_ENABLED
timeEndPeriod (1);
#endif
WSACleanup ();
}
#ifdef WINRT_ENABLED
enet_uint32
timeGetTime() {
ULONGLONG ticks = GetTickCount64();
return (enet_uint32)ticks;
}
#endif
enet_uint32
enet_host_random_seed (void)
{