diff --git a/CMakeLists.txt b/CMakeLists.txt index f0ae6e506..9f87e29f1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,41 @@ set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation direc set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers") +function(install_windows_deps) + # Bootstrap vcpkg from CMake and auto-install deps in case if we are missing + # deps on Windows. Respect the target architecture variable. + set(VCPKG_TARGET_ARCHITECTURE + ${ARCH} + PARENT_SCOPE) + message("Installing build tools and dependencies...") + set(ENV{ARCH} ${ARCH}) + execute_process( + COMMAND ${CMAKE_SOURCE_DIR}/tools/setup-buildtools.cmd) + set(CMAKE_TOOLCHAIN_FILE + ${CMAKE_SOURCE_DIR}/tools/vcpkg/scripts/buildsystems/vcpkg.cmake + PARENT_SCOPE) +endfunction() + +# Autodetect vcpkg toolchain +if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) + set(CMAKE_TOOLCHAIN_FILE + "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" + CACHE STRING "") +endif() + +if(VCPKG_CHAINLOAD_TOOLCHAIN_FILE) + include("${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}") +endif() + +option(INSTALL_WIN32_DEPEDENCIES "Whether to install Windows dependencies using vcpkg" OFF) +if (DEFINED CMAKE_TOOLCHAIN_FILE AND WIN32) + find_package(GTest) + if (INSTALL_WIN32_DEPEDENCIES AND NOT (GTEST_FOUND OR GTest_FOUND)) + install_windows_deps() + endif() + find_package(GTest REQUIRED) +endif() + # Begin Uncomment for i386 build #set(CMAKE_SYSTEM_PROCESSOR i386) #set(CMAKE_C_FLAGS -m32) @@ -259,13 +294,6 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") option(BUILD_APPLE_HTTP "Build Apple HTTP client" YES) endif() -if(BUILD_UNIT_TESTS OR BUILD_FUNC_TESTS) - message("Adding gtest") - add_library(gtest STATIC IMPORTED GLOBAL) - message("Adding gmock") - add_library(gmock STATIC IMPORTED GLOBAL) -endif() - if(BUILD_APPLE_HTTP) add_definitions(-DAPPLE_HTTP=1) endif() @@ -300,7 +328,7 @@ endif() # Packaging ################################################################################################ -if (BUILD_PACKAGE) +if (BUILD_PACKAGE AND (NOT WIN32)) if (${CMAKE_PACKAGE_TYPE} STREQUAL "deb") # FIXME: hardcode it for 64-bit Linux for now set(INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/${CPACK_DEBIAN_ARCHITECTURE}-linux-gnu) diff --git a/docs/building-with-vcpkg-cmake-windows.md b/docs/building-with-vcpkg-cmake-windows.md new file mode 100644 index 000000000..af156a34e --- /dev/null +++ b/docs/building-with-vcpkg-cmake-windows.md @@ -0,0 +1,32 @@ +# Building 1DS C++ SDK with cmake on Windows + +### Pre-requisite: + + - VS 2017/2019 + - Chocolatey Package Manager + - CMake 3.1.0 or higher + +### Steps: + +1. Clone the repo + +PS C:\> git clone https://github.com/microsoft/cpp_client_telemetry.git + + +2. Fetch the submodules (specifically the vcpkg port): + +PS C:\cpp_client_telemetry> git submodule update --init + +3. Create CMake configuration + +PS C:\cpp_client_telemetry> mkdir build +PS C:\cpp_client_telemetry> cd build +PS C:\cpp_client_telemetry\build> cmake -DCMAKE_TOOLCHAIN_FILE=..\tools\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows .. + +4. Run CMake build + +PS C:\cpp_client_telemetry\build> cmake --build . + +This should build the 1DS C++ library, along with the functional and unit tests in `build` folder + + diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 1055d8ec1..b53a7a9e1 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -173,7 +173,14 @@ if(PAL_IMPLEMENTATION STREQUAL "CPP11") elseif(PAL_IMPLEMENTATION STREQUAL "WIN32") # Win32 Desktop for now. # TODO: define a separate PAL for Win10 cmake build -include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../zlib ${CMAKE_CURRENT_SOURCE_DIR}/../sqlite) +if (CMAKE_TOOLCHAIN_FILE) + find_package(SQLite3 REQUIRED) + find_package(ZLIB REQUIRED) + include_directories( ${ZLIB_INCLUDE_DIRS}) + include_directories(${SQLite3_INCLUDE_DIRS}) +else() + include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../zlib ${CMAKE_CURRENT_SOURCE_DIR}/../sqlite) +endif() add_definitions(-D_UNICODE -DUNICODE -DZLIB_WINAPI -DWIN32 -DMATSDK_PLATFORM_WINDOWS=1 -DMATSDK_SHARED_LIB=1 -D_UTC_SDK -D_CRT_SECURE_NO_WARNINGS -DUSE_BOND -D_WINDOWS -D_USRDLL -DWINVER=_WIN32_WINNT_WIN7) remove_definitions(-D_MBCS) list(APPEND SRCS diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a1d0a1351..7b7116d1c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,9 +1,5 @@ include_directories(. ${CMAKE_CURRENT_SOURCE_DIR}/../lib/include/public ${CMAKE_CURRENT_SOURCE_DIR}/../lib/include/mat ${CMAKE_CURRENT_SOURCE_DIR}/../lib/decoder ${CMAKE_CURRENT_SOURCE_DIR}/../sqlite ) - -include_directories( - ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/googletest/googletest/include - ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/googletest/googlemock/include -) +message("-->Lalit tests") include_directories(../lib) @@ -14,10 +10,49 @@ set(TESTS_COMMON_SRCS ../../lib/decoder/PayloadDecoder.cpp ) +if (BUILD_FUNC_TESTS OR BUILD_UNIT_TEST) + if (WIN32 AND CMAKE_TOOLCHAIN_FILE) + find_package(gtest REQUIRED) + find_package(SQLite3 REQUIRED) + find_package(ZLIB REQUIRED) + + # GMOCK is not included as part of GTEST package installed through vcpkg, + # so needs to be configured separately + find_library(GOOGLE_MOCK gmock REQUIRED) + find_library(GOOGLE_MOCK_MAIN gmock_main REQUIRED) + find_library(GOOGLE_MOCKD gmockd REQUIRED) + find_library(GOOGLE_MOCK_MAIND gmock_maind REQUIRED) + + # GMOCK doesn't work with static linking. + add_definitions(-DGTEST_LINKED_AS_SHARED_LIBRARY) + + message("GTEST_INCLUDE_DIRS = ${GTEST_INCLUDE_DIRS}") + message("GTEST_BOTH_LIBRARIES = ${GTEST_BOTH_LIBRARIES}") + message("GOOGLE_MOCK = ${GOOGLE_MOCK} ${GOOGLE_MOCK_MAIN}") + message("SQLite3_LIBRARIES = ${SQLite3_LIBRARIES} ${SQLite3_INCLUDE_DIRS}") + message("ZLIB_LIBRARIES = ${ZLIB_LIBRARIES}") + + #Include headers to be used both for unit and functional tests + include_directories( ${GTEST_INCLUDE_DIRS} ) + include_directories( ${GMOCK_INCLUDE_DIRS} ) + include_directories( ${ZLIB_INCLUDE_DIRS} ) + include_directories(${SQLite3_INCLUDE_DIRS} ) + + else() + message("Adding gtest") + add_library(gtest STATIC IMPORTED GLOBAL) + message("Adding gmock") + add_library(gmock STATIC IMPORTED GLOBAL) + include_directories( + ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/googletest/googletest/include + ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/googletest/googlemock/include + ) + endif() +endif() + if(BUILD_FUNC_TESTS) add_subdirectory(functests) endif() - if(BUILD_UNIT_TESTS) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/unittests) add_subdirectory(unittests) diff --git a/tests/functests/CMakeLists.txt b/tests/functests/CMakeLists.txt index ba0e524e7..869934645 100644 --- a/tests/functests/CMakeLists.txt +++ b/tests/functests/CMakeLists.txt @@ -46,24 +46,36 @@ else() endif() if(PAL_IMPLEMENTATION STREQUAL "WIN32") - # Link against prebuilt libraries on Windows - message("--- WIN32: Linking against prebuilt libraries") - message("--- WIN32: ... ${CMAKE_BINARY_DIR}/gtest") - message("--- WIN32: ... ${CMAKE_BINARY_DIR}/gmock") - message("--- WIN32: ... ${CMAKE_BINARY_DIR}/zlib") - message("--- WIN32: ... ${CMAKE_BINARY_DIR}/sqlite") - # link_directories(${CMAKE_BINARY_DIR}/gtest/ ${CMAKE_BINARY_DIR}/gmock/ ${CMAKE_BINARY_DIR}/zlib/ ${CMAKE_BINARY_DIR}/sqlite/) - include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../zlib ) - target_link_libraries(FuncTests - mat - wininet.lib - ${CMAKE_BINARY_DIR}/gtest/gtest.lib - ${CMAKE_BINARY_DIR}/gmock/gmock.lib - ${CMAKE_BINARY_DIR}/zlib/zlib.lib - ${CMAKE_BINARY_DIR}/sqlite/sqlite.lib - ) + if (NOT CMAKE_TOOLCHAIN_FILE) + # Link against prebuilt libraries on Windows + message("--- WIN32: Linking against prebuilt libraries") + message("--- WIN32: ... ${CMAKE_BINARY_DIR}/gtest") + message("--- WIN32: ... ${CMAKE_BINARY_DIR}/gmock") + message("--- WIN32: ... ${CMAKE_BINARY_DIR}/zlib") + message("--- WIN32: ... ${CMAKE_BINARY_DIR}/sqlite") + # link_directories(${CMAKE_BINARY_DIR}/gtest/ ${CMAKE_BINARY_DIR}/gmock/ ${CMAKE_BINARY_DIR}/zlib/ ${CMAKE_BINARY_DIR}/sqlite/) + include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../zlib ) + target_link_libraries(FuncTests + mat + wininet.lib + ${CMAKE_BINARY_DIR}/gtest/gtest.lib + ${CMAKE_BINARY_DIR}/gmock/gmock.lib + ${CMAKE_BINARY_DIR}/zlib/zlib.lib + ${CMAKE_BINARY_DIR}/sqlite/sqlite.lib + ) + else() + target_link_libraries(FuncTests + mat + wininet.lib + crypt32.lib + ${GTEST_BOTH_LIBRARIES} + ${GOOGLE_MOCK} ${GOOGLE_MOCKD} + ${GOOGLE_MOCK_MAIN} ${GOOGLE_MOCK_MAIND} + ${SQLite3_LIBRARIES} + ${ZLIB_LIBRARIES} + ) + endif() else() - # Prefer linking to more recent local sqlite3 if(EXISTS "/usr/local/lib/libsqlite3.a") set (SQLITE3_LIB "/usr/local/lib/libsqlite3.a") diff --git a/tests/unittests/CMakeLists.txt b/tests/unittests/CMakeLists.txt index 37a7ed388..258db9206 100644 --- a/tests/unittests/CMakeLists.txt +++ b/tests/unittests/CMakeLists.txt @@ -48,7 +48,9 @@ set(SRCS ZlibUtilsTests.cpp ) -set_source_files_properties(${SRCS} PROPERTIES COMPILE_FLAGS -Wno-deprecated-declarations) +if (NOT WIN32) + set_source_files_properties(${SRCS} PROPERTIES COMPILE_FLAGS -Wno-deprecated-declarations) +endif() if (APPLE) if (BUILD_IOS) @@ -90,22 +92,35 @@ else() endif() if(PAL_IMPLEMENTATION STREQUAL "WIN32") - # Link against prebuilt libraries on Windows - message("--- WIN32: Linking against prebuilt libraries") - message("--- WIN32: ... ${CMAKE_BINARY_DIR}/gtest") - message("--- WIN32: ... ${CMAKE_BINARY_DIR}/gmock") - message("--- WIN32: ... ${CMAKE_BINARY_DIR}/zlib") - message("--- WIN32: ... ${CMAKE_BINARY_DIR}/sqlite") - # link_directories(${CMAKE_BINARY_DIR}/gtest/ ${CMAKE_BINARY_DIR}/gmock/ ${CMAKE_BINARY_DIR}/zlib/ ${CMAKE_BINARY_DIR}/sqlite/) - include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../zlib ) - target_link_libraries(UnitTests - mat - wininet.lib - ${CMAKE_BINARY_DIR}/gtest/gtest.lib - ${CMAKE_BINARY_DIR}/gmock/gmock.lib - ${CMAKE_BINARY_DIR}/zlib/zlib.lib - ${CMAKE_BINARY_DIR}/sqlite/sqlite.lib - ) + if (NOT CMAKE_TOOLCHAIN_FILE) + # Link against prebuilt libraries on Windows + message("--- WIN32: Linking against prebuilt libraries") + message("--- WIN32: ... ${CMAKE_BINARY_DIR}/gtest") + message("--- WIN32: ... ${CMAKE_BINARY_DIR}/gmock") + message("--- WIN32: ... ${CMAKE_BINARY_DIR}/zlib") + message("--- WIN32: ... ${CMAKE_BINARY_DIR}/sqlite") + # link_directories(${CMAKE_BINARY_DIR}/gtest/ ${CMAKE_BINARY_DIR}/gmock/ ${CMAKE_BINARY_DIR}/zlib/ ${CMAKE_BINARY_DIR}/sqlite/) + include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../zlib ) + target_link_libraries(UnitTests + mat + wininet.lib + ${CMAKE_BINARY_DIR}/gtest/gtest.lib + ${CMAKE_BINARY_DIR}/gmock/gmock.lib + ${CMAKE_BINARY_DIR}/zlib/zlib.lib + ${CMAKE_BINARY_DIR}/sqlite/sqlite.lib + ) + else() + target_link_libraries(UnitTests + mat + wininet.lib + crypt32.lib + ${GTEST_BOTH_LIBRARIES} + ${GOOGLE_MOCK} ${GOOGLE_MOCKD} + ${GOOGLE_MOCK_MAIN} ${GOOGLE_MOCK_MAIND} + ${SQLite3_LIBRARIES} + ${ZLIB_LIBRARIES} + ) + endif() else() # Prefer linking to more recent local sqlite3 diff --git a/tests/unittests/EventPropertiesTests.cpp b/tests/unittests/EventPropertiesTests.cpp index d2867340b..09b70d940 100644 --- a/tests/unittests/EventPropertiesTests.cpp +++ b/tests/unittests/EventPropertiesTests.cpp @@ -19,7 +19,7 @@ TEST(EventPropertiesTests, Construction) EXPECT_THAT(ep.GetProperties(), SizeIs(1)); EXPECT_THAT(ep.GetPiiProperties(), IsEmpty()); EXPECT_TRUE(std::get<0>(ep.TryGetLevel())); - EXPECT_THAT(std::get<1>(ep.TryGetLevel()), DIAG_LEVEL_OPTIONAL); + EXPECT_THAT(std::get<1>(ep.TryGetLevel()), (uint8_t)DIAG_LEVEL_OPTIONAL); } TEST(EventPropertiesTests, Name) @@ -45,21 +45,21 @@ TEST(EventPropertiesTests, DiagnosticLevel) EventProperties epOptional("Optional", DIAG_LEVEL_OPTIONAL); EXPECT_THAT(epOptional.GetName(), Eq("Optional")); EXPECT_TRUE(std::get<0>(epOptional.TryGetLevel())); - EXPECT_THAT(std::get<1>(epOptional.TryGetLevel()), DIAG_LEVEL_OPTIONAL); + EXPECT_THAT(std::get<1>(epOptional.TryGetLevel()), (uint8_t)DIAG_LEVEL_OPTIONAL); epOptional.SetLevel(DIAG_LEVEL_REQUIRED); EXPECT_TRUE(std::get<0>(epOptional.TryGetLevel())); - EXPECT_THAT(std::get<1>(epOptional.TryGetLevel()), DIAG_LEVEL_REQUIRED); + EXPECT_THAT(std::get<1>(epOptional.TryGetLevel()), (uint8_t)DIAG_LEVEL_REQUIRED); EventProperties epRequired("Required", DIAG_LEVEL_REQUIRED); EXPECT_THAT(epRequired.GetName(), Eq("Required")); EXPECT_TRUE(std::get<0>(epRequired.TryGetLevel())); - EXPECT_THAT(std::get<1>(epRequired.TryGetLevel()), DIAG_LEVEL_REQUIRED); + EXPECT_THAT(std::get<1>(epRequired.TryGetLevel()), (uint8_t)DIAG_LEVEL_REQUIRED); EventProperties epCustom("Custom", 55); EXPECT_THAT(epCustom.GetName(), Eq("Custom")); EXPECT_TRUE(std::get<0>(epCustom.TryGetLevel())); - EXPECT_THAT(std::get<1>(epCustom.TryGetLevel()), 55); + EXPECT_THAT(std::get<1>(epCustom.TryGetLevel()), (uint8_t)55); } TEST(EventPropertiesTests, Timestamp) @@ -203,7 +203,7 @@ TEST(EventPropertiesTests, TryGetLevel_NotTheRightType_ReturnsFalseAndZero) properties.SetProperty(COMMONFIELDS_EVENT_LEVEL, "Not a number"); auto result = properties.TryGetLevel(); EXPECT_FALSE(std::get<0>(result)); - EXPECT_EQ(std::get<1>(result), 0); + EXPECT_EQ(std::get<1>(result), (uint8_t)0); } TEST(EventPropertiesTests, TryGetLevel_ValueLargerThanUint8_ReturnsFalseAndZero) @@ -212,7 +212,7 @@ TEST(EventPropertiesTests, TryGetLevel_ValueLargerThanUint8_ReturnsFalseAndZero) properties.SetProperty(COMMONFIELDS_EVENT_LEVEL, 257); auto result = properties.TryGetLevel(); EXPECT_FALSE(std::get<0>(result)); - EXPECT_EQ(std::get<1>(result), 0); + EXPECT_EQ(std::get<1>(result), (uint8_t)0); } TEST(EventPropertiesTests, TryGetLevel_ValueLessThanZero_ReturnsFalseAndZero) @@ -221,7 +221,7 @@ TEST(EventPropertiesTests, TryGetLevel_ValueLessThanZero_ReturnsFalseAndZero) properties.SetProperty(COMMONFIELDS_EVENT_LEVEL, -1); auto result = properties.TryGetLevel(); EXPECT_FALSE(std::get<0>(result)); - EXPECT_EQ(std::get<1>(result), 0); + EXPECT_EQ(std::get<1>(result), (uint8_t)0); } TEST(EventPropertiesTests, TryGetLevel_ValidValue_ReturnsTrueAndCorrectValue) @@ -230,7 +230,7 @@ TEST(EventPropertiesTests, TryGetLevel_ValidValue_ReturnsTrueAndCorrectValue) properties.SetProperty(COMMONFIELDS_EVENT_LEVEL, 42); auto result = properties.TryGetLevel(); EXPECT_TRUE(std::get<0>(result)); - EXPECT_EQ(std::get<1>(result), 42); + EXPECT_EQ(std::get<1>(result), (uint8_t)42); } TEST(EventPropertiesTests, TryGetLevel_ValueSetBySetLevel_ReturnsTrueAndCorrectValue) @@ -239,5 +239,5 @@ TEST(EventPropertiesTests, TryGetLevel_ValueSetBySetLevel_ReturnsTrueAndCorrectV properties.SetLevel(42); auto result = properties.TryGetLevel(); EXPECT_TRUE(std::get<0>(result)); - EXPECT_EQ(std::get<1>(result), 42); + EXPECT_EQ(std::get<1>(result), (uint8_t)42); } diff --git a/tests/unittests/OfflineStorageTests_Room.cpp b/tests/unittests/OfflineStorageTests_Room.cpp index 5e26154fe..342dc9799 100644 --- a/tests/unittests/OfflineStorageTests_Room.cpp +++ b/tests/unittests/OfflineStorageTests_Room.cpp @@ -202,7 +202,7 @@ TEST_P(OfflineStorageTestsRoom, TestBadFile) } badStorage->Initialize(observerMock); std::atomic found(0); - EXPECT_FALSE(badStorage->GetAndReserveRecords( [&found](StorageRecord && record)->bool { + EXPECT_FALSE(badStorage->GetAndReserveRecords( [&found](StorageRecord && /*record*/)->bool { found += 1; return true; }, 5)); @@ -500,7 +500,7 @@ TEST_P(OfflineStorageTestsRoom, ReleaseActuallyReleases) { ); offlineStorage->StoreRecord(r); offlineStorage->GetAndReserveRecords( - [](StorageRecord && record)->bool + [](StorageRecord && /*record*/)->bool { return false; }, @@ -518,7 +518,7 @@ TEST_P(OfflineStorageTestsRoom, ReleaseActuallyReleases) { EXPECT_EQ(unsigned { 1 }, offlineStorage->LastReadRecordCount()); EXPECT_EQ(size_t { 1 }, records.size()); offlineStorage->GetAndReserveRecords( - [] (StorageRecord && record)->bool + [] (StorageRecord && /*record*/)->bool { ADD_FAILURE(); return false; @@ -592,7 +592,8 @@ TEST_P(OfflineStorageTestsRoom, StoreManyRecords) StorageBlob masterBlob; masterBlob.reserve(blobSize); while (masterBlob.size() < blobSize) { - masterBlob.push_back(randomByte(gen)); + auto random_byte = randomByte(gen); + masterBlob.push_back((uint8_t)random_byte); } size_t blocks = 0; StorageRecordVector records; diff --git a/tools/setup-buildtools.cmd b/tools/setup-buildtools.cmd index 5c4705a15..6e9953fe0 100644 --- a/tools/setup-buildtools.cmd +++ b/tools/setup-buildtools.cmd @@ -17,7 +17,11 @@ if ERRORLEVEL 0 ( ) REM Install tools needed to build SDK with either Visual Studio or CMake -choco install -y cmake svn git llvm zip +where /Q vswhere || choco install -y vswhere +where /Q cmake || choco install -y cmake +where /Q git || choco install -y git +where /Q llvm || choco install -y llvm +where /Q zip || choco install -y zip REM Try to autodetect Visual Studio call "%~dp0\vcvars.cmd" @@ -55,6 +59,8 @@ REM Install it vcpkg install gtest:x64-windows vcpkg install --overlay-ports=%~dp0\ports benchmark:x64-windows vcpkg install ms-gsl:x64-windows +vcpkg install zlib:x64-windows +vcpkg install sqlite3:x64-windows if DEFINED INSTALL_LLVM ( REM Required for LLVM Clang build on Windows