HomeBlogMagic

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.

Permalink: https://adirmeier.de/Blog/ID_390
Tags: Blog, C/C++, cmake, msvcvon am 2022-01-12