Re: [CMake] Touching files on cache var changes
On 05/17/2011 07:46 PM, David Cole wrote: > On Tue, May 17, 2011 at 1:30 PM, Michael Hertling wrote: > >> On 05/17/2011 05:45 PM, Robert Bielik wrote: >>> Hi all, >>> >>> I'm wondering if there's a way to touch files on cached var changes. >> Let's say I have an option to enable or disable a feature >>> in my application, and depending on its setting a preprocessor macro is >> defined (or not defined) in the CMakeLists.txt file: >>> >>> OPTION(FEATURE_X "Check to enable feature X" OFF) >>> >>> IF(FEATURE_X) >>> ADD_DEFINITIONS(-DUSE_FEATURE_X=1) >>> ELSE(FEATURE_X) >>> ADD_DEFINITIONS(-DUSE_FEATURE_X=0) >>> ENDIF(FEATURE_X) >>> >>> and in "features.c": >>> >>> ... >>> #if USE_FEATURE_X >>> // Code for feature X >>> >>> #endif >>> ... >>> >>> The source code file "features.c" that have code depending on the >> preprocessor macro needs to be recompiled each time the option changes, >> which does not automatically >>> happen if the macro is defined like above (and I _really_ need to have it >> defined, either to zero or one...). >>> >>> So I pretty much need to hook a dependency of "features.c" to change of >> cached cmake options/vars... >>> >>> Ideas? >>> TIA >>> /Rob >> >> AFAICS, with 2.8.4, the concerned files *are* recompiled: >> >> # CMakeLists.txt: >> CMAKE_MINIMUM_REQUIRED(VERSION 2.8.4 FATAL_ERROR) >> PROJECT(RECOMPILE C) >> SET(CMAKE_VERBOSE_MAKEFILE ON) >> OPTION(FEATURE_X "Check to enable feature X" OFF) >> IF(FEATURE_X) >> ADD_DEFINITIONS(-DUSE_FEATURE_X=1) >> ELSE(FEATURE_X) >> ADD_DEFINITIONS(-DUSE_FEATURE_X=0) >> ENDIF(FEATURE_X) >> ADD_EXECUTABLE(main main.c) >> >> /* main.c: */ >> int main(void){return 0;} >> >> After reconfiguring the project with an altered FEATURE_X value, >> you will see main.c being recompiled. This is due to the line >> >> CMakeFiles/main.dir/main.c.o: CMakeFiles/main.dir/flags.make >> >> in ${CMAKE_BINARY_DIR}/CMakeFiles/main.dir/build.make with the >> ${CMAKE_BINARY_DIR}/CMakeFiles/main.dir/flags.make containing: >> >> C_DEFINES = -DUSE_FEATURE_X=... >> >> It's this latter file which is modified when the preprocessor >> definitions change, and the object file's dependency provides >> for the recompilation. Can you confirm that? >> >> Regards, >> >> Michael > > That works with makefile generators, but we trust Visual Studio and Xcode to > do their own dependency analysis, and with those generators, I don't think > that the main.c will be recompiled after changing the FEATURE_X value in > CMake... Ahh, thanks for this hint! Indeed, with VS, nothing happens. :-( Regards, Michael > However, if you use a configured header file, then it will. > > HTH, > David ___ 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
Re: [CMake] Touching files on cache var changes
On Tue, May 17, 2011 at 1:30 PM, Michael Hertling wrote: > On 05/17/2011 05:45 PM, Robert Bielik wrote: > > Hi all, > > > > I'm wondering if there's a way to touch files on cached var changes. > Let's say I have an option to enable or disable a feature > > in my application, and depending on its setting a preprocessor macro is > defined (or not defined) in the CMakeLists.txt file: > > > > OPTION(FEATURE_X "Check to enable feature X" OFF) > > > > IF(FEATURE_X) > > ADD_DEFINITIONS(-DUSE_FEATURE_X=1) > > ELSE(FEATURE_X) > > ADD_DEFINITIONS(-DUSE_FEATURE_X=0) > > ENDIF(FEATURE_X) > > > > and in "features.c": > > > > ... > > #if USE_FEATURE_X > > // Code for feature X > > > > #endif > > ... > > > > The source code file "features.c" that have code depending on the > preprocessor macro needs to be recompiled each time the option changes, > which does not automatically > > happen if the macro is defined like above (and I _really_ need to have it > defined, either to zero or one...). > > > > So I pretty much need to hook a dependency of "features.c" to change of > cached cmake options/vars... > > > > Ideas? > > TIA > > /Rob > > AFAICS, with 2.8.4, the concerned files *are* recompiled: > > # CMakeLists.txt: > CMAKE_MINIMUM_REQUIRED(VERSION 2.8.4 FATAL_ERROR) > PROJECT(RECOMPILE C) > SET(CMAKE_VERBOSE_MAKEFILE ON) > OPTION(FEATURE_X "Check to enable feature X" OFF) > IF(FEATURE_X) > ADD_DEFINITIONS(-DUSE_FEATURE_X=1) > ELSE(FEATURE_X) > ADD_DEFINITIONS(-DUSE_FEATURE_X=0) > ENDIF(FEATURE_X) > ADD_EXECUTABLE(main main.c) > > /* main.c: */ > int main(void){return 0;} > > After reconfiguring the project with an altered FEATURE_X value, > you will see main.c being recompiled. This is due to the line > > CMakeFiles/main.dir/main.c.o: CMakeFiles/main.dir/flags.make > > in ${CMAKE_BINARY_DIR}/CMakeFiles/main.dir/build.make with the > ${CMAKE_BINARY_DIR}/CMakeFiles/main.dir/flags.make containing: > > C_DEFINES = -DUSE_FEATURE_X=... > > It's this latter file which is modified when the preprocessor > definitions change, and the object file's dependency provides > for the recompilation. Can you confirm that? > > 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 > That works with makefile generators, but we trust Visual Studio and Xcode to do their own dependency analysis, and with those generators, I don't think that the main.c will be recompiled after changing the FEATURE_X value in CMake... However, if you use a configured header file, then it will. HTH, David ___ 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
Re: [CMake] Touching files on cache var changes
On 05/17/2011 05:45 PM, Robert Bielik wrote: > Hi all, > > I'm wondering if there's a way to touch files on cached var changes. Let's > say I have an option to enable or disable a feature > in my application, and depending on its setting a preprocessor macro is > defined (or not defined) in the CMakeLists.txt file: > > OPTION(FEATURE_X "Check to enable feature X" OFF) > > IF(FEATURE_X) > ADD_DEFINITIONS(-DUSE_FEATURE_X=1) > ELSE(FEATURE_X) > ADD_DEFINITIONS(-DUSE_FEATURE_X=0) > ENDIF(FEATURE_X) > > and in "features.c": > > ... > #if USE_FEATURE_X > // Code for feature X > > #endif > ... > > The source code file "features.c" that have code depending on the > preprocessor macro needs to be recompiled each time the option changes, which > does not automatically > happen if the macro is defined like above (and I _really_ need to have it > defined, either to zero or one...). > > So I pretty much need to hook a dependency of "features.c" to change of > cached cmake options/vars... > > Ideas? > TIA > /Rob AFAICS, with 2.8.4, the concerned files *are* recompiled: # CMakeLists.txt: CMAKE_MINIMUM_REQUIRED(VERSION 2.8.4 FATAL_ERROR) PROJECT(RECOMPILE C) SET(CMAKE_VERBOSE_MAKEFILE ON) OPTION(FEATURE_X "Check to enable feature X" OFF) IF(FEATURE_X) ADD_DEFINITIONS(-DUSE_FEATURE_X=1) ELSE(FEATURE_X) ADD_DEFINITIONS(-DUSE_FEATURE_X=0) ENDIF(FEATURE_X) ADD_EXECUTABLE(main main.c) /* main.c: */ int main(void){return 0;} After reconfiguring the project with an altered FEATURE_X value, you will see main.c being recompiled. This is due to the line CMakeFiles/main.dir/main.c.o: CMakeFiles/main.dir/flags.make in ${CMAKE_BINARY_DIR}/CMakeFiles/main.dir/build.make with the ${CMAKE_BINARY_DIR}/CMakeFiles/main.dir/flags.make containing: C_DEFINES = -DUSE_FEATURE_X=... It's this latter file which is modified when the preprocessor definitions change, and the object file's dependency provides for the recompilation. Can you confirm that? 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
Re: [CMake] Touching files on cache var changes
I do this by making a .in file that gets configured that contains the value of the CMake variable. header.h.in: === #define FEATURE_X @FEATURE_X@ CMakeLists.txt: === configure_file(${CMAKE_CURRENT_SOURCE_DIR}/header.h.in ${CMAKE_CURRENT_BINARY_DIR}/header.h @ONLY) include_directories(${CMAKE_CURRENT_BINARY_DIR}) features.c: === #include "header.h" Now, when FEATURE_X changes in cmake, header.h changes, which triggers a re-compile of any files that include it. HTH, David On Tue, May 17, 2011 at 11:45 AM, Robert Bielik wrote: > Hi all, > > I'm wondering if there's a way to touch files on cached var changes. Let's > say I have an option to enable or disable a feature > in my application, and depending on its setting a preprocessor macro is > defined (or not defined) in the CMakeLists.txt file: > > OPTION(FEATURE_X "Check to enable feature X" OFF) > > IF(FEATURE_X) > ADD_DEFINITIONS(-DUSE_FEATURE_X=1) > ELSE(FEATURE_X) > ADD_DEFINITIONS(-DUSE_FEATURE_X=0) > ENDIF(FEATURE_X) > > and in "features.c": > > ... > #if USE_FEATURE_X > // Code for feature X > > #endif > ... > > The source code file "features.c" that have code depending on the > preprocessor macro needs to be recompiled each time the option changes, > which does not automatically > happen if the macro is defined like above (and I _really_ need to have it > defined, either to zero or one...). > > So I pretty much need to hook a dependency of "features.c" to change of > cached cmake options/vars... > > Ideas? > TIA > /Rob > ___ > 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