Дополнительные interface_include_directories для файлов схемы.Является ли это возможным? - PullRequest
0 голосов
/ 29 декабря 2018

Я успешно использовал target_include_directories() для передачи требований использования зависимым библиотекам C ++.Все работает очень хорошо.Но здесь есть немного другой вариант использования.

Есть ли способ иметь второй набор включаемых каталогов в дополнение к обычному (то есть, для заголовков C / C ++)?

Это может быть удобно, если, например, у вас есть библиотеки C ++, которые сгенерированы из языка схемы (например, Protobuf, Capnproto) с add_custom_command().Файлы схемы могут ссылаться друг на друга import, поэтому я хотел бы установить файлы схемы вместе с библиотеками.

Было бы неплохо передать информацию зависимым библиотекам о каталогах файлов схемы.в качестве каталогов для заголовков C ++.

Использование target_include_directories() для отслеживания каталогов, не содержащих заголовки C / C ++, может быть неправильным использованием этой команды.Но, может быть, есть какой-то другой способ добиться этого?

Edit 1 :

Просто пояснение: моя цель - иметь два набора путей к каталогам, один дляC ++ включает заголовки и еще один для файлов схемы.(Файлы схемы и заголовки C ++ могут не находиться в одинаковых каталогах).Свойство INTERFACE_INCLUDE_DIRECTORIES будет обрабатывать заголовки C ++, но как мне обрабатывать файлы схемы?

yet_to_be_written_ADD_CAPNP_TARGET(
  NAME target1 
  SCHEMA ${CMAKE_CURRENT_SOURCE_DIR}/a1.capnp 
)
yet_to_be_written_ADD_CAPNP_TARGET(
  NAME target2 
  SCHEMA ${CMAKE_CURRENT_SOURCE_DIR}/a2.capnp
  DEPENDENCIES target1
)

Обходное решение может позволить yet_to_be_written_ADD_CAPNP_TARGET() создать две библиотеки

add_library(${name}_cxx)
add_library(${name}_schema INTERFACE)

вместо одной библиотеки, потому что тогда у меня будет два INTERFACE_INCLUDE_DIRECTORIES, которые могут запомнить пути к каталогам.Целью ${name}_schema было бы просто запомнить пути к каталогам схемы.Позже они могут быть получены с помощью выражения генератора $<TARGET_PROPERTY:target2_schema,INTERFACE_INCLUDE_DIRECTORIES>

и переданы компилятору схемы (/usr/bin/capnp) в виде add_custom_command()

Конечно, этоВсе упражнение довольно бессмысленно, если все файлы схемы доступны в дереве исходного кода данного программного проекта, но я думаю о сценарии, когда цели cmake были бы импортированы из различных внешних программных проектов.Файлы схемы могут быть установлены в разных каталогах.

Другим обходным решением может быть непосредственное указание путей к каталогам внешних схем (без использования целей для передачи этой информации).

1 Ответ

0 голосов
/ 29 декабря 2018

Конечно.Я делаю это сам в проекте, над которым я работал с файлами ProtoBuf:

set(Aperture_PROTO
    protoinclude/bcl.proto
    protoinclude/StratusAsset.proto)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${Aperture_PROTO})

Вывести файлы прото в качестве исходных файлов, чтобы они обрабатывались с целью:

LIST(APPEND Aperture_SRCS ${Aperture_PROTO})

Убедитесь, чточтобы добавить HEADER_FILE_ONLY свойств в файловую группу:

SET_SOURCE_FILES_PROPERTIES(${Aperture_PROTO}
                        PROPERTIES HEADER_FILE_ONLY TRUE)

Группируйте их отчетливо в IDE, используя source_group для бонусных баллов:

source_group("Prototype Files" FILES ${Aperture_PROTO})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...