Build out-of-date issue with AUTOMOC, Ninja and policy CMP0116 (CMake 3.20)
A project that uses AUTOMOC, Qt5, Ninja and sets policy CMP0116
will always cause rebuilds.
Sample project:
# $ cat CMakeLists.txt
cmake_minimum_required(VERSION 3.19)
project(cmake_policy_116_automoc LANGUAGES CXX)
if(POLICY CMP0116)
cmake_policy(SET CMP0116 NEW)
endif()
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
find_package(Qt5Core REQUIRED)
add_subdirectory(subdir)
# $ cat subdir/CMakeLists.txt
set(source "${CMAKE_CURRENT_BINARY_DIR}/main.cpp")
file(GENERATE OUTPUT "${source}"
CONTENT "
#include <QCoreApplication>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
return a.exec();
}
")
add_library(mylib SHARED "${source}")
target_link_libraries(mylib PRIVATE Qt::Core)
How to build:
mkdir build && cd build
cmake .. -DCMAKE_PREFIX_PATH=/path/to/Qt5
Observe issue
$ ninja
[4/4] Linking CXX shared library subdir/libmylib.dylib
$ ninja
[3/3] Linking CXX shared library subdir/libmylib.dylib
$ ninja -d explain
ninja explain: expected depfile '/Volumes/T3/Dev/projects/cmake/general/cmake_policy_116_automoc/build/CMakeFiles/d/914895fab0e0259559e55f8ec67185f7de3ac33429e607ca180214b87a4ea5ed.d' to mention 'subdir/mylib_autogen/timestamp', got 'subdir/subdir/mylib_autogen/timestamp'
ninja explain: subdir/mylib_autogen/timestamp is dirty
ninja explain: subdir/mylib_autogen/mocs_compilation.cpp is dirty
ninja explain: subdir/mylib_autogen/mocs_compilation.cpp is dirty
ninja explain: subdir/CMakeFiles/mylib_autogen is dirty
ninja explain: subdir/mylib_autogen/mocs_compilation.cpp is dirty
ninja explain: subdir/mylib_autogen/timestamp is dirty
ninja explain: subdir/CMakeFiles/mylib.dir/mylib_autogen/mocs_compilation.cpp.o is dirty
ninja explain: subdir/libmylib.dylib is dirty
ninja explain: subdir/all is dirty
[3/3] Linking CXX shared library subdir/libmylib.dylib
Notice the double subdir
in the depfile.