Problem: no windows UWP support

* add define for windows/UWP

* prevent issue with COM references

* gettickcount not available on uwp

* add compiler definitions

* add convenitnece cmake file

* brute force uwp compilation

* fix compiler version

* cosmetics
This commit is contained in:
bbdb68 2017-04-04 10:50:33 +02:00 committed by Luca Boccassi
parent e224cc9061
commit 1d58a00992
8 changed files with 39 additions and 11 deletions

View File

@ -181,6 +181,10 @@ include (CheckCXXSymbolExists)
check_include_files (ifaddrs.h ZMQ_HAVE_IFADDRS) check_include_files (ifaddrs.h ZMQ_HAVE_IFADDRS)
check_include_files (windows.h ZMQ_HAVE_WINDOWS) check_include_files (windows.h ZMQ_HAVE_WINDOWS)
if( ${CMAKE_SYSTEM_NAME} STREQUAL "WindowsStore" AND ${CMAKE_SYSTEM_VERSION} STREQUAL "10.0")
SET(ZMQ_HAVE_WINDOWS_UWP ON)
ADD_DEFINITIONS(-D_WIN32_WINNT=_WIN32_WINNT_WIN10)
endif()
check_include_files (sys/uio.h ZMQ_HAVE_UIO) check_include_files (sys/uio.h ZMQ_HAVE_UIO)
check_include_files (sys/eventfd.h ZMQ_HAVE_EVENTFD) check_include_files (sys/eventfd.h ZMQ_HAVE_EVENTFD)
if (ZMQ_HAVE_EVENTFD) if (ZMQ_HAVE_EVENTFD)

View File

@ -41,6 +41,12 @@ Windows Builds
For Windows building, see the libzmq\builds\msvc\readme.txt file. For Windows building, see the libzmq\builds\msvc\readme.txt file.
The library can also be built for the Windows 10 UWP platform through CMake :
cmake -H. -B<build dir> -G"Visual Studio 14 2015 Win64" \
-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0 \
-DENABLE_CURVE=OFF -DZMQ_BUILD_TESTS=OFF
Basic Installation Basic Installation
================== ==================

View File

@ -94,5 +94,6 @@
#endif #endif
#cmakedefine ZMQ_HAVE_WINDOWS #cmakedefine ZMQ_HAVE_WINDOWS
#cmakedefine ZMQ_HAVE_WINDOWS_UWP
#endif #endif

View File

@ -84,6 +84,10 @@ static zmq::mutex_t compatible_get_tick_count64_mutex;
ULONGLONG compatible_get_tick_count64() ULONGLONG compatible_get_tick_count64()
{ {
#ifdef ZMQ_HAVE_WINDOWS_UWP
const ULONGLONG result = ::GetTickCount64();
return result;
#else
zmq::scoped_lock_t locker(compatible_get_tick_count64_mutex); zmq::scoped_lock_t locker(compatible_get_tick_count64_mutex);
static DWORD s_wrap = 0; static DWORD s_wrap = 0;
@ -97,19 +101,24 @@ ULONGLONG compatible_get_tick_count64()
const ULONGLONG result = (static_cast<ULONGLONG>(s_wrap) << 32) + static_cast<ULONGLONG>(current_tick); const ULONGLONG result = (static_cast<ULONGLONG>(s_wrap) << 32) + static_cast<ULONGLONG>(current_tick);
return result; return result;
#endif
} }
f_compatible_get_tick_count64 init_compatible_get_tick_count64() f_compatible_get_tick_count64 init_compatible_get_tick_count64()
{ {
f_compatible_get_tick_count64 func = NULL; f_compatible_get_tick_count64 func = NULL;
#if !defined ZMQ_HAVE_WINDOWS_UWP
HMODULE module = ::LoadLibraryA("Kernel32.dll"); HMODULE module = ::LoadLibraryA("Kernel32.dll");
if (module != NULL) if (module != NULL)
func = reinterpret_cast<f_compatible_get_tick_count64>(::GetProcAddress(module, "GetTickCount64")); func = reinterpret_cast<f_compatible_get_tick_count64>(::GetProcAddress(module, "GetTickCount64"));
#endif
if (func == NULL) if (func == NULL)
func = compatible_get_tick_count64; func = compatible_get_tick_count64;
#if !defined ZMQ_HAVE_WINDOWS_UWP
::FreeLibrary(module); ::FreeLibrary(module);
#endif
return func; return func;
} }

View File

@ -405,7 +405,7 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
} }
#elif defined ZMQ_HAVE_WINDOWS #elif defined ZMQ_HAVE_WINDOWS
# if !defined _WIN32_WCE # if !defined _WIN32_WCE && !defined ZMQ_HAVE_WINDOWS_UWP
// Windows CE does not manage security attributes // Windows CE does not manage security attributes
SECURITY_DESCRIPTOR sd; SECURITY_DESCRIPTOR sd;
SECURITY_ATTRIBUTES sa; SECURITY_ATTRIBUTES sa;
@ -434,7 +434,7 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
int event_signaler_port = 5905; int event_signaler_port = 5905;
if (signaler_port == event_signaler_port) { if (signaler_port == event_signaler_port) {
# if !defined _WIN32_WCE # if !defined _WIN32_WCE && !defined ZMQ_HAVE_WINDOWS_UWP
sync = CreateEventW (&sa, FALSE, TRUE, L"Global\\zmq-signaler-port-sync"); sync = CreateEventW (&sa, FALSE, TRUE, L"Global\\zmq-signaler-port-sync");
# else # else
sync = CreateEventW (NULL, FALSE, TRUE, L"Global\\zmq-signaler-port-sync"); sync = CreateEventW (NULL, FALSE, TRUE, L"Global\\zmq-signaler-port-sync");
@ -454,7 +454,7 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
swprintf (mutex_name, MAX_PATH, L"Global\\zmq-signaler-port-%d", signaler_port); swprintf (mutex_name, MAX_PATH, L"Global\\zmq-signaler-port-%d", signaler_port);
# endif # endif
# if !defined _WIN32_WCE # if !defined _WIN32_WCE && !defined ZMQ_HAVE_WINDOWS_UWP
sync = CreateMutexW (&sa, FALSE, mutex_name); sync = CreateMutexW (&sa, FALSE, mutex_name);
# else # else
sync = CreateMutexW (NULL, FALSE, mutex_name); sync = CreateMutexW (NULL, FALSE, mutex_name);
@ -575,7 +575,7 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
} }
if (*r_ != INVALID_SOCKET) { if (*r_ != INVALID_SOCKET) {
# if !defined _WIN32_WCE # if !defined _WIN32_WCE && !defined ZMQ_HAVE_WINDOWS_UWP
// On Windows, preventing sockets to be inherited by child processes. // On Windows, preventing sockets to be inherited by child processes.
BOOL brc = SetHandleInformation ((HANDLE) *r_, HANDLE_FLAG_INHERIT, 0); BOOL brc = SetHandleInformation ((HANDLE) *r_, HANDLE_FLAG_INHERIT, 0);
win_assert (brc); win_assert (brc);

View File

@ -240,12 +240,16 @@ int zmq::tcp_address_t::resolve_nic_name (const char *nic_, bool ipv6_, bool is_
#include <netioapi.h> #include <netioapi.h>
int zmq::tcp_address_t::get_interface_name(unsigned long index, char ** dest) const { int zmq::tcp_address_t::get_interface_name(unsigned long index, char ** dest) const {
char * buffer = (char*)malloc(IF_MAX_STRING_SIZE); #ifdef ZMQ_HAVE_WINDOWS_UWP
char * buffer = (char*)malloc(1024);
#else
char * buffer = (char*)malloc(IF_MAX_STRING_SIZE);
#endif
alloc_assert(buffer); alloc_assert(buffer);
char * if_name_result = NULL; char * if_name_result = NULL;
#ifndef ZMQ_HAVE_WINDOWS_TARGET_XP #if !defined ZMQ_HAVE_WINDOWS_TARGET_XP && !defined ZMQ_HAVE_WINDOWS_UWP
if_name_result = if_indextoname(index, buffer); if_name_result = if_indextoname(index, buffer);
#endif #endif
@ -613,7 +617,7 @@ int zmq::tcp_address_t::resolve (const char *name_, bool local_, bool ipv6_, boo
std::string if_str = addr_str.substr(pos + 1); std::string if_str = addr_str.substr(pos + 1);
addr_str = addr_str.substr(0, pos); addr_str = addr_str.substr(0, pos);
if (isalpha (if_str.at (0))) if (isalpha (if_str.at (0)))
#if !defined ZMQ_HAVE_WINDOWS_TARGET_XP #if !defined ZMQ_HAVE_WINDOWS_TARGET_XP && !defined ZMQ_HAVE_WINDOWS_UWP
zone_id = if_nametoindex(if_str.c_str()); zone_id = if_nametoindex(if_str.c_str());
#else #else
// The function 'if_nametoindex' is not supported on Windows XP. // The function 'if_nametoindex' is not supported on Windows XP.

View File

@ -189,7 +189,7 @@ int zmq::tcp_listener_t::set_address (const char *addr_)
errno = wsa_error_to_errno (WSAGetLastError ()); errno = wsa_error_to_errno (WSAGetLastError ());
return -1; return -1;
} }
#if !defined _WIN32_WCE #if !defined _WIN32_WCE && !defined ZMQ_HAVE_WINDOWS_UWP
// On Windows, preventing sockets to be inherited by child processes. // On Windows, preventing sockets to be inherited by child processes.
BOOL brc = SetHandleInformation ((HANDLE) s, HANDLE_FLAG_INHERIT, 0); BOOL brc = SetHandleInformation ((HANDLE) s, HANDLE_FLAG_INHERIT, 0);
win_assert (brc); win_assert (brc);
@ -288,7 +288,7 @@ zmq::fd_t zmq::tcp_listener_t::accept ()
last_error == WSAENOBUFS); last_error == WSAENOBUFS);
return retired_fd; return retired_fd;
} }
#if !defined _WIN32_WCE #if !defined _WIN32_WCE && !defined ZMQ_HAVE_WINDOWS_UWP
// On Windows, preventing sockets to be inherited by child processes. // On Windows, preventing sockets to be inherited by child processes.
BOOL brc = SetHandleInformation ((HANDLE) sock, HANDLE_FLAG_INHERIT, 0); BOOL brc = SetHandleInformation ((HANDLE) sock, HANDLE_FLAG_INHERIT, 0);
win_assert (brc); win_assert (brc);

View File

@ -39,10 +39,14 @@
// Set target version to Windows Server 2008, Windows Vista or higher. // Set target version to Windows Server 2008, Windows Vista or higher.
// Windows XP (0x0501) is supported but without client & server socket types. // Windows XP (0x0501) is supported but without client & server socket types.
#ifndef _WIN32_WINNT #if !defined _WIN32_WINNT && !defined ZMQ_HAVE_WINDOWS_UWP
#define _WIN32_WINNT 0x0600 #define _WIN32_WINNT 0x0600
#endif #endif
#if defined ZMQ_HAVE_WINDOWS_UWP
#define _WIN32_WINNT _WIN32_WINNT_WIN10
#endif
#ifdef __MINGW32__ #ifdef __MINGW32__
// Require Windows XP or higher with MinGW for getaddrinfo(). // Require Windows XP or higher with MinGW for getaddrinfo().
#if(_WIN32_WINNT >= 0x0600) #if(_WIN32_WINNT >= 0x0600)