CMake MSVC static runtimes und warning level 4
Inzwischen hat sich CMake verändert und es gibt eine einfache Möglichkeit Projekte mit statitic Runtimes zu kompilieren:
add_compile_options("/MT$<$<CONFIG:Debug>:d>")
Vorherige Version
Immer wieder brauch ich für kleinere Projekte die Option die Runtimes static zu linken. Zudem kompiliere ich immer mir Warning Level 4.
Dafür habe ich in CMake folgendes Makro geschrieben:
###############################################################################
# CompilerSettings:
# - W4 (Warning level 4)
# - MTd/MT (Static runtime)
###############################################################################
macro(MakeStatic)
set ( CompilerFlags
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_C_FLAGS_MINSIZEREL
)
# Enable Warning Level 4
foreach(CompilerFlag ${CompilerFlags})
if(${CompilerFlag} MATCHES "/W[0-4]")
string(REPLACE "/W0" "/W4" ${CompilerFlag} "${${CompilerFlag}}")
string(REPLACE "/W1" "/W4" ${CompilerFlag} "${${CompilerFlag}}")
string(REPLACE "/W2" "/W4" ${CompilerFlag} "${${CompilerFlag}}")
string(REPLACE "/W3" "/W4" ${CompilerFlag} "${${CompilerFlag}}")
else()
set(${CompilerFlag} "${${CompilerFlag}} /W4")
endif()
if("${CompilerFlag} " MATCHES "DEBUG ")
set(${CompilerFlag} "${${CompilerFlag}} /MTd")
else()
set(${CompilerFlag} "${${CompilerFlag}} /MT")
endif()
endforeach()
endmacro()
Das Makro kann vor jedem Projekt, oder Global, angewendet werden.