[CMake] debug/optimized include directories

Michael Wild themiwi at gmail.com
Wed Nov 2 12:36:59 EDT 2011


Thanks ;-)

Michael

On 11/02/2011 05:33 PM, Robert Dailey wrote:
> Awesome idea, +1
> 
> This is probably the best work-around until includes get a target property.
> 
> ---------
> Robert Dailey
> 
> 
> On Wed, Nov 2, 2011 at 2:43 AM, Michael Wild <themiwi at gmail.com
> <mailto:themiwi at gmail.com>> wrote:
> 
>     On 11/01/2011 09:49 PM, Robert Dailey wrote:
>     > Well if you need any help coding the feature let me know. I'm already
>     > liking the idea of adding features I want myself into CMake :)
>     >
>     > Thanks!
>     >
>     > ---------
>     > Robert Dailey
>     >
>     >
>     > On Tue, Nov 1, 2011 at 3:47 PM, David Cole <david.cole at kitware.com
>     <mailto:david.cole at kitware.com>
>     > <mailto:david.cole at kitware.com <mailto:david.cole at kitware.com>>>
>     wrote:
>     >
>     >     On Tue, Nov 1, 2011 at 4:33 PM, Robert Dailey
>     <rcdailey at gmail.com <mailto:rcdailey at gmail.com>
>     >     <mailto:rcdailey at gmail.com <mailto:rcdailey at gmail.com>>> wrote:
>     >     > On Tue, Nov 1, 2011 at 3:32 PM, David Cole
>     <david.cole at kitware.com <mailto:david.cole at kitware.com>
>     >     <mailto:david.cole at kitware.com
>     <mailto:david.cole at kitware.com>>> wrote:
>     >     >>
>     >     >> Not yet
>     >     >
>     >     > Meaning there are plans in the works to add such
>     functionality in
>     >     the near
>     >     > future?
>     >     > For now I guess I could actually hard code VS environment
>     >     variables in my
>     >     > include directory strings, such as $(Configuration).
>     >
>     >     There is a feature planned to add per-target include
>     directories (as a
>     >     target property). As part of that work, we will probably naturally
>     >     also add per-configuration values of that new target property.
>     It is
>     >     not yet added as a feature request in the bug tracker, but
>     there are
>     >     related ones that I may "borrow" for the purpose. Stay tuned
>     for more
>     >     info, but it is not coming in the next week or two. Hopefully,
>     in time
>     >     for 2.8.7, but it depends on timing at this point.... so no
>     promises.
>     >
>     >     For now, your $(Configuration) idea is probably your best bet.
>     (And
>     >     would continue to work even after we implement this feature...)
>     >
>     >
>     >     HTH,
>     >     David
> 
>     Alternatively, if you want to keep it cross-platform and generator
>     independent, you could use a proxy header which #include's the correct
>     header using relative or absolute paths using #ifdef's. Probably that
>     proxy header would need to be generated by configure_file(). You then
>     would pass the configuration name by setting the
>     COMPILE_DEFINITIONS_<CONFIG> property on the directory, target or source
>     file affected.
> 
> 
>     Say you have the following layout:
> 
>     project/
>     |-- CMakeLists.txt
>     |-- src/
>     |   |-- frobnicate.c
>     `-- include/
>        |-- Debug/
>        |   |-- foo.h
>        |   `-- bar.h
>        `-- Optimized/
>            |-- foo.h
>            `-- bar.h
> 
>     Now, you want to include the configuration dependent foo.h and bar.h in
>     frobnicate.c without having to change frobnicate.c itself and might look
>     like this:
> 
>     frobnicate.c
>     <<<<<<<<<<<<
>     #include "foo.h"
>     #include "bar.h"
> 
>     int main(int argc, char** argv)
>     {
>      foo();
>      bar();
>      return 0;
>     }
>     >>>>>>>>>>>>
> 
>     To get around the issue of needing a configuration-dependent include
>     path, you could do the following in your CMakeLists.txt file:
> 
>     CMakeLists.txt:
>     <<<<<<<<<<<<<<<
>     cmake_minimum_required(VERSION 2.6)
>     project(frobnicate C)
> 
>     # loads of stuff ....
> 
>     # generate wrapper headers for foo.h and bar.h
>     foreach(hdr foo.h bar.h)
>      # find a good include guard name
>      string(TOUPPER "${hdr}" incguard)
>      string(REGEX REPLACE "[^a-zA-Z0-9_]" "_" incguard
>        "PROXY_HDR_${incguard}")
>      # write the proxy header
>      file(WRITE "${PROJECT_BINARY_DIR}/include/${hdr}"
>     "
>     /* AUTOMATICALLY GENERATED BY CMAKE -- DO NOT EDIT! */
>     #pragma once
>     #ifndef ${incguard}
>     #define ${incguard}
> 
>     /* if building debug configuration, include Debug/${hdr},
>       otherwise Optimized/${hdr} */
>     #if defined(CONFIG_DEBUG)
>     #  include \"Debug/${hdr}\"
>     #else
>     #  include \"Optimized/${hdr}\"
>     #endif
> 
>     #endif
>     ")
>     endforeach()
> 
>     # set up the definitions for the switch yard
>     set_directory_properties(PROPERTIES
>      COMPILE_DEFINITIONS_DEBUG CONFIG_DEBUG
>      COMPILE_DEFINITIONS_RELEASE CONFIG_RELEASE
>      COMPILE_DEFINITIONS_RELWITHDEBINFO CONFIG_RELWITHDEBINFO
>      COMPILE_DEFINITIONS_MINSIZEREL CONFIG_MINSIZE_REL)
> 
>     # set up the include directories so our proxy headers and the actual
>     # headers can be found by the preprocessor
>     include_directories(
>      ${PROJECT_BINARY_DIR}/include
>      ${PROJECT_SOURCE_DIR}/include)
> 
>     add_executable(frobnicate frobnicate.c)
> 
>     >>>>>>>>>>>>>>>
> 
> 
>     HTH
> 
>     Michael
>     --
> 
>     Powered by www.kitware.com <http://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
> 
> 



More information about the CMake mailing list