I tried this out. The short story is that it works the way he states. Changing the CMakeLists.txt cause CMake to rerun the ZERO_CHECK but the executable generates a 0. Running the build again doesn't change anything. Here is the transcript of the run:
-------------------------8<--------------------------------------------- --- c:\dev2\TestProgs\CMake_Rebuild\b3>cmake --version cmake version 2.8.7 c:\dev2\TestProgs\CMake_Rebuild\b3>cat ..\CMakeLists.txt CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) PROJECT(BUILD C) FILE(WRITE ${CMAKE_BINARY_DIR}/main.c "#include <stdio.h> int main(void) { printf(\"%d\\n\",NUMBER); return 0; } ") ADD_EXECUTABLE(main main.c) SET_TARGET_PROPERTIES(main PROPERTIES COMPILE_DEFINITIONS NUMBER=0) c:\dev2\TestProgs\CMake_Rebuild\b3>cmake -G "Visual Studio 9 2008" .. -- Check for working C compiler using: Visual Studio 9 2008 -- Check for working C compiler using: Visual Studio 9 2008 -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Configuring done -- Generating done -- Build files have been written to: C:/dev2/TestProgs/CMake_Rebuild/b3 c:\dev2\TestProgs\CMake_Rebuild\b3>cat ..\CMakeLists.txt CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) PROJECT(BUILD C) FILE(WRITE ${CMAKE_BINARY_DIR}/main.c "#include <stdio.h> int main(void) { printf(\"%d\\n\",NUMBER); return 0; } ") ADD_EXECUTABLE(main main.c) SET_TARGET_PROPERTIES(main PROPERTIES COMPILE_DEFINITIONS NUMBER=1) c:\dev2\TestProgs\CMake_Rebuild\b3>cmake --build . Microsoft (R) Visual Studio Version 9.0.30729.1. Copyright (C) Microsoft Corp. All rights reserved. 1>------ Build started: Project: ZERO_CHECK, Configuration: Debug Win32 ------ 1>Checking Build System 1>CMake is re-running because C:/dev2/TestProgs/CMake_Rebuild/b3/CMakeFiles/generate.stamp is out-of-date. 1> the file 'C:/dev2/TestProgs/CMake_Rebuild/CMakeLists.txt' 1> is newer than 'C:/dev2/TestProgs/CMake_Rebuild/b3/CMakeFiles/generate.stamp.depend' 1> result='-1' 1>-- Configuring done 1>-- Generating done 1>-- Build files have been written to: C:/dev2/TestProgs/CMake_Rebuild/b3 1>Build log was saved at "file://c:\dev2\TestProgs\CMake_Rebuild\b3\ZERO_CHECK.dir\Debug\BuildLog .htm" 1>ZERO_CHECK - 0 error(s), 0 warning(s) 2>------ Build started: Project: main, Configuration: Debug Win32 ------ 2>Compiling... 2>main.c 2>Compiling manifest to resources... 2>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1 2>Copyright (C) Microsoft Corporation. All rights reserved. 2>Linking... 2>Embedding manifest... 2>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1 2>Copyright (C) Microsoft Corporation. All rights reserved. 2>Build log was saved at "file://c:\dev2\TestProgs\CMake_Rebuild\b3\main.dir\Debug\BuildLog.htm" 2>main - 0 error(s), 0 warning(s) ========== Build: 2 succeeded, 0 failed, 1 up-to-date, 0 skipped ========== c:\dev2\TestProgs\CMake_Rebuild\b3>Debug\main.exe 0 c:\dev2\TestProgs\CMake_Rebuild\b3>cmake --build . Microsoft (R) Visual Studio Version 9.0.30729.1. Copyright (C) Microsoft Corp. All rights reserved. ========== Build: 0 succeeded, 0 failed, 3 up-to-date, 0 skipped ========== c:\dev2\TestProgs\CMake_Rebuild\b3>Debug\main.exe 0 -------------------------8<--------------------------------------------- --- I tried this first with a 2.8.4 version I had installed on that box (older dev box here at work that still had vs2008 on it had 2.8.4 installed). Here is its transcript: -------------------------8<--------------------------------------------- --- c:\dev2\TestProgs\CMake_Rebuild\b>cmake --version cmake version 2.8.4 c:\dev2\TestProgs\CMake_Rebuild\b>cat ..\CMakeLists.txt CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) PROJECT(BUILD C) FILE(WRITE ${CMAKE_BINARY_DIR}/main.c "#include <stdio.h> int main(void) { printf(\"%d\\n\",NUMBER); return 0; } ") ADD_EXECUTABLE(main main.c) SET_TARGET_PROPERTIES(main PROPERTIES COMPILE_DEFINITIONS NUMBER=0) c:\dev2\TestProgs\CMake_Rebuild\b>cmake .. -- Building for: NMake Makefiles -- The C compiler identification is MSVC -- Check for CL compiler version -- Check for CL compiler version - 1500 -- Check if this is a free VC compiler -- Check if this is a free VC compiler - no -- Check for working C compiler: c:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin/cl.exe -- Check for working C compiler: c:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin/cl.exe -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Configuring done -- Generating done -- Build files have been written to: C:/dev2/TestProgs/CMake_Rebuild/b c:\dev2\TestProgs\CMake_Rebuild\b>cat ..\CMakeLists.txt CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) PROJECT(BUILD C) FILE(WRITE ${CMAKE_BINARY_DIR}/main.c "#include <stdio.h> int main(void) { printf(\"%d\\n\",NUMBER); return 0; } ") ADD_EXECUTABLE(main main.c) SET_TARGET_PROPERTIES(main PROPERTIES COMPILE_DEFINITIONS NUMBER=1) c:\dev2\TestProgs\CMake_Rebuild\b>cmake --build . -- Configuring done -- Generating done -- Build files have been written to: C:/dev2/TestProgs/CMake_Rebuild/b Scanning dependencies of target main [100%] Building C object CMakeFiles/main.dir/main.c.obj main.c Linking C executable main.exe [100%] Built target main c:\dev2\TestProgs\CMake_Rebuild\b>main.exe 1 -------------------------8<--------------------------------------------- --- One interesting difference I noticed was that when I went to try this with 2.8.7 from a vs 2008 command prompt, it configured with vs 2010. I had to specify -G"Visual Studio 9 2008" to get the 2008 configuration. Let me know if you want me to try anything else. Aaron Meadows -----Original Message----- From: cmake-boun...@cmake.org [mailto:cmake-boun...@cmake.org] On Behalf Of Michael Hertling Sent: Thursday, February 09, 2012 8:52 AM To: cmake@cmake.org Subject: Re: [CMake] MSBuild and automatic project file regenation On 01/13/2012 08:02 PM, Michael Hertling wrote: > On 01/13/2012 03:42 PM, Bill Hoffman wrote: >> On 1/13/2012 9:10 AM, Michael Hertling wrote: >> >>> With CMake 2.8.7 and VS 2008, I can report the following findings: >>> >>> (1) Starting out from within an empty build directory: "cmake .." >>> followed by "cmake --build ." configures/builds as expected. >>> (2) Tweaking CMakeLists.txt file only and leaving sources alone. >>> (3) "cmake --build ." rebuilds the ZERO_CHECK target and, thus, >>> updates the project file to reflect the changes from (2). >>> However, the corresponding target is not rebuilt and, >>> thus, does not reflect the changes from (2). >>> (4) A further "cmake --build ." does *nothing* - definitely. >>> (5) To get the concerned target rebuilt, I need to apply >>> David's hint, i.e. "cmake .&& cmake --build .", or >>> clean first, i.e. "cmake --build . --clean-first". >> >> Can you provide an example and how to reproduce this? >> >> I find it hard to believe that >> >> cmake --build . >> cmake --build . >> >> will not build everything. >> >> I get that the ZERO_TARGET does not get things to reload, but I don't >> see how the second build would not get things up to date. It has >> nothing to do with the project files depending on the targets. I >> assume something really changed and there really needs to be a >> rebuild? What type of thing are you changing in the CMakeLists.txt? >> >> -Bill > > Look at the following exemplary project: > > CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) PROJECT(BUILD C) > FILE(WRITE ${CMAKE_BINARY_DIR}/main.c "#include <stdio.h> int > main(void) { > printf(\"%d\\n\",NUMBER); return 0; } > ") > ADD_EXECUTABLE(main main.c) > SET_TARGET_PROPERTIES(main PROPERTIES > COMPILE_DEFINITIONS NUMBER=0) > > Steps to reproduce with CMake 2.8.7 and VS 2008: > > (1) From within an empty build directory: "cmake <srcdir>" followed > by "cmake --build ." configures/builds correctly; "Debug\main" > yields "0" as expected. > (2) At the end of CMakeLists.txt, change "NUMBER=0" to "NUMBER=1". > (3) "cmake --build ." triggers the ZERO_CHECK target, regenerates > main.vcproj but doesn't use the latter for rebuilding "main". > Accordingly, "Debug\main" still yields "0". > Assuming that MSBuild/devenv/<whatever> doesn't load the re- > generated project file into the currently running instance, > I can well understand this behavior, but: > (4) A further "cmake --build ." does nothing; in particular, it > does not rebuild "main", and "Debug\main" still yields "0". > Here, I'd expect that the regenerated project file is > loaded and the associated target rebuilt. > > (5) Rebuilding the "main" target can be achieved via David's hint > "cmake . && cmake --build ." or by cleaning before, e.g. via > "cmake --build . --clean-first". Afterwards, "Debug\main" > finally yields "1". > > For additional information, if one modifies the main.vcproj file by > hand, a subsequent "cmake --build ." also does nothing, as well as > "msbuild BUILD.sln /t:main" or "msbuild main.vcproj". > > Regards, > > Michael Any findings w.r.t. this issue? Can anyone reproduce it? Is it actually faulty behavior, possibly worth a bug report? If so, can it be fixed in some way? David Cole mentioned something like that. Although this isn't really disastrous, it would be quite nice if everything is up-to-date after a "cmake --build ." command, as one is used to with Makefiles. 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 This email was sent to you by Thomson Reuters, the global news and information company. Any views expressed in this message are those of the individual sender, except where the sender specifically states them to be the views of Thomson Reuters. -- 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