Как я могу указать подключаемый каталог, который будет использоваться при компиляции сгенерированного c исходного файла? - PullRequest
1 голос
/ 08 июля 2020

У меня есть CMakeLists.txt:

add_custom_command(OUTPUT chattr.tab.cpp
  DEPENDS table_gen
  COMMAND ./table_gen > chattr.tab.cpp
)

Это помещает сгенерированный исходный файл chattr.tab.cpp в каталог объектов (как я хочу). Однако в результате #include "someheader.h" внутри chattr.tab.cpp не находит тот заголовок, который находится в исходном каталоге.

Этот сгенерированный файл добавляется только к некоторым целям. Есть ли способ вызвать добавление некоторого каталога include при компиляции этого сгенерированного исходного файла (в CMakeFiles/sometarget.dir/chattr.tab.cpp.o) и только при компиляции этого исходного файла? В отличие от добавления каталога include для всех целей, которые его используют? Последнее потребует добавления нескольких target_include_directories() и приведет к тому, что включение будет использоваться для каждого исходного файла этой цели, а не только для сгенерированного исходного файла.

EDIT:

Согласно squareskittles ответ, я создал следующий файл CMakeLists.txt (показывает только нижнюю часть):

....
#=================================================================
# GENERATED SOURCE FILES
#

add_executable(table_gen table_gen.cxx)

add_custom_command(OUTPUT chattr.tab.cpp
  DEPENDS table_gen
  COMMAND ./table_gen > chattr.tab.cpp
)

add_custom_command(OUTPUT PgnGrammar.h
  DEPENDS generate_PgnGrammar.h.sh
  COMMAND ${CMAKE_CURRENT_LIST_DIR}/generate_PgnGrammar.h.sh
)

set(GENERATED_SOURCES chattr.tab.cpp PgnGrammar.h)

set_source_files_properties(chattr.tab.cpp PROPERTIES
  INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}"  # For local header files.
)

#=================================================================
# TEST EXECUTABLES
#

add_executable(tstchessposition tstchessposition.cxx)
target_link_libraries(tstchessposition PRIVATE AICxx::cwchessboard AICxx::cwds)

add_executable(tstbenchmark tstbenchmark.cxx)
target_link_libraries(tstbenchmark PRIVATE AICxx::cwchessboard AICxx::cwds)

add_executable(tstpgnread tstpgnread.cxx PgnDatabase.cxx MemoryBlockList.cxx ${GENERATED_SOURCES})
target_link_libraries(tstpgnread PRIVATE AICxx::cwchessboard AICxx::cwds)

add_executable(tsticonv tsticonv.cxx)
target_link_libraries(tsticonv PRIVATE PkgConfig::glibmm)

add_executable(tstpgn tstpgn.cxx PgnDatabase.cxx MemoryBlockList.cxx ${GENERATED_SOURCES})
target_link_libraries(tstpgn PRIVATE AICxx::cwchessboard AICxx::cwds)

add_executable(tstspirit tstspirit.cxx PgnGrammar.h)
target_include_directories(tstspirit PUBLIC "${top_objdir}")

Но это приводит к:

[ 51%] Generating chattr.tab.cpp
./table_gen > chattr.tab.cpp
[ 54%] Generating chattr.tab.cpp
./table_gen > chattr.tab.cpp

По-видимому, потому что оба, tstpgnread и tstpgn ссылка с chattr.tab.cpp, генерируется ДВАЖДЫ ?! Это ошибка в CMake или я что-то делаю не так?

Ответы [ 2 ]

1 голос
/ 09 июля 2020
• 1000 *.
0 голосов
/ 08 июля 2020

Аналогично сообщению " переопределить флаги компиляции для отдельных файлов ", вы можете изменить свойство INCLUDE_DIRECTORIES исходного файла для одного файла:

set_source_files_properties(chattr.tab.cpp PROPERTIES 
    INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/other/include/dir
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...