AUTOMOC rebuild issue with Ninja when changing CMAKE_AUTOMOC_MOC_OPTIONS
Hi.
It seems that if AUTOMOC_MOC_OPTIONS is modified, and a project uses Ninja, you need to run ninja twice to get everything built.
On the first ninja invocation, automoc is executed and updates moc_foo.cpp files, and only on the second invocation, regular .cpp files that include moc_foo.cpp files get rebuilt.
This only happens with the Ninja generator, doesn't happen with Unix makefiles. Tested to happen on macOS + apple clang, Linux + gcc, and Windows + clang/mingw.
Attaching test project, it needs a Qt5 installation to build it successfully.
To reproduce:
- Configure and build once.
- Uncomment the CMAKE_AUTOMOC_MOC_OPTIONS line in the project.
- Run ninja -d explain -v
- Run ninja -d explain -v again (observe cpp files are rebuilt).
Here's the output of my ninja -d explain -v runs.
ninja explain: output build.ninja older than most recent input ../CMakeLists.txt (1574763959000000000 vs 1574763966000000000)
[0/1] /Users/alex/Dev/cmake/build/bin/cmake -S/Volumes/T3/Dev/projects/cmake/ninja_deps_automoc -B/Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build
-- Configuring done
-- Generating done
-- Build files have been written to: /Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build
ninja explain: output CMakeFiles/ninja_deps_automoc_autogen doesn't exist
ninja explain: ninja_deps_automoc_autogen/mocs_compilation.cpp is dirty
ninja explain: ninja_deps_automoc_autogen/mocs_compilation.cpp is dirty
ninja explain: CMakeFiles/ninja_deps_automoc_autogen is dirty
ninja explain: ninja_deps_automoc_autogen/mocs_compilation.cpp is dirty
ninja explain: CMakeFiles/ninja_deps_automoc.dir/ninja_deps_automoc_autogen/mocs_compilation.cpp.o is dirty
ninja explain: ninja_deps_automoc is dirty
[1/3] cd /Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build && /Users/alex/Dev/cmake/build/bin/cmake -E cmake_autogen /Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build/CMakeFiles/ninja_deps_automoc_autogen.dir/AutogenInfo.json ""
AutoGen: Refreshing parse cache because the settings changed.
AutoMoc: Generating "SRC:/build/ninja_deps_automoc_autogen/moc_predefs.h", because the moc settings changed.
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -dM -E -c /Users/alex/Dev/cmake/Modules/CMakeCXXCompilerABI.cpp -DQT_CORE_LIB -DQT_NO_DEBUG -I/Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build -I/Volumes/T3/Dev/projects/cmake/ninja_deps_automoc -I/Volumes/T3/Dev/qt/official_qt/5.12.4/clang_64/lib/QtCore.framework -I/Volumes/T3/Dev/qt/official_qt/5.12.4/clang_64/lib/QtCore.framework/Headers -I/Volumes/T3/Dev/qt/official_qt/5.12.4/clang_64/mkspecs/macx-clang -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 -I/usr/local/include -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/10.0.1/include -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -I/usr/include -F /Volumes/T3/Dev/qt/official_qt/5.12.4/clang_64/lib
AutoMoc: Touching "SRC:/build/ninja_deps_automoc_autogen/moc_predefs.h"
AutoGen: Parsing "SRC:/main.h"
AutoGen: Parsing "SRC:/main.cpp"
AutoMoc: Generating "SRC:/build/ninja_deps_automoc_autogen/include/moc_main.cpp", because the uic settings changed, from "SRC:/main.h"
/Volumes/T3/Dev/qt/official_qt/5.12.4/clang_64/bin/moc -DQT_CORE_LIB -DQT_NO_DEBUG -I/Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build -I/Volumes/T3/Dev/projects/cmake/ninja_deps_automoc -I/Volumes/T3/Dev/qt/official_qt/5.12.4/clang_64/lib/QtCore.framework -I/Volumes/T3/Dev/qt/official_qt/5.12.4/clang_64/lib/QtCore.framework/Headers -I/Volumes/T3/Dev/qt/official_qt/5.12.4/clang_64/mkspecs/macx-clang -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 -I/usr/local/include -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/10.0.1/include -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -I/usr/include -F /Volumes/T3/Dev/qt/official_qt/5.12.4/clang_64/lib --include /Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build/ninja_deps_automoc_autogen/moc_predefs.h -p ./ "-I ." -o /Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build/ninja_deps_automoc_autogen/include/moc_main.cpp /Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/main.h
AutoGen: Writing the parse cache file "SRC:/build/CMakeFiles/ninja_deps_automoc_autogen.dir/ParseCache.txt"
AutoGen: Writing the settings file "SRC:/build/CMakeFiles/ninja_deps_automoc_autogen.dir/AutogenUsed.txt"
╭─alex@alexandru_imac /Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build
╰─$ ninja -d explain -v
ninja explain: output CMakeFiles/ninja_deps_automoc_autogen doesn't exist
ninja explain: ninja_deps_automoc_autogen/mocs_compilation.cpp is dirty
ninja explain: ninja_deps_automoc_autogen/mocs_compilation.cpp is dirty
ninja explain: CMakeFiles/ninja_deps_automoc_autogen is dirty
ninja explain: ninja_deps_automoc_autogen/mocs_compilation.cpp is dirty
ninja explain: CMakeFiles/ninja_deps_automoc.dir/ninja_deps_automoc_autogen/mocs_compilation.cpp.o is dirty
ninja explain: output CMakeFiles/ninja_deps_automoc.dir/main.cpp.o older than most recent input ninja_deps_automoc_autogen/include/moc_main.cpp (1574763960000000000 vs 1574763971000000000)
ninja explain: CMakeFiles/ninja_deps_automoc.dir/main.cpp.o is dirty
ninja explain: ninja_deps_automoc is dirty
[1/4] cd /Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build && /Users/alex/Dev/cmake/build/bin/cmake -E cmake_autogen /Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build/CMakeFiles/ninja_deps_automoc_autogen.dir/AutogenInfo.json ""
[2/3] /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -DQT_CORE_LIB -DQT_NO_DEBUG -I. -I../ -Ininja_deps_automoc_autogen/include -iframework /Volumes/T3/Dev/qt/official_qt/5.12.4/clang_64/lib -isystem /Volumes/T3/Dev/qt/official_qt/5.12.4/clang_64/lib/QtCore.framework/Headers -isystem /Volumes/T3/Dev/qt/official_qt/5.12.4/clang_64/./mkspecs/macx-clang -fPIC -std=gnu++11 -MD -MT CMakeFiles/ninja_deps_automoc.dir/main.cpp.o -MF CMakeFiles/ninja_deps_automoc.dir/main.cpp.o.d -o CMakeFiles/ninja_deps_automoc.dir/main.cpp.o -c ../main.cpp
[3/3] : && /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/ninja_deps_automoc.dir/ninja_deps_automoc_autogen/mocs_compilation.cpp.o CMakeFiles/ninja_deps_automoc.dir/main.cpp.o -o ninja_deps_automoc -Wl,-rpath,/Volumes/T3/Dev/qt/official_qt/5.12.4/clang_64/lib /Volumes/T3/Dev/qt/official_qt/5.12.4/clang_64/lib/QtCore.framework/QtCore && :
╭─alex@alexandru_imac /Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build
╰─$ ninja -d explain -v
ninja explain: output CMakeFiles/ninja_deps_automoc_autogen doesn't exist
ninja explain: ninja_deps_automoc_autogen/mocs_compilation.cpp is dirty
ninja explain: ninja_deps_automoc_autogen/mocs_compilation.cpp is dirty
ninja explain: CMakeFiles/ninja_deps_automoc_autogen is dirty
ninja explain: ninja_deps_automoc_autogen/mocs_compilation.cpp is dirty
ninja explain: CMakeFiles/ninja_deps_automoc.dir/ninja_deps_automoc_autogen/mocs_compilation.cpp.o is dirty
ninja explain: ninja_deps_automoc is dirty
[1/3] cd /Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build && /Users/alex/Dev/cmake/build/bin/cmake -E cmake_autogen /Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build/CMakeFiles/ninja_deps_automoc_autogen.dir/AutogenInfo.json ""
╭─alex@alexandru_imac /Volumes/T3/Dev/projects/cmake/ninja_deps_automoc/build