changeset 546:469dd784cbd4

First shot at some windows suport I found out that Microsoft is providing development VMs now so that's cool. This just adds initial support for CMake and an untested time_monotonic implementation.
author Louis Opter <louis@opter.org>
date Sat, 01 Apr 2017 20:08:59 -0700
parents 53525e49d67b
children b95ba0caa16b
files add_windows_support.patch series
diffstat 2 files changed, 256 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/add_windows_support.patch	Sat Apr 01 20:08:59 2017 -0700
@@ -0,0 +1,255 @@
+# HG changeset patch
+# Parent  bb7a1425080bc272456650675e5e03896ca21d54
+lightsd: add windows support
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -19,6 +19,12 @@
+ 
+ ### Platform checks ############################################################
+ 
++INCLUDE(CheckFunctionExists)
++INCLUDE(CheckVariableExists)
++INCLUDE(TestBigEndian)
++
++TEST_BIG_ENDIAN(BIG_ENDIAN_SYSTEM)
++
+ # TODO: we need at least 2.0.19-stable because of the logging defines
+ FIND_PACKAGE(Event2 REQUIRED COMPONENTS core)
+ FIND_PACKAGE(Endian REQUIRED)
+@@ -37,16 +43,10 @@
+     INCLUDE(UseLATEX)
+ ENDIF ()
+ 
+-INCLUDE(CheckFunctionExists)
+-INCLUDE(CheckVariableExists)
+-INCLUDE(TestBigEndian)
+-
+ INCLUDE(CompatReallocArray)
+ INCLUDE(CompatSetProctitle)
+ INCLUDE(CompatTimeMonotonic)
+ 
+-TEST_BIG_ENDIAN(BIG_ENDIAN_SYSTEM)
+-
+ ### Global definitions #########################################################
+ 
+ INCLUDE(AddAllSubdirectories)
+@@ -54,11 +54,13 @@
+ 
+ SET(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
+ 
+-SET(CMAKE_C_FLAGS "-pipe ${CMAKE_C_FLAGS}")
+-STRING(STRIP "${CMAKE_C_FLAGS}" CMAKE_C_FLAGS)
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}")
+ STRING(STRIP "${CMAKE_C_FLAGS}" CMAKE_C_FLAGS)
+-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra -Wall -Wstrict-prototypes -std=c99")
++IF (CMAKE_C_COMPILER_ID MATCHES "MSVC")
++    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Wall")
++ELSE ()
++    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra -Wall -Wstrict-prototypes -std=c99 -pipe")
++ENDIF ()
+ SET(CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE} "")
+ 
+ IF (CMAKE_SYSTEM_NAME MATCHES "Linux")
+@@ -74,6 +76,14 @@
+     ADD_DEFINITIONS("-D_DARWIN_C_SOURCE=1")
+ ENDIF ()
+ 
++IF (MSVC)
++    ADD_DEFINITIONS(
++        "-D_CRT_SECURE_NO_WARNINGS"
++        "-DWIN32_LEAN_AND_MEAN"
++        "-DNOMINMAX"
++    )
++ENDIF ()
++
+ ADD_DEFINITIONS(
+     "-DLGTD_BIG_ENDIAN_SYSTEM=${BIG_ENDIAN_SYSTEM}"
+     "-DLGTD_SIZEOF_VOID_P=${CMAKE_SIZEOF_VOID_P}"
+diff --git a/CMakeScripts/FindEndian.cmake b/CMakeScripts/FindEndian.cmake
+--- a/CMakeScripts/FindEndian.cmake
++++ b/CMakeScripts/FindEndian.cmake
+@@ -12,10 +12,16 @@
+     IF (HAVE_ENDIAN_H)
+         MESSAGE(STATUS "Looking for endian.h - found")
+         SET(ENDIAN_H_PATH "using native headers" CACHE INTERNAL "endian.h path")
+-    ELSEIF (EXISTS "${COMPAT_ENDIAN_H}")
++    ELSEIF (EXISTS "${COMPAT_ENDIAN_H}" OR EXISTS "${COMPAT_ENDIAN_H}.in")
+         MESSAGE(STATUS "Looking for endian.h - not found, using built-in compatibility file")
+-        FILE(COPY "${COMPAT_ENDIAN_H}" DESTINATION "${LIGHTSD_BINARY_DIR}/compat/")
+-        SET(ENDIAN_H_PATH "${COMPAT_ENDIAN_H}" CACHE INTERNAL "endian.h path")
++        IF (EXISTS "${COMPAT_ENDIAN_H}")
++            FILE(COPY "${COMPAT_ENDIAN_H}" DESTINATION "${LIGHTSD_BINARY_DIR}/compat/")
++            SET(ENDIAN_H_PATH "${COMPAT_ENDIAN_H}" CACHE INTERNAL "endian.h path")
++        ELSE ()
++            MESSAGE(STATUS "LOUIS BIG_ENDIAN_SYSTEM = \"${BIG_ENDIAN_SYSTEM}\"")
++            CONFIGURE_FILE("${COMPAT_ENDIAN_H}.in" "${LIGHTSD_BINARY_DIR}/compat/endian.h")
++            SET(ENDIAN_H_PATH "${COMPAT_ENDIAN_H}.in" CACHE INTERNAL "endian.h path")
++        ENDIF ()
+     ELSE ()
+         MESSAGE(STATUS "Looking for endian.h - not found")
+     ENDIF ()
+diff --git a/CMakeScripts/FindEvent2.cmake b/CMakeScripts/FindEvent2.cmake
+--- a/CMakeScripts/FindEvent2.cmake
++++ b/CMakeScripts/FindEvent2.cmake
+@@ -1,14 +1,21 @@
+ FIND_PATH(
+     EVENT2_INCLUDE_DIR
+     event2/event.h
+-    # OpenBSD has libevent1 in /usr/lib, always try /usr/local first:
+-    HINTS /usr/local/
++    HINTS
++    /usr/local/ # OpenBSD has libevent1 in /usr/lib, always try /usr/local first
++    $ENV{EVENT2_DIR}/include # Windows...
+ )
+ 
+ FOREACH (COMPONENT ${Event2_FIND_COMPONENTS})
+     STRING(TOUPPER ${COMPONENT} UPPER_COMPONENT)
+     FIND_LIBRARY(
+-        EVENT2_${UPPER_COMPONENT}_LIBRARY event_${COMPONENT} HINTS /usr/local/
++        EVENT2_${UPPER_COMPONENT}_LIBRARY
++        event_${COMPONENT}
++        NAMES
++        libevent_${COMPONENT} # Windows
++        HINTS
++        /usr/local/
++        $ENV{EVENT2_DIR}
+     )
+     IF (EVENT2_${UPPER_COMPONENT}_LIBRARY)
+         SET(Event2_${COMPONENT}_FOUND TRUE)
+diff --git a/compat/Windows/endian.h.in b/compat/Windows/endian.h.in
+new file mode 100644
+--- /dev/null
++++ b/compat/Windows/endian.h.in
+@@ -0,0 +1,35 @@
++#pragma once
++
++#include <stdlib.h>
++
++#if @BIG_ENDIAN_SYSTEM@
++#   define htobe16(x) (x)
++#   define htole16(x) _byteswap_ushort(x)
++#   define be16toh(x) (x)
++#   define le16toh(x) _byteswap_ushort(x)
++
++#   define htobe32(x) (x)
++#   define htole32(x) _byteswap_ulong(x)
++#   define be32toh(x) (x)
++#   define le32toh(x) _byteswap_ulong(x)
++
++#   define htobe64(x) (x)
++#   define htole64(x) _byteswap_uint64(x)
++#   define be64toh(x) (x)
++#   define le64toh(x) _byteswap_uint64(x)
++#else
++#   define htobe16(x) _byteswap_ushort(x)
++#   define htole16(x) (x)
++#   define be16toh(x) _byteswap_ushort(x)
++#   define le16toh(x) (x)
++
++#   define htobe32(x) _byteswap_ulong(x)
++#   define htole32(x) (x)
++#   define be32toh(x) _byteswap_ulong(x)
++#   define le32toh(x) (x)
++
++#   define htobe64(x) _byteswap_uint64(x)
++#   define htole64(x) (x)
++#   define be64toh(x) _byteswap_uint64(x)
++#   define le64toh(x) (x)
++#endif
+diff --git a/compat/Windows/time_monotonic.c b/compat/Windows/time_monotonic.c
+new file mode 100644
+--- /dev/null
++++ b/compat/Windows/time_monotonic.c
+@@ -0,0 +1,63 @@
++// Copyright (c) 2017, Louis Opter <kalessin@kalessin.fr>
++//
++// This file is part of lighstd.
++//
++// lighstd is free software: you can redistribute it and/or modify
++// it under the terms of the GNU General Public License as published by
++// the Free Software Foundation, either version 3 of the License, or
++// (at your option) any later version.
++//
++// lighstd is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++// GNU General Public License for more details.
++//
++// You should have received a copy of the GNU General Public License
++// along with lighstd.  If not, see <http://www.gnu.org/licenses/>.
++
++#include <Windows.h>
++#include <stdbool.h>
++#include <stdlib.h>
++#include <stdio.h>
++#include <stdint.h>
++
++#include "time_monotonic.h"
++
++enum { MSECS_IN_NSEC = 1000000 };
++
++lgtd_time_mono_t
++lgtd_time_monotonic_msecs(void)
++{
++    static LARGE_INTEGER frequency = { .QuadPart = 0 };
++    if (frequency.QuadPart == 0
++        && QueryPerformanceFrequency(&frequency) == false) {
++        LPSTR msg = NULL;
++        DWORD msg_len = FormatMessageA(
++            FORMAT_MESSAGE_ALLOCATE_BUFFER
++            | FORMAT_MESSAGE_FROM_SYSTEM
++            | FORMAT_MESSAGE_IGNORE_INSERTS,
++            NULL,
++            GetLastError(),
++            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
++            // By default the message is stored in the buffer pointed by
++            // lpMsgBuf, but we use FORMAT_MESSAGE_ALLOCATE_BUFFER to have
++            // the buffer allocated for us.
++            // So instead you need to give the function a pointer on your
++            // pointer instead of your buffer and do an ugly cast:
++            (LPSTR)&msg,
++            0,
++            NULL
++        );
++        if (!msg_len) {
++            msg = "unknown error";
++        }
++        fprintf(stderr, "lightsd: QPC timer unavailable: %s.\r\n", msg);
++        exit(1);
++    }
++
++    LARGE_INTEGER time;
++    QueryPerformanceCounter(&time);
++    time.QuadPart = time.QuadPart * MSECS_IN_NSEC;
++    time.QuadPart = time.QuadPart / frequency.QuadPart;
++    return time.QuadPart;
++}
+diff --git a/compat/Windows/time_monotonic.h b/compat/Windows/time_monotonic.h
+new file mode 100644
+--- /dev/null
++++ b/compat/Windows/time_monotonic.h
+@@ -0,0 +1,22 @@
++// Copyright (c) 2017, Louis Opter <kalessin@kalessin.fr>
++//
++// This file is part of lighstd.
++//
++// lighstd is free software: you can redistribute it and/or modify
++// it under the terms of the GNU General Public License as published by
++// the Free Software Foundation, either version 3 of the License, or
++// (at your option) any later version.
++//
++// lighstd is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++// GNU General Public License for more details.
++//
++// You should have received a copy of the GNU General Public License
++// along with lighstd.  If not, see <http://www.gnu.org/licenses/>.
++
++#pragma once
++
++typedef int64_t lgtd_time_mono_t;
++
++lgtd_time_mono_t lgtd_time_monotonic_msecs(void);
--- a/series	Fri Mar 31 15:46:30 2017 -0700
+++ b/series	Sat Apr 01 20:08:59 2017 -0700
@@ -1,5 +1,6 @@
 update_use_latex.cmake
 while42_sf.patch
+add_windows_support.patch
 add_power_transition.patch #+future
 open_gateway_on_any_bulb_response.patch #+future
 make_gateway_write_callbacks_low_priority.patch #+future