This is an initial pass, simply moving the existing logic as-is. Future PR's will attempt to refactor and improve the cmake stuff.
100 lines
4.4 KiB
CMake
100 lines
4.4 KiB
CMake
macro(CompilerChecksAndSetups)
|
|
if (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
|
|
set(CMAKE_COMPILER_IS_CLANGXX TRUE)
|
|
endif (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
|
|
|
|
# ================================================================================
|
|
|
|
# Needed for boost1.69
|
|
# Avoid that Python (pyerrors.h) defines snprintf and vsnprintf
|
|
if (MSVC AND NOT MSVC_VERSION VERSION_LESS 1900)
|
|
add_definitions(-DHAVE_SNPRINTF)
|
|
elseif (MINGW)
|
|
add_definitions(-DHAVE_SNPRINTF)
|
|
endif()
|
|
|
|
# Allow developers to use Boost < 1.48
|
|
if (NOT BOOST_MIN_VERSION)
|
|
set(BOOST_MIN_VERSION 1.48)
|
|
endif()
|
|
|
|
# For older cmake versions the variable 'CMAKE_CXX_COMPILER_VERSION' is missing
|
|
if(CMAKE_COMPILER_IS_GNUCXX AND NOT CMAKE_CXX_COMPILER_VERSION)
|
|
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
|
|
OUTPUT_VARIABLE CMAKE_CXX_COMPILER_VERSION)
|
|
endif(CMAKE_COMPILER_IS_GNUCXX AND NOT CMAKE_CXX_COMPILER_VERSION)
|
|
|
|
# Enabled C++11 for Freecad 0.17 and later
|
|
if (FREECAD_VERSION VERSION_GREATER 0.16)
|
|
set(BUILD_ENABLE_CXX_STD "C++11" CACHE STRING "Enable C++ standard")
|
|
set_property(CACHE BUILD_ENABLE_CXX_STD PROPERTY STRINGS
|
|
"C++11"
|
|
"C++14"
|
|
"C++17"
|
|
"C++20"
|
|
)
|
|
|
|
if (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7)
|
|
message(FATAL_ERROR "FreeCAD 0.17 and later requires C++11. G++ must be 4.7 or later, the used version is ${CMAKE_CXX_COMPILER_VERSION}")
|
|
elseif(CMAKE_COMPILER_IS_CLANGXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.3)
|
|
message(FATAL_ERROR "FreeCAD 0.17 and later requires C++11. Clang must be 3.3 or later, the used version is ${CMAKE_CXX_COMPILER_VERSION}")
|
|
endif()
|
|
endif(FREECAD_VERSION VERSION_GREATER 0.16)
|
|
|
|
# Log the compiler and version
|
|
message(STATUS "Compiler: ${CMAKE_CXX_COMPILER_ID}, version: ${CMAKE_CXX_COMPILER_VERSION}")
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGXX)
|
|
include(${CMAKE_SOURCE_DIR}/cMake/ConfigureChecks.cmake)
|
|
configure_file(${CMAKE_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
|
|
add_definitions(-DHAVE_CONFIG_H)
|
|
|
|
# Escape the two plus chars as otherwise cmake complains about invalid regex
|
|
if(${BUILD_ENABLE_CXX_STD} MATCHES "C\\+\\+20")
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
elseif(${BUILD_ENABLE_CXX_STD} MATCHES "C\\+\\+17")
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
elseif(${BUILD_ENABLE_CXX_STD} MATCHES "C\\+\\+14")
|
|
set(CMAKE_CXX_STANDARD 14)
|
|
elseif (${BUILD_ENABLE_CXX_STD} MATCHES "C\\+\\+11")
|
|
set(CMAKE_CXX_STANDARD 11)
|
|
endif()
|
|
|
|
set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-write-strings ${CMAKE_CXX_FLAGS}")
|
|
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
# get linker errors as soon as possible and not at runtime e.g. for modules
|
|
if(BUILD_DYNAMIC_LINK_PYTHON)
|
|
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-undefined,error")
|
|
elseif(UNIX)
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
|
|
endif()
|
|
else(BUILD_DYNAMIC_LINK_PYTHON)
|
|
if(CMAKE_COMPILER_IS_CLANGXX)
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-undefined,dynamic_lookup")
|
|
endif()
|
|
endif(BUILD_DYNAMIC_LINK_PYTHON)
|
|
endif(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGXX)
|
|
|
|
if(CMAKE_COMPILER_IS_CLANGXX)
|
|
# Disable warning about potentially uninstantiated static members
|
|
# because it leads to a lot of false-positives.
|
|
#
|
|
# https://en.wikipedia.org/wiki/Xcode#Latest_versions
|
|
if (APPLE)
|
|
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-undefined-var-template")
|
|
endif()
|
|
elseif (UNIX)
|
|
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.9)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-undefined-var-template")
|
|
endif()
|
|
endif()
|
|
|
|
# older boost.preprocessor turn off variadics for clang
|
|
add_definitions(-DBOOST_PP_VARIADICS=1)
|
|
message(STATUS "Force BOOST_PP_VARIADICS=1 for clang")
|
|
endif()
|
|
endmacro(CompilerChecksAndSetups)
|