Как правильно настроить пути включения с простым проектом CMake - PullRequest
1 голос
/ 18 марта 2019

У меня есть проект CMake для кросс-компиляции исполняемых файлов для STM32. Структура проекта включает в себя папки для различных необходимых зависимостей, где исходные файлы и файлы заголовков включены в эти папки. Файл CMakeLists.txt для создания проекта так же прост, как настройка для кросс-компиляции и затем glob сборка исходников из каждой зависимости и кода пользователя с последующим установкой расположения всех заголовков с помощью include_directories. Наконец, add_executable используется для объединения всего и построения двоичного файла.

Я понимаю, что это, вероятно, не самый оптимальный способ сделать это (вероятно, следует собрать deps как библиотеки), но пока он работает.

Проблема возникает с депо, имеющим много слоев подкаталогов (lwIP), а файлы исходного кода и заголовка содержат операторы include, которые являются ссылками на уровни подкаталогов в этом депо. Например, структура файла lwIP выглядит следующим образом:

> LwIP
    | include
        | lwip
            | err.h
        | netif

Исходный файл lwIP (или заголовочный файл!) Может содержать «lwip / err.h». Конечно, препрокат не может найти этот файл, потому что относительный путь к нему не имеет смысла.

Как мне настроить этот проект так, чтобы эти включения могли использоваться без изменения исходных файлов или заголовочных файлов?

1 Ответ

0 голосов
/ 18 марта 2019

Обычный способ обойти эту проблему - создать собственный модуль поиска, например FindXXX.cmake (в вашем случае это FindLwIP.cmake), чтобы вы могли создать переменную LwIP_INCLUDE_DIRS в пакете.

set(LwIP_INCLUDE_DIRS
    ${CMAKE_CURRENT_LIST_DIR}/../LwIP/include
    ${CMAKE_CURRENT_LIST_DIR}/../LwIP
    ${CMAKE_CURRENT_LIST_DIR}/../LwIP/include/XXX)
.
.
(omitted..)
.
.
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LwIP DEFAULT_MSG LwIP_INCLUDE_DIRS LwIP_SOURCES LwIP_HEADERS)

С помощью вышеуказанного модуля поиска ваше приложение может корректно включать пакет и использовать переменные, созданные с помощью модуля find.

find_package(LwIP REQUIRED)
.
.
(omitted...)
.
.
include_directories(LwIP_INCLUDE_DIRS)
add_executable(${PROJECT_NAME}.elf ${SOURCES})

Поскольку ваша работа связана с STM32 и cmake, давайтеЯ дам вам отличную справку, которая будет хорошей отправной точкой для вашей работы.

https://github.com/ObKo/stm32-cmake.git

Надеюсь, это поможет.

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