[CMake] Did anyone manage to get incremental linking working with NMake generator?
Tyler Roscoe
tyler at cryptio.net
Thu Dec 9 12:11:58 EST 2010
On Thu, Dec 09, 2010 at 08:44:15AM -0500, Bill Hoffman wrote:
> On 12/9/2010 5:26 AM, Gabriel Petrovay wrote:
>> Thanks Bill for the trick.
>>
>> Unfortunately this works only for exe targets.
>> It doesn't work for dll's. Moreover, before the link command there is
>> this output: "Visual Studio Non-Incremental Link"
>>
> If it says that then the /INCREMENTAL flag is not being used. You have
> to set the CMAKE_SHARED_LINKER_FLAGS_DEBUG flag for this to work with
> dlls, may also want to set this one: CMAKE_MODULE_LINKER_FLAGS_DEBUG.
Haven't been following this thread closely, but changing the handling of
/INCREMENTAL is a pain, at least in VS 2005 and 2008. Here is some code
we use to *disable* /INCREMENTAL. With a little creativity, you could
probably use this to forcibly *enable* /INCREMENTAL :):
# Disable incremental linking when BUILD_code_quality is enabled as it
# causes problems with code coverage builds.
#
# These link flags are baked in when Windows-cl.cmake is loaded. Thus,
# we have to alter several variables. See: "How to turn off incremental
# linking for MSVC Debug and RelWithDebInfo targets?"
# http://www.cmake.org/pipermail/cmake/2010-February/035174.html
#
# Example from OpenSceneGraph:
# http://www.openscenegraph.org/svn/osg/OpenSceneGraph/tags/OpenSceneGraph-2.6.0/CMakeLists.txt
#
# Also remove /EDITANDCONTINUE, which is incompatible with
# /INCREMENTAL:NO.
foreach (flag_type EXE MODULE SHARED)
string (REPLACE "INCREMENTAL:YES" "INCREMENTAL:NO" flag_tmp "${CMAKE_${flag_type}_LINKER_FLAGS_DEBUG}")
string (REPLACE "/EDITANDCONTINUE" "" flag_tmp "${CMAKE_${flag_type}_LINKER_FLAGS_DEBUG}")
set (CMAKE_${flag_type}_LINKER_FLAGS_DEBUG "/INCREMENTAL:NO ${flag_tmp}" CACHE STRING "Overriding default debug ${flag_type} linker flags." FORCE)
mark_as_advanced (CMAKE_${flag_type}_LINKER_FLAGS_DEBUG)
endforeach ()
# Change /ZI to /Zi as /ZI implies /EDITANDCONTINUE, which is mutually
# exclusive with INCREMENTAL:NO as set above. Furthermore, this setting
# only applies to 32-bit Windows.
if (TP_PLATFORM MATCHES "${TP_WIN32}")
string (REPLACE "/ZI" "/Zi" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
endif ()
# Disable this warning:
# warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other
# libs; use /NODEFAULTLIB:library
list (APPEND TP_COMMON_LINK_FLAGS_DEBUG "/NODEFAULTLIB:MSVCRT")
hth,
tyler
More information about the CMake
mailing list