GCC включил заголовок (используя `-include`) изменения, не обнаруженные CMake - PullRequest
0 голосов
/ 07 октября 2018

Я наблюдаю странное поведение 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 существует

1 Ответ

0 голосов
/ 07 октября 2018

На вашем EDIT0001: вам, вероятно, нужно указать полный путь к inc.h, чтобы Makefile знал, где его найти (поскольку вы, скорее всего, делаете сборку вне исходного кода), то есть:

SET_SOURCE_FILES_PROPERTIES(main.cpp PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/inc.h)

Также обратите внимание, что решение OBJECT_DEPENDS не будет работать для Visual Studio (и флаг -include) также не работает.Но в Visual Studio было достаточно добавить ADD_COMPILE_OPTIONS(/FIinc.h), и он автоматически обнаружит изменения в inc.h.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...