11cmake_minimum_required (VERSION 3.22)
2- project (magic-cpp)
2+ project (magic-cpp CXX )
33
44add_library (MAGIC_CPP INTERFACE )
55target_include_directories (MAGIC_CPP INTERFACE include )
@@ -9,23 +9,70 @@ if(NOT MAGIC_CPP_INCLUDE_TESTS)
99 return ()
1010endif ()
1111
12- set (CMAKE_CXX_STANDARD 20)
13- set (CMAKE_CXX_STANDARD_REQUIRED ON )
12+ # 检查编译器版本支持
13+ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" )
14+ execute_process (
15+ COMMAND ${CMAKE_CXX_COMPILER} -dumpfullversion -std=c++20
16+ OUTPUT_VARIABLE GCC_VERSION
17+ )
18+ string (REGEX MATCH "[0-9]+\\ .[0-9]+" GCC_VERSION ${GCC_VERSION} )
19+ if (GCC_VERSION VERSION_LESS 10.0)
20+ message (FATAL_ERROR "Minimum required version of g++ is 10.0" )
21+ endif ()
22+ message (STATUS "Using g++ version ${GCC_VERSION} " )
23+ endif ()
24+ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
25+ execute_process (
26+ COMMAND ${CMAKE_CXX_COMPILER} --version
27+ OUTPUT_VARIABLE CLANG_VERSION_OUTPUT
28+ )
29+ string (REGEX MATCH "clang version ([0-9]+\\ .[0-9]+)" CLANG_VERSION ${CLANG_VERSION_OUTPUT} )
30+ string (REGEX REPLACE "clang version ([0-9]+\\ .[0-9]+).*" "\\ 1" CLANG_VERSION ${CLANG_VERSION} )
31+ if (CLANG_VERSION VERSION_LESS 10.0)
32+ message (FATAL_ERROR "Minimum required version of clang is 10.0" )
33+ endif ()
34+ message (STATUS "Using clang version ${CLANG_VERSION} " )
35+ endif ()
36+ if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC" )
37+ if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.28)
38+ message (FATAL_ERROR "Minimum required version of MSVC is 19.28 (Visual Studio 2019 version 16.10)" )
39+ endif ()
40+ message (STATUS "Using MSVC version ${CMAKE_CXX_COMPILER_VERSION} " )
41+ endif ()
42+
43+ # 检查C++的版本
44+ include (CheckCXXCompilerFlag)
45+ check_cxx_compiler_flag(-std=c++20 HAS_CXX23_FLAG)
46+ check_cxx_compiler_flag(-std=c++20 HAS_CXX20_FLAG)
47+ if (HAS_CXX23_FLAG)
48+ set (CMAKE_CXX_STANDARD 23)
49+ elseif (HAS_CXX20_FLAG)
50+ set (CMAKE_CXX_STANDARD 20)
51+ else ()
52+ message (FATAL_ERROR "C++20 standard is required!" )
53+ endif ()
1454
1555if (NOT MSVC )
1656 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread" )
1757endif ()
1858
59+ # 优先寻找本地的GTest
60+ find_package (GTest QUIET )
1961
20- include (FetchContent)
21- FetchContent_Declare(
62+ if (NOT GTest_FOUND)
63+ message (STATUS "GoogleTest not found locally, downloading with FetchContent..." )
64+ include (FetchContent)
65+ FetchContent_Declare(
2266 googletest
2367 URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
2468 DOWNLOAD_EXTRACT_TIMESTAMP TRUE
25- )
26- # For Windows: Prevent overriding the parent project's compiler/linker settings
27- set (gtest_force_shared_crt ON CACHE BOOL "" FORCE)
28- FetchContent_MakeAvailable(googletest)
69+ )
70+ # For Windows: Prevent overriding the parent project's compiler/linker settings
71+ set (gtest_force_shared_crt ON CACHE BOOL "" FORCE)
72+ FetchContent_MakeAvailable(googletest)
73+ else ()
74+ message (STATUS "GoogleTest found locally." )
75+ endif ()
2976
3077enable_testing ()
3178
@@ -36,7 +83,6 @@ file(GLOB TEST_SOURCES "test/*.cpp")
3683
3784# 创建一个包含所有测试文件的可执行文件
3885add_executable (all_tests ${TEST_SOURCES} )
39- add_executable (main main.cpp)
4086
4187target_link_libraries (all_tests GTest::gtest_main)
4288# 链接Google Test库到测试可执行文件
0 commit comments