[CMake] Custom configuration types in Visual Studio

Robert Dailey rcdailey at gmail.com
Tue Jan 17 17:12:33 EST 2012


Is it a bug that project() does not append to the user-specified
configurations? Sure seems like one...

---------
Robert Dailey


On Fri, Jan 13, 2012 at 4:52 PM, Michael Hertling <mhertling at online.de>wrote:

> On 01/13/2012 05:06 PM, David Cole wrote:
> > On Fri, Jan 13, 2012 at 10:22 AM, Michael Hertling <mhertling at online.de>
> wrote:
> >> On 01/12/2012 10:23 PM, Robert Dailey wrote:
> >>> I see there is documentation for this but it doesn't have an
> implementation
> >>> for VS generators:
> >>> http://www.cmake.org/Bug/view.php?id=5811
> >>>
> >>> Any status updates on this bug? I'd like to be able to create my own
> debug
> >>> configuration called DebugStatic that uses the /MTd flag in all
> projects to
> >>> link statically against the Microsoft libraries such as CRT.
> >>>
> >>> Any help?
> >>
> >> Look at the following exemplary project:
> >>
> >> CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
> >> PROJECT(P C)
> >> SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES} DebugStatic
> >>    CACHE STRING "" FORCE)
> >> SET(CMAKE_C_FLAGS_DEBUGSTATIC "/MTd"
> >>    CACHE STRING "" FORCE)
> >> SET(CMAKE_EXE_LINKER_FLAGS_DEBUGSTATIC ""
> >>    CACHE STRING "" FORCE)
> >> FILE(WRITE ${CMAKE_BINARY_DIR}/main.c "int main(void){return 0;}\n")
> >> ADD_EXECUTABLE(main main.c)
> >>
> >> After "cmake <srcdir>" and a subsequent "cmake ." from within the build
> >> directory, I can see the DebugStatic configuration appear in the VS IDE
> >> when the generated solution is opened. Is this what you intend?
> >>
> >> However, I do not see DebugStatic when I open the solution right after
> >> the initial configuration, i.e. without the reconfiguration step. Can
> >> you confirm this behavior? Does anybody know why the reconfiguration
> >> is necessary to make the custom configuration appear? This is with
> >> CMake 2.8.7 and VS 2008.
> >>
> >> Regards,
> >>
> >> Michael
> >> --
> >>
> >> 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
> >
> > I don't know why it doesn't appear straight away, (although I suspect
> > it's because the variable is set after the project command)
>
> Yes, that's it; placing the SET() command for CMAKE_CONFIGURATION_TYPES
> before PROJECT() makes the new configuration appear at once, but it is
> *solely* the new one. Apparently, CMake's standard configurations are
> defined by PROJECT() only if there aren't already any configurations
> in the cache. A working alternative is to drop the language(s) from
> PROJECT(), augment the list of configurations thereafter and use
> ENABLE_LANGUAGE() finally, i.e.:
>
> PROJECT(XYZ)  # <-- No language(s) here!
> LIST(APPEND CMAKE_CONFIGURATION_TYPES ...)
> LIST(REMOVE_DUPLICATES CMAKE_CONFIGURATION_TYPES)
> SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES}
>    CACHE STRING "CMake configuration types" FORCE)
> ENABLE_LANGUAGE(C)
>
> > But you should never do this unconditionally:
> >
> >   SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES} DebugStatic
> >     CACHE STRING "" FORCE)
> >
> > That will simply continuously append to the variable in the cache, and
> > it will grow on each subsequent configure in the same build tree...
> > Real code should check whether DebugStatic is in there already, and
> > avoiding appending if already present.
>
> Uhhh... absolutely, bad mistake! Thanks for pointing this out.
>
> Regards,
>
> Michael
> --
>
> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20120117/073dd53a/attachment.htm>


More information about the CMake mailing list