Я наблюдаю странное поведение CMake.Если в моем проекте файл заголовка включен во все источники с помощью команды -include inc.h
с помощью команды ADD_COMPILE_OPTIONS(-include inc.h)
, тогда изменения в заголовке не обнаруживаются.Это означает, что я могу изменить заголовок, но CMake никогда не будет пытаться перекомпилировать main.cpp
.Я делаю что-то неправильно?Это ошибка CMake?Любой обходной путь?
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.12)
PROJECT(include_test)
SET(CMAKE_CXX_STANDARD 17)
INCLUDE_DIRECTORIES(.)
ADD_COMPILE_OPTIONS(
-include inc.h
)
ADD_EXECUTABLE(include_test main.cpp)
main.cpp
#include <iostream>
int main()
{
foo a;
std::cout << a.bar << std::endl;
return 0;
}
inc.h
struct foo
{
int bar = 1;
double baz = 3;
};
EDIT001: As @Olivпредлагает при попытке использовать что-то вроде SET_SOURCE_FILES_PROPERTIES(main.cpp PROPERTY OBJECT_DEPENDS inc.h)
Конечно, это не сработает, потому что зависимость должна быть целью, а не файлом, от которого зависит cpp, поэтому я добавил следующее:
ADD_CUSTOM_TARGET(HeaderChanged
DEPENDS
inc.h
COMMENT "Checking if include file has changed")
SET_SOURCE_FILES_PROPERTIES(main.cpp PROPERTY OBJECT_DEPENDS HeaderChanged)
, что все еще приводит к make[2]: *** No rule to make target 'HeaderChanged', needed by 'CMakeFiles/include_test.dir/main.cpp.o'. Stop.
несмотря на то, что цель HeaderChanged
существует