Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
CMake
CMake
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 3,298
    • Issues 3,298
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
  • Merge Requests 10
    • Merge Requests 10
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Operations
    • Operations
    • Incidents
    • Environments
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Analytics
    • Analytics
    • CI/CD
    • Repository
    • Value Stream
  • External Wiki
    • External Wiki
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • CMake
  • CMakeCMake
  • Issues
  • #20025

Closed
Open
Created Nov 26, 2019 by alcroito@alcroitoDeveloper

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.

ninja_deps_automoc.zip

To reproduce:

  1. Configure and build once.
  2. Uncomment the CMAKE_AUTOMOC_MOC_OPTIONS line in the project.
  3. Run ninja -d explain -v
  4. 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
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information
Assignee
Assign to
None
Milestone
None
Assign milestone
Time tracking
None
Due date
None