FreeCAD
102 строки · 4.5 Кб
1# Some resources
2# https://github.com/dev-cafe/cmake-cookbook
3# https://cmake.org/cmake/help/v3.8/manual/cmake-compile-features.7.html
4
5macro(CompilerChecksAndSetups)
6if (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
7set(CMAKE_COMPILER_IS_CLANGXX TRUE)
8endif (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
9
10# ================================================================================
11
12# Needed for boost1.69
13# Avoid that Python (pyerrors.h) defines snprintf and vsnprintf
14if (MSVC AND NOT MSVC_VERSION VERSION_LESS 1900)
15add_definitions(-DHAVE_SNPRINTF)
16elseif (MINGW)
17add_definitions(-DHAVE_SNPRINTF)
18endif()
19
20# Allow developers to use Boost < 1.65
21if (NOT BOOST_MIN_VERSION)
22set(BOOST_MIN_VERSION 1.65)
23endif()
24
25# For older cmake versions the variable 'CMAKE_CXX_COMPILER_VERSION' is missing
26if(CMAKE_COMPILER_IS_GNUCXX AND NOT CMAKE_CXX_COMPILER_VERSION)
27execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
28OUTPUT_VARIABLE CMAKE_CXX_COMPILER_VERSION)
29endif(CMAKE_COMPILER_IS_GNUCXX AND NOT CMAKE_CXX_COMPILER_VERSION)
30
31# Enabled C++17 for Freecad 0.20 and later
32set(BUILD_ENABLE_CXX_STD "C++17" CACHE STRING "Enable C++ standard")
33set_property(CACHE BUILD_ENABLE_CXX_STD PROPERTY STRINGS
34"C++17"
35"C++20"
36)
37
38if (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.3)
39message(FATAL_ERROR "FreeCAD 0.20 and later requires C++17. G++ must be 7.3 or later, the used version is ${CMAKE_CXX_COMPILER_VERSION}")
40elseif(CMAKE_COMPILER_IS_CLANGXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0)
41message(FATAL_ERROR "FreeCAD 0.20 and later requires C++17. Clang must be 6.0 or later, the used version is ${CMAKE_CXX_COMPILER_VERSION}")
42endif()
43
44# Escape the two plus chars as otherwise cmake complains about invalid regex
45if(${BUILD_ENABLE_CXX_STD} MATCHES "C\\+\\+20")
46set(CMAKE_CXX_STANDARD 20)
47elseif(${BUILD_ENABLE_CXX_STD} MATCHES "C\\+\\+17")
48set(CMAKE_CXX_STANDARD 17)
49endif()
50
51# Log the compiler and version
52message(STATUS "Compiler: ${CMAKE_CXX_COMPILER_ID}, version: ${CMAKE_CXX_COMPILER_VERSION}")
53
54if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGXX)
55include(${CMAKE_SOURCE_DIR}/cMake/ConfigureChecks.cmake)
56configure_file(${CMAKE_SOURCE_DIR}/src/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
57add_definitions(-DHAVE_CONFIG_H)
58
59# For now only set pedantic option for clang
60if(CMAKE_COMPILER_IS_CLANGXX)
61set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wpedantic -Wno-write-strings ${CMAKE_CXX_FLAGS}")
62else()
63set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-write-strings ${CMAKE_CXX_FLAGS}")
64endif()
65include_directories(${CMAKE_CURRENT_BINARY_DIR})
66
67# get linker errors as soon as possible and not at runtime e.g. for modules
68if(BUILD_DYNAMIC_LINK_PYTHON)
69if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
70set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-undefined,error")
71elseif(UNIX)
72set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
73endif()
74else(BUILD_DYNAMIC_LINK_PYTHON)
75if(CMAKE_COMPILER_IS_CLANGXX)
76set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-undefined,dynamic_lookup")
77endif()
78endif(BUILD_DYNAMIC_LINK_PYTHON)
79endif(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGXX)
80
81if(CMAKE_COMPILER_IS_CLANGXX)
82# Disable warning about potentially uninstantiated static members
83# because it leads to a lot of false-positives.
84#
85# https://en.wikipedia.org/wiki/Xcode#Latest_versions
86if (APPLE)
87if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0)
88set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-undefined-var-template")
89endif()
90add_definitions(-DGL_SILENCE_DEPRECATION)
91elseif (UNIX)
92set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-undefined-var-template")
93endif()
94
95# older boost.preprocessor turn off variadics for clang
96add_definitions(-DBOOST_PP_VARIADICS=1)
97message(STATUS "Force BOOST_PP_VARIADICS=1 for clang")
98endif()
99
100set (COMPILE_DEFINITIONS ${COMPILE_DEFINITIONS} BOOST_NO_CXX98_FUNCTION_BASE)
101
102endmacro(CompilerChecksAndSetups)
103