automoc failure if using target_link_libraries(PUBLIC) for library without .cpp files and precompiled headers
Hello, I just ran into the following issue ### Description * Library `A` has a `PUBLIC` precompiled header * Library `B` doesn't have any .cpp files * Library `B` uses the `Q_OBJECT` macro * Link the libraries by `target_link_libraries(B PUBLIC A)` I get the following error: ``` ninja: error: 'CMakeFiles/B.dir/.pch', needed by 'CMakeFiles/B.dir/B_autogen/mocs_compilation.cpp.obj', missing and no known rule to make it ``` ### The setup: * Using cmake version 3.18.0 * Using `Ninja` generator * Using windows compiler * Using Qt 5.14.2 msvc2017_64 Files: ```shell a.hpp a.cpp b.hpp CMakeLists.txt ``` `a.hpp`: ``` #pragma once class A {}; ``` `a.cpp`: ``` #include "a.hpp" ``` `b.hpp`: ``` #include "a.hpp" #include <QObject> class B : QObject{ Q_OBJECT }; ``` `CMakeLists.txt`: ``` cmake_minimum_required(VERSION 3.18) project(test LANGUAGES CXX) add_library(A a.cpp) target_include_directories(A PUBLIC "${CMAKE_CURRENT_LIST_DIR}") target_precompile_headers(A PUBLIC <a.hpp>) find_package(Qt5 COMPONENTS Core) set (CMAKE_AUTOMOC ON) add_library(B b.hpp) target_link_libraries(B PUBLIC A Qt5::Core) ``` This works with cmake version 3.17.3, but doesn't with 3.18.0 I know library `B` should be an `INTERFACE` library and shouldn't have the .hpp file put into the sources, but because the automoc generates a .cpp file library `B` becomes a normal library. It's only the precompiled header which breaks it. In case this "automoc makes `B` a non-interface library" is too much abuse (which I could totally understand) there should probably be a way to catch this error earlier, because it took me quite some time to narrow this down. (although I don't know enough about CMakes internals to know how to catch that.)
issue