[CMake] parsing config.h files and setting cmake variables accordingly

Michael Jackson mike.jackson at bluequartz.net
Tue Feb 17 08:43:09 EST 2009


I would say that something isn't quite setup correctly with your cmake  
project because lots of us use this technique and it works as  
advertised. All I can think of is there is a loss of a dependency  
somewhere.

---
Mike Jackson                 www.bluequartz.net



On Feb 17, 2009, at 1:35 AM, Clemens Arth wrote:

> Yes, that was exactly what I did and it works on Linux, but it does  
> not help in VS, unfortunately... VS sets up all the includes and  
> linking options right, but then it prompts me to reload the project,  
> and that's it....
> only a complete "rebuild" lets the  project recompile the sources.
>
> Clemens
>
> Michael Jackson wrote:
>> You would also want to add the configured file (config.h) to the  
>> list of sources that get compiled.
>>
>> configure_file(...  config.h)
>>
>> add_executable(MyApp  main.c config.h)
>>
>> That way the dependency is setup between the configured file and  
>> the compilation of the executable.
>>
>> Also I think it is generally better practice to have the input file  
>> that is used in the configure_file command have the name  
>> "config.h.in" rather than config.cmake. Having the .cmake file on  
>> the end may lead to confusion when others look at your project.
>>
>> Cheers
>> ---
>> Mike Jackson                 www.bluequartz.net
>>
>>
>>
>> On Feb 16, 2009, at 5:32 AM, Clemens Arth wrote:
>>
>>> Hi again,
>>>
>>> now I have followed exactly that way and created a config.cmake  
>>> file, which is translated into a config.h file. This approach  
>>> works perfectly well on Linux and everything immediately responds  
>>> to changes in the config.cmake file. However, if I create a Visual  
>>> Studio project on Windows, the project itself gets updated  
>>> according to changes in the config.cmake file, but the sources  
>>> including config.h are not recompiled. Maybe I missed something,  
>>> but even if the config.h file changes on a "build" command (and it  
>>> really does!), the sources are all treated as up2date, so no  
>>> rebuilding happens. Maybe there is a step missing, something like  
>>> marking some files as dirty, but I don't really think so, or at  
>>> least I can not imagine...
>>>
>>> Clemens
>>>
>>> Michael Jackson wrote:
>>>> That is the best way to do it. Have all the options in your CMake  
>>>> file and let the user select which options they want to compile  
>>>> with. Then "configure_file" to create your config.h file.
>>>>
>>>>
>>>> ---
>>>> Mike Jackson                 www.bluequartz.net
>>>>
>>>>
>>>>
>>>> On Feb 13, 2009, at 7:45 AM, Clemens Arth wrote:
>>>>
>>>>> Hello,
>>>>>
>>>>> the config files were written some years ago simply to collect  
>>>>> all the possibilities how to compile the projects. Unfortunately  
>>>>> this was long before cmake came into play, thus the problem just  
>>>>> came up now because I wanted to set up a system for nightly  
>>>>> builds.
>>>>>
>>>>> Well, I think the best solution might be to drop the old  
>>>>> config.h file and to replace it by a file for setting the  
>>>>> variables in the cmake environment, and finally to create a new  
>>>>> config.h version with cmake online with a call to  
>>>>> configure_file. I think, this is, in principal, the way you  
>>>>> might have kept in mind when you suggested a look at  
>>>>> configure_file, right?
>>>>>
>>>>> Regards
>>>>> Clemens
>>>>>
>>>>> Pau Garcia i Quiles wrote:
>>>>>> Hello,
>>>>>>
>>>>>> I see. So, where is that config.h created? In your CMake build- 
>>>>>> system?
>>>>>> is it from an external library? If the former, maybe you could  
>>>>>> use
>>>>>> variables (cmake -DWITH_OPENGL:BOOL=1 ... ); if the latter, I  
>>>>>> don't
>>>>>> know (the only thing I can come with at this moment to survive
>>>>>> additional spaces, etc are regular expressions).
>>>>>>
>>>>>> On Fri, Feb 13, 2009 at 1:10 PM, Clemens Arth <clemens.arth at gmx.at 
>>>>>> > wrote:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> thanks for the hint, but my problem is exactly the opposite of  
>>>>>>> the one
>>>>>>> configure_file is solving. I'm already using configure_file in  
>>>>>>> multiple
>>>>>>> places, but here I don't want to write config files, instead I  
>>>>>>> want to parse
>>>>>>> their content back to cmake, and that's why I don't think  
>>>>>>> configure_file.
>>>>>>>
>>>>>>> Regards
>>>>>>> Clemens
>>>>>>>
>>>>>>> Pau Garcia i Quiles wrote:
>>>>>>>
>>>>>>>> Hello,
>>>>>>>>
>>>>>>>> Take a look at CONFIGURE_FILE
>>>>>>>>
>>>>>>>> On Fri, Feb 13, 2009 at 12:46 PM, Clemens Arth <clemens.arth at gmx.at 
>>>>>>>> >
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> I've got a  question concerning  string processing in cmake.  
>>>>>>>>> Our software
>>>>>>>>> framework consists of multiple libraries and has many  
>>>>>>>>> different features
>>>>>>>>> to
>>>>>>>>> be enabled or disabled using #defines. For example, one  
>>>>>>>>> option is to
>>>>>>>>> compile
>>>>>>>>> with OpenGL or with OpenGL ES support. Thus in a config.h  
>>>>>>>>> file, one of
>>>>>>>>> two
>>>>>>>>> variables is valid to be #defined, USE_OPENGL or  
>>>>>>>>> USE_OPENGLES. Depending
>>>>>>>>> on
>>>>>>>>> the variable defined cmake should link against a specific  
>>>>>>>>> set of
>>>>>>>>> libraries.
>>>>>>>>>
>>>>>>>>> Currently determining which feature is set works the  
>>>>>>>>> following way in my
>>>>>>>>> CMakeLists.txt:
>>>>>>>>>
>>>>>>>>> Code:
>>>>>>>>> # check for the configuration and set the corresponding GL/ 
>>>>>>>>> GLES libraries
>>>>>>>>> accordingly
>>>>>>>>> FILE(READ ${LIB_SOURCE_DIR}/include/config.h CURRENT_CONFIG)
>>>>>>>>> STRING(REGEX MATCH "\#define USE_OPENGLES" GLES_IS_SET $ 
>>>>>>>>> {CURRENT_CONFIG})
>>>>>>>>> STRING(REGEX MATCH "\#define USE_OPENGL" GL_IS_SET $ 
>>>>>>>>> {CURRENT_CONFIG})
>>>>>>>>> IF("#define USE_OPENGLES" STREQUAL "${GLES_IS_SET}")
>>>>>>>>> MESSAGE("GLES config!")
>>>>>>>>> ELSE("#define USE_OPENGLES" STREQUAL "${GLES_IS_SET}")
>>>>>>>>> IF("#define USE_OPENGL" STREQUAL "${GL_IS_SET}")
>>>>>>>>>   MESSAGE("GL config!")
>>>>>>>>> ELSE("#define USE_OPENGL" STREQUAL "${GL_IS_SET}")
>>>>>>>>>   MESSAGE("Error! USE_GL or USE_GLES must be defined!")
>>>>>>>>> ENDIF("#define USE_OPENGL" STREQUAL "${GL_IS_SET}")
>>>>>>>>> ENDIF("#define USE_OPENGLES" STREQUAL "${GLES_IS_SET}")
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Note that this is really a bad hack. First, if GLES_IS_SET  
>>>>>>>>> is set
>>>>>>>>> ,GL_IS_SET
>>>>>>>>> is also set automatically. Second, if by accident the string  
>>>>>>>>> does not
>>>>>>>>> exactly match the content (an additional <space>, or there  
>>>>>>>>> is a second
>>>>>>>>> variable, for example called USE_OPENGL_EXTRAS), everything  
>>>>>>>>> gets really
>>>>>>>>> weird or fails at all. Finally, a problem is that cmake does  
>>>>>>>>> not actually
>>>>>>>>> notice if I changed the config.h file, so there should be an  
>>>>>>>>> option to
>>>>>>>>> mark
>>>>>>>>> the configuration as dirty if the config.h file is altered -  
>>>>>>>>> this is a
>>>>>>>>> problem which must not necessarily be solved, but maybe  
>>>>>>>>> there is a simple
>>>>>>>>> solution to this.
>>>>>>>>>
>>>>>>>>> Can someone give me some tips how to improve my really ugly  
>>>>>>>>> solution?
>>>>>>>>>
>>>>>>>>> Thanks and best regards
>>>>>>>>> Clemens
>>>>>>>>> _______________________________________________
>>>>>>>>> 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
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> 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
>>>>
>>>> _______________________________________________
>>>> 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
>>>>
>>>
>>
>



More information about the CMake mailing list