From 3d3b51bb98a1c09cc3b908c9cbccda67088a4582 Mon Sep 17 00:00:00 2001 From: Pengfei Date: Sat, 26 Jun 2021 17:26:51 +0800 Subject: [PATCH] Enable C++20 and re-enable MSVC build Also switched to standard-conforming __VA_OPT__ for logging. --- CMakeLists.txt | 16 ++++++++++++---- appveyor.yml | 4 ++-- src/CMakeLists.txt | 4 ++-- src/common/logging/log.h | 3 +-- src/core/inner_fat.h | 3 ++- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5032780..ceae51b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,9 @@ -# CMake 3.8 required for 17 to be a valid value for CXX_STANDARD -cmake_minimum_required(VERSION 3.8) +# CMake 3.12.4 required for 20 to be a valid value for CXX_STANDARD +cmake_minimum_required(VERSION 3.15) +# Add MSVC runtime library selection flags automatically: +cmake_policy(SET CMP0091 OLD) +# Don't override the warning flags in MSVC: +cmake_policy(SET CMP0092 NEW) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules") include(DownloadExternals) include(CMakeDependentOption) @@ -73,8 +77,12 @@ message(STATUS "Target architecture: ${ARCHITECTURE}") # Configure C++ standard # =========================== -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) +if (MSVC) + add_compile_options(/std:c++latest) +else() + set(CMAKE_CXX_STANDARD 20) + set(CMAKE_CXX_STANDARD_REQUIRED ON) +endif() # set up output paths for executable binaries set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) diff --git a/appveyor.yml b/appveyor.yml index 387c80d..e9e4bf0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,7 +10,7 @@ environment: CHERE_INVOKING: 1 matrix: - BUILD_TYPE: mingw - # - BUILD_TYPE: msvc + - BUILD_TYPE: msvc platform: - x64 @@ -37,7 +37,7 @@ before_build: - ps: | if ($env:BUILD_TYPE -eq 'msvc') { # redirect stderr and change the exit code to prevent powershell from cancelling the build if cmake prints a warning - cmd /C 'cmake -G "Visual Studio 16 2019" -DUSE_BUNDLED_QT=OFF -DQt5_DIR=C:\Qt\5.14\msvc2017_64\lib\cmake\qt5 -DWARNINGS_AS_ERRORS=OFF - .. 2>&1 && exit 0' + cmd /C 'cmake -G "Visual Studio 16 2019" -DUSE_BUNDLED_QT=OFF -DQt5_DIR=C:\Qt\5.14\msvc2017_64\lib\cmake\qt5 -DWARNINGS_AS_ERRORS=OFF .. 2>&1 && exit 0' } else { C:\msys64\usr\bin\bash.exe -lc "cmake -G 'MSYS Makefiles' -DCMAKE_BUILD_TYPE=Release -DMINGW_STATIC_BUILD=ON -DCOMPILE_WITH_DWARF=OFF .. 2>&1" } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 00f31f8..7186bd7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -39,7 +39,7 @@ if (MSVC) # /Zc:externConstexpr - Allow extern constexpr variables to have external linkage, like the standard mandates # /Zc:inline - Let codegen omit inline functions in object files # /Zc:throwingNew - Let codegen assume `operator new` (without std::nothrow) will never return null - # /experimental:preprocessor - Work around bugs within MSVC's crappy preprocessor + # /Zc:preprocessor - Use std-conforming MSVC preprocessor add_compile_options( /W4 /w34263 @@ -60,7 +60,7 @@ if (MSVC) /Zc:externConstexpr /Zc:inline /Zc:throwingNew - /experimental:preprocessor + /Zc:preprocessor ) # /GS- - No stack buffer overflow checks diff --git a/src/common/logging/log.h b/src/common/logging/log.h index 682ccdb..2c0b03f 100644 --- a/src/common/logging/log.h +++ b/src/common/logging/log.h @@ -15,12 +15,11 @@ std::uint64_t GetLoggingTime(); std::string StandardizeLogClass(const std::string& log_class); -// TODO: Use a standard variant of ##__VA_ARGS__? #define LOG_PRINT(log_class, level, text_style, file, line, func, format, ...) \ { \ fmt::print(stderr, text_style, "[{:12.6f}] {} <{}> {}:{}:{}: " format "\n", \ GetLoggingTime() / 1000000.0, StandardizeLogClass(log_class), level, file, \ - line, func, ##__VA_ARGS__); \ + line, func __VA_OPT__(, ) __VA_ARGS__); \ fflush(stderr); \ } diff --git a/src/core/inner_fat.h b/src/core/inner_fat.h index 6aca9d3..becd666 100644 --- a/src/core/inner_fat.h +++ b/src/core/inner_fat.h @@ -23,7 +23,8 @@ struct ArchiveFormatInfo { u32_le number_files; ///< The pre-defined number of files in the archive. u8 duplicate_data; ///< Whether the archive should duplicate the data. }; -static_assert(std::is_pod::value, "ArchiveFormatInfo is not POD"); +static_assert(std::is_standard_layout_v && std::is_trivial_v, + "ArchiveFormatInfo is not POD"); union TableOffset { // This has different meanings for different savegame layouts