I love cmake, but I am still a bit of a novice, so perhaps there is a
better way to approach this problem.  I am building a library using
cmake.  On Windows I need to be able to build two versions: one that
links statically to the CRT (/MT) and one that links dynamically to
the CRT (/MD).  I would like to avoid setting properties on
directories (not sure if it would work anyway) or doing anything that
requires me to split my project into two pieces.

I know there is a general solution to the CRT linkage problem by
setting CMAKE_<LANG>_FLAGS globally (see
http://stackoverflow.com/questions/1618927/cmake-microsoft-visual-studio-and-monolithic-runtimes).
 It works great, but I cannot figure out a way to accomplish the same
thing on a per target basis.

My CMakeLists.txt for this library is similar to the following:


INCLUDE_DIRECTORIES( "${PROJECT_SOURCE_DIR}" )

SET( MYLIB_SRCS
        foo.h
        bar.h
        baz.h
        foo.cpp )

IF( WIN32 )

        ADD_LIBRARY( MylibMD STATIC ${MYLIB_SRCS} )
        ADD_LIBRARY( MylibMT STATIC ${MYLIB_SRCS} )

        # Statically link to Visual C++ CRT
        FOREACH( Flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELWITHDEBINFO )
                IF( ${Flag_var} MATCHES "/MD" )
                        STRING( REGEX REPLACE "/MD" "/MT" "${Flag_var}MT" 
"${${Flag_var}}" )
                        SET_TARGET_PROPERTIES( MylibMT PROPERTIES "${Flag_var}" 
"${${Flag_var}MT}" )
                        # I also tried this
                        # SET_PROPERTY( TARGET MylibMT PROPERTY "${Flag_var}" 
"${${Flag_var}MT}" )
                ENDIF( ${Flag_var} MATCHES "/MD" )
        ENDFOREACH( Flag_var )

ELSE( WIN32 )

        ADD_LIBRARY( Mylib STATIC ${MYLIB_SRCS} )

ENDIF( WIN32 )


I tried adding this in with COMPILE_FLAGS and other properties.  I
also tried multiple things like the following in place of the for
loop:


SET_TARGET_PROPERTIES( MylibMT
                                PROPERTIES
                                STATIC_LIBRARY_FLAGS_DEBUG "/MTd"
                                STATIC_LIBRARY_FLAGS_RELEASE "/MT"
                                STATIC_LIBRARY_FLAGS_MINSIZEREL "/MT"
                                STATIC_LIBRARY_FLAGS_RELWITHDEBINFO "/MT" )


I found this thread on the mailing list:
http://www.cmake.org/pipermail/cmake/2010-August/039046.html, but
couldn't make any use of it, unless it would work to remove all CRT
linkage from the CMAKE_<LANG>_FLAGS and then add it back via
COMPILE_FLAGS or something else; but COMPILE_FLAGS doesn't seem to
have a per configuration variant.

Please let me know if it is even possible to accomplish what I am
trying to do.  Thanks.
--

Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to