diff --git a/CMakeLists.txt b/CMakeLists.txt index 740d4b51..105feaf4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,7 +48,9 @@ endif(APPLE) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") +if(NOT WIN32) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") +endif(NOT WIN32) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g -DDEBUG") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os -DRELEASE") diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..00f7dadc --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,26 @@ +# can use variables like {build} and {branch} +version: 1.0.{build} + +image: Visual Studio 2015 + +environment: + BUILD_DIR: "%APPVEYOR_BUILD_FOLDER%\\build" + +platform: + - Win32 + - x64 + +configuration: + - Release + +before_build: + - deps.bat + - cd %BUILD_DIR% + - cmake .. -G"%CMAKE_GENERATOR_NAME%" + +build: + parallel: true + project: build/uvw.sln + verbosity: minimal + +test_script: "%APPVEYOR_BUILD_FOLDER%\\runtests.bat" diff --git a/cmake/modules/FindGoogleTest.cmake b/cmake/modules/FindGoogleTest.cmake index 95971bf5..b122fbed 100644 --- a/cmake/modules/FindGoogleTest.cmake +++ b/cmake/modules/FindGoogleTest.cmake @@ -30,24 +30,28 @@ find_path( find_library( GOOGLETEST_LIBRARY NAMES gtest PATHS ${BUILD_DEPS_DIR}/${GOOGLETEST_DEPS_DIR}/build/googlemock/gtest/ + PATH_SUFFIXES Release NO_DEFAULT_PATH ) find_library( GOOGLETEST_MAIN_LIBRARY NAMES gtest_main PATHS ${BUILD_DEPS_DIR}/${GOOGLETEST_DEPS_DIR}/build/googlemock/gtest/ + PATH_SUFFIXES Release NO_DEFAULT_PATH ) find_library( GOOGLEMOCK_LIBRARY NAMES gmock PATHS ${BUILD_DEPS_DIR}/${GOOGLETEST_DEPS_DIR}/build/googlemock/ + PATH_SUFFIXES Release NO_DEFAULT_PATH ) find_library( GOOGLEMOCK_MAIN_LIBRARY NAMES gmock_main PATHS ${BUILD_DEPS_DIR}/${GOOGLETEST_DEPS_DIR}/build/googlemock/ + PATH_SUFFIXES Release NO_DEFAULT_PATH ) diff --git a/cmake/modules/FindUV.cmake b/cmake/modules/FindUV.cmake index eb780522..c72bca5c 100644 --- a/cmake/modules/FindUV.cmake +++ b/cmake/modules/FindUV.cmake @@ -22,14 +22,16 @@ find_path( ) find_library( - UV_STATIC_LIBRARY NAMES libuv.a - PATHS ${BUILD_DEPS_DIR}/${UV_DEPS_DIR}/.libs/ + UV_STATIC_LIBRARY NAMES libuv.a libuv + PATHS ${BUILD_DEPS_DIR}/${UV_DEPS_DIR} + PATH_SUFFIXES .libs Release NO_DEFAULT_PATH ) find_library( - UV_SHARED_LIBRARY NAMES uv - PATHS ${BUILD_DEPS_DIR}/${UV_DEPS_DIR}/.libs/ + UV_SHARED_LIBRARY NAMES uv libuv + PATHS ${BUILD_DEPS_DIR}/${UV_DEPS_DIR} + PATH_SUFFIXES .libs Release NO_DEFAULT_PATH ) diff --git a/deps.bat b/deps.bat new file mode 100644 index 00000000..6d53eb44 --- /dev/null +++ b/deps.bat @@ -0,0 +1,37 @@ +@echo off + +set SRC_DIR=%~dp0 + +if not defined ARCH set ARCH=x86 +if defined platform if "%platform%"=="x64" set ARCH=x64 + +@rem init/update submodules +cd %SRC_DIR% +git submodule update --init + +@rem compile dependencies + +@rem uv first because vcbuild.bat gives us good things like: +@rem - msbuild in PATH +@rem - variables like config, msbuild_platform + +cd %SRC_DIR%deps\libuv +@rem the arguments to vcbuild make all the difference to further builds +call vcbuild.bat release %ARCH% shared + +if "%msbuild_platform%"=="x64" ( + set CMAKE_GENERATOR_NAME=Visual Studio 14 2015 Win64 +) else ( + set CMAKE_GENERATOR_NAME=Visual Studio 14 2015 +) + +set GTEST_BUILD_DIR=%SRC_DIR%deps\googletest\build +if exist %GTEST_BUILD_DIR%\NUL rd /s /q %GTEST_BUILD_DIR% +md %GTEST_BUILD_DIR% +cd %GTEST_BUILD_DIR% +cmake .. -Dgtest_force_shared_crt=ON -G"%CMAKE_GENERATOR_NAME%" +msbuild googlemock\gmock.sln /p:Configuration=%config% /p:Platform="%msbuild_platform%" /clp:NoSummary;NoItemAndPropertyList;Verbosity=minimal /nologo /m +msbuild googlemock\gtest\gtest.sln /p:Configuration=%config% /p:Platform="%msbuild_platform%" /clp:NoSummary;NoItemAndPropertyList;Verbosity=minimal /nologo /m + +@rem go back home +cd %SRC_DIR% diff --git a/runtests.bat b/runtests.bat new file mode 100644 index 00000000..f65a2400 --- /dev/null +++ b/runtests.bat @@ -0,0 +1,23 @@ +@echo off + +set SRC_DIR=%~dp0 +set BUILD_DIR=%SRC_DIR%build\ +if not defined config set config=Release + +cd %BUILD_DIR% + +if defined APPVEYOR if "%APPVEYOR%" == "True" goto skip-build + +@rem Now to build the tests +cmake .. -G"%CMAKE_GENERATOR_NAME%" +msbuild uvw.sln /p:Configuration=%config% /p:Platform="%msbuild_platform%" /clp:NoSummary;NoItemAndPropertyList;Verbosity=minimal /nologo /m + +:skip-build +@rem one more thing before running the tests, the executables need `libuv.dll` +@rem in the loader path. The easiest is in the same directory. +copy %SRC_DIR%deps\libuv\%config%\libuv.dll %BUILD_DIR%test\bin\%config% + +@rem run the tests now +msbuild RUN_TESTS.vcxproj /p:Configuration=%config% /p:Platform="%msbuild_platform%" /clp:NoSummary;NoItemAndPropertyList;Verbosity=minimal /nologo /m + +cd %SRC_DIR% diff --git a/src/uvw/loop.hpp b/src/uvw/loop.hpp index 6d1a1dda..c1d8e485 100644 --- a/src/uvw/loop.hpp +++ b/src/uvw/loop.hpp @@ -1,5 +1,8 @@ #pragma once +#ifdef _WIN32 +#include +#endif #include #include diff --git a/src/uvw/process.hpp b/src/uvw/process.hpp index bda93fe0..d855abbf 100644 --- a/src/uvw/process.hpp +++ b/src/uvw/process.hpp @@ -28,7 +28,7 @@ enum class UVProcessFlags: std::underlying_type_t { enum class UVStdIOFlags: std::underlying_type_t { - IGNORE = UV_IGNORE, + IGNORE_STREAM = UV_IGNORE, CREATE_PIPE = UV_CREATE_PIPE, INHERIT_FD = UV_INHERIT_FD, INHERIT_STREAM = UV_INHERIT_STREAM, @@ -199,7 +199,7 @@ public: * * Available flags are: * - * * `ProcessHandle::StdIO::IGNORE` + * * `ProcessHandle::StdIO::IGNORE_STREAM` * * `ProcessHandle::StdIO::CREATE_PIPE` * * `ProcessHandle::StdIO::INHERIT_FD` * * `ProcessHandle::StdIO::INHERIT_STREAM` @@ -229,7 +229,7 @@ public: * * Available flags are: * - * * `ProcessHandle::StdIO::IGNORE` + * * `ProcessHandle::StdIO::IGNORE_STREAM` * * `ProcessHandle::StdIO::CREATE_PIPE` * * `ProcessHandle::StdIO::INHERIT_FD` * * `ProcessHandle::StdIO::INHERIT_STREAM` diff --git a/src/uvw/stream.hpp b/src/uvw/stream.hpp index d8a9471e..e6a3db8c 100644 --- a/src/uvw/stream.hpp +++ b/src/uvw/stream.hpp @@ -171,7 +171,13 @@ class StreamHandle: public Handle { } protected: +#ifdef _WIN32 + StreamHandle(std::shared_ptr ref) + : Handle{std::move(ref)} + { } +#else using Handle::Handle; +#endif public: /** diff --git a/src/uvw/udp.hpp b/src/uvw/udp.hpp index 1ebdf351..81b181b4 100644 --- a/src/uvw/udp.hpp +++ b/src/uvw/udp.hpp @@ -246,13 +246,13 @@ public: * * `UDPHandle::Membership::JOIN_GROUP` * * @param multicast Multicast address to set membership for. - * @param interface Interface address. + * @param iface Interface address. * @param membership Action to be performed. * @return True in case of success, false otherwise. */ template - bool multicastMembership(std::string multicast, std::string interface, Membership membership) { - return (0 == uv_udp_set_membership(get(), multicast.data(), interface.data(), static_cast(membership))); + bool multicastMembership(std::string multicast, std::string iface, Membership membership) { + return (0 == uv_udp_set_membership(get(), multicast.data(), iface.data(), static_cast(membership))); } /** @@ -278,12 +278,12 @@ public: /** * @brief Sets the multicast interface to send or receive data on. - * @param interface Interface address. + * @param iface Interface address. * @return True in case of success, false otherwise. */ template - bool multicastInterface(std::string interface) { - return (0 == uv_udp_set_multicast_interface(get(), interface.data())); + bool multicastInterface(std::string iface) { + return (0 == uv_udp_set_multicast_interface(get(), iface.data())); } /** diff --git a/src/uvw/util.hpp b/src/uvw/util.hpp index b63fa46f..67bcdce5 100644 --- a/src/uvw/util.hpp +++ b/src/uvw/util.hpp @@ -11,6 +11,12 @@ #include #include +#ifdef _WIN32 +// MSVC doesn't have C++14 relaxed constexpr support yet. Hence the jugglery. +#define R_CONSTEXPR +#else +#define R_CONSTEXPR constexpr +#endif namespace uvw { @@ -97,12 +103,12 @@ public: ~Flags() noexcept { static_assert(std::is_enum::value, "!"); } - constexpr Flags& operator=(const Flags &f) noexcept { + R_CONSTEXPR Flags& operator=(const Flags &f) noexcept { flags = f.flags; return *this; } - constexpr Flags& operator=(Flags &&f) noexcept { + R_CONSTEXPR Flags& operator=(Flags &&f) noexcept { flags = std::move(f.flags); return *this; } @@ -314,7 +320,7 @@ Addr address(F &&f, const H *handle) noexcept { template std::string path(F &&f, Args... args) noexcept { std::size_t size = DEFAULT_SIZE; - char buf[size]; + char buf[DEFAULT_SIZE]; std::string str{}; auto err = std::forward(f)(args..., buf, &size); @@ -475,13 +481,7 @@ struct Utilities { if(0 == uv_cpu_info(&infos, &count)) { std::for_each(infos, infos+count, [&cpuinfos](const auto &info) { - CPUInfo cpuinfo; - - cpuinfo.model = info.model; - cpuinfo.speed = info.speed; - cpuinfo.times = info.cpu_times; - - cpuinfos.push_back(std::move(cpuinfo)); + cpuinfos.push_back({ info.model, info.speed, info.cpu_times }); }); uv_free_cpu_info(infos, count); @@ -507,21 +507,23 @@ struct Utilities { if(0 == uv_interface_addresses(&ifaces, &count)) { std::for_each(ifaces, ifaces+count, [&interfaces](const auto &iface) { - InterfaceAddress interface; - - interface.name = iface.name; - interface.physical = iface.phys_addr; - interface.internal = iface.is_internal; - if(iface.address.address4.sin_family == AF_INET) { - interface.address = details::address(&iface.address.address4); - interface.netmask = details::address(&iface.netmask.netmask4); + interfaces.push_back({ + iface.name, + iface.phys_addr, + iface.is_internal == 0 ? false : true, + details::address(&iface.address.address4), + details::address(&iface.netmask.netmask4) + }); } else if(iface.address.address4.sin_family == AF_INET6) { - interface.address = details::address(&iface.address.address6); - interface.netmask = details::address(&iface.netmask.netmask6); + interfaces.push_back({ + iface.name, + iface.phys_addr, + iface.is_internal == 0 ? false : true, + details::address(&iface.address.address6), + details::address(&iface.netmask.netmask6) + }); } - - interfaces.push_back(std::move(interface)); }); uv_free_interface_addresses(ifaces, count); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 00699f69..140da7e2 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -22,6 +22,10 @@ if(${LIBRT_FOUND}) list(APPEND COMMON_LINK_LIBS ${LIBRT_LIBRARIES}) endif(${LIBRT_FOUND}) +if(WIN32) + list(APPEND COMMON_LINK_LIBS ws2_32) +endif(WIN32) + add_library(odr OBJECT odr.cpp) target_include_directories(odr PRIVATE ${COMMON_INCLUDE_DIRS})