[CMake] how to force msvc static C runtime libs?

David Cole david.cole at kitware.com
Sat Sep 6 08:54:24 EDT 2008


The cache does *not* reveal what's actually used to generate, it reveals
what was last cached. What is actually used to generate is whatever the
logic in your CMakeLists files dictates. In your case, you should end up
with "/MT" everywhere that you want to and it should work. (Verify it by
looking at the settings in Visual Studio, or by doing a make VERBOSE=1 and
inspecting the actual flags used to compile.)
Is that not the case?

I do a simple loop through the variables of interest and use STRING REGEX
REPLACE to change /MD into /MT. Something like this (writing without running
it, forgive if there are any typos):

foreach(flag_var CMAKE_CXX_FLAGS_DEBUG ...... other variables here too
...... )
  if(${flag_var} MATCHES "/MD")
    string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
  endif(${flag_var} MATCHES "/MD")
endforeach(flag_var)


Let us know how you make out....

David



On Fri, Sep 5, 2008 at 8:45 PM, McKay Davis <mckay.cpp at gmail.com> wrote:

> My setup: Win XP, VS 9 2008 Express, CMake 2.6.1
>
> I'm having trouble getting cmake to generate nmakefiles (or VS solutions)
> w/ the static C/C++ runtime lib flags.  I cannot figure out how to pass the
> '/MT' flag (and NOT the /MD flag) to cl.exe.
>
> My CMakeLists.txt is simple, with one directory, one lib, and one
> executable.  It contains copies of lines 201-210 of
> share/cmake-2.6/Modules/Platform/Windows-cl.cmake with the FORCE flag set:
>
> SET (CMAKE_CXX_FLAGS_INIT "/DWIN32 /D_WINDOWS /W3 /Zm1000 /GX /GR" CACHE
> STRING "flags" FORCE)
> SET (CMAKE_CXX_FLAGS_DEBUG_INIT "/D_DEBUG /MTd /Zi  /Ob0 /Od /GZ" CACHE
> STRING "flags" FORCE)
> SET (CMAKE_CXX_FLAGS_MINSIZEREL_INIT "/MT /O1 /Ob1 /D NDEBUG" CACHE STRING
> "flags" FORCE)
> SET (CMAKE_CXX_FLAGS_RELEASE_INIT "/MT /O2 /Ob2 /D NDEBUG" CACHE STRING
> "flags" FORCE)
> SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "/MT /Zi /O2 /Ob1 /D NDEBUG" CACHE
> STRING "flags" FORCE)
> SET (CMAKE_C_FLAGS_INIT "/DWIN32 /D_WINDOWS /W3 /Zm1000" CACHE STRING
> "flags" FORCE)
> SET (CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG /MTd /Zi  /Ob0 /Od /GZ" CACHE
> STRING "flags" FORCE)
> SET (CMAKE_C_FLAGS_MINSIZEREL_INIT "/MT /O1 /Ob1 /D NDEBUG" CACHE STRING
> "flags" FORCE)
> SET (CMAKE_C_FLAGS_RELEASE_INIT "/MT /O2 /Ob2 /D NDEBUG" CACHE STRING
> "flags" FORCE)
> SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "/MT /Zi /O2 /Ob1 /D NDEBUG" CACHE
> STRING "flags" FORCE)
>
> These seem to only affect the *_INIT vars, because after running cmake
> inspecting the cache reveals:
>
> > grep ^CMAKE_CX*_FLAGS CMakeCache.txt'
>
> CMAKE_CXX_FLAGS:STRING= /DWIN32 /D_WINDOWS /W3 /Zm1000 /EHsc /GR
> CMAKE_CXX_FLAGS_DEBUG:STRING=/D_DEBUG /MDd /Zi /Ob0 /Od /RTC1
> CMAKE_CXX_FLAGS_DEBUG_INIT:STRING=/D_DEBUG /MTd /Zi  /Ob0 /Od /GZ
> CMAKE_CXX_FLAGS_INIT:STRING=/DWIN32 /D_WINDOWS /W3 /Zm1000 /GX /GR
> CMAKE_CXX_FLAGS_MINSIZEREL:STRING=/MD /O1 /Ob1 /D NDEBUG
> CMAKE_CXX_FLAGS_MINSIZEREL_INIT:STRING=/MT /O1 /Ob1 /D NDEBUG
> CMAKE_CXX_FLAGS_RELEASE:STRING=/MD /O2 /Ob2 /D NDEBUG
> CMAKE_CXX_FLAGS_RELEASE_INIT:STRING=/MT /O2 /Ob2 /D NDEBUG
> CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=/MD /Zi /O2 /Ob1 /D NDEBUG
> CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT:STRING=/MT /Zi /O2 /Ob1 /D NDEBUG
> CMAKE_C_FLAGS:STRING= /DWIN32 /D_WINDOWS /W3 /Zm1000
> CMAKE_C_FLAGS_DEBUG:STRING=/D_DEBUG /MDd /Zi  /Ob0 /Od /RTC1
> CMAKE_C_FLAGS_DEBUG_INIT:STRING=/D_DEBUG /MTd /Zi  /Ob0 /Od /GZ
> CMAKE_C_FLAGS_INIT:STRING=/DWIN32 /D_WINDOWS /W3 /Zm1000
> CMAKE_C_FLAGS_MINSIZEREL:STRING=/MD /O1 /Ob1 /D NDEBUG
> CMAKE_C_FLAGS_MINSIZEREL_INIT:STRING=/MT /O1 /Ob1 /D NDEBUG
> CMAKE_C_FLAGS_RELEASE:STRING=/MD /O2 /Ob2 /D NDEBUG
> CMAKE_C_FLAGS_RELEASE_INIT:STRING=/MT /O2 /Ob2 /D NDEBUG
> CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=/MD /Zi /O2 /Ob1 /D NDEBUG
> CMAKE_C_FLAGS_RELWITHDEBINFO_INIT:STRING=/MT /Zi /O2 /Ob1 /D NDEBUG
> ...
>
> What should I do to get cmake to build w/ the static C runtime libs?
>
> Thanks,
>
> -McKay Davis
>
>
> _______________________________________________
> CMake mailing list
> CMake at cmake.org
> http://www.cmake.org/mailman/listinfo/cmake
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20080906/f21fe288/attachment.htm>


More information about the CMake mailing list