From 80f64cfcdafd3d0c4578ad7d559f38018d583c15 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Tue, 17 Jan 2023 19:00:17 +0000 Subject: [PATCH] Avoid unnecessary timestamp bumps on generated-games.h. If I re-run cmake in a Unix build directory, it unconditionally rewrites generated-games.h, which causes fuzzpuzz to be rebuilt. This is a waste of effort in the extremely common case where the rewritten generated-games.h is identical to the old one. Now we write the data to a temporary file first, and use cmake's 'configure_file' command to copy that to generated-games.h, because it so happens that configure_file checks if the two files are identical and avoids updating the timestamp on the destination file if so. (This will presumably also be a beneficial change on any other platform that uses generated_games.h in the build, such as OS X. I just hadn't noticed until it hit the build I most often re-run in an existing build directory.) cmake 3.21 has a more intuitively spelled command I could have used, called 'file(COPY_FILE src dst ONLY_IF_DIFFERENT)'. But we currently permit cmake all the way back to 3.5, so I can't use that. --- cmake/setup.cmake | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cmake/setup.cmake b/cmake/setup.cmake index 344d028..8f879e4 100644 --- a/cmake/setup.cmake +++ b/cmake/setup.cmake @@ -145,13 +145,16 @@ endfunction() function(write_generated_games_header) set(generated_include_dir ${CMAKE_CURRENT_BINARY_DIR}/include) set(generated_include_dir ${generated_include_dir} PARENT_SCOPE) + set(header_pre ${generated_include_dir}/generated-games.h.pre) + set(header ${generated_include_dir}/generated-games.h) file(MAKE_DIRECTORY ${generated_include_dir}) - file(WRITE ${generated_include_dir}/generated-games.h "") + file(WRITE ${header_pre} "") list(SORT puzzle_names) foreach(name ${puzzle_names}) - file(APPEND ${generated_include_dir}/generated-games.h "GAME(${name})\n") + file(APPEND ${header_pre} "GAME(${name})\n") endforeach() + configure_file(${header_pre} ${header} COPYONLY) endfunction() # This has to be run from the unfinished subdirectory, so that the