CMake / make apply -D флаги в заголовочных файлах - PullRequest
0 голосов
/ 29 мая 2018

Я (кросс-) компилирую разделяемую библиотеку C с поддержкой множества различных платформ, которая обрабатывается иерархией файлов CMakeLists.В этих файлах несколько флагов компилятора для конкретной платформы создаются условно (с add_definitions()).Я могу успешно скомпилировать и связать исходный код, ведущий к соответствующему файлу .so.

Но чтобы использовать библиотеку в любом проекте, мне нужно также предоставить правильные заголовочные файлы.Следующая команда install CMake выбирает нужные файлы заголовков для копирования, но не применяется, замена препроцессора определяет / включает :

install(FILES ${headers} DESTINATION include/mylibrary)

Так как я могу сгенерировать / установить «посткомпилированные» заголовочные файлы?

Что я думал до сих пор:

  • Как add_definitions() должен составлять мои -D в переменной COMPILE_DEFINITIONS, возможно, запускает цикл foreach на скопированных необработанных заголовках и заменяет заполнители define / include?
  • Использование add_custom_command() для применения некоторой логики перед копированием?

Редактировать : Как указал Цыварев, здесь есть ответ, очень близкий к моим потребностям здесь , но, к сожалению, не совсем так.Таким образом, ответ дает 2 варианта:

  • Включить специальный заголовок 'config' во все заголовки библиотеки и использовать команду cmakedefine для вызова configure_file() для этого заголовка. Я не могу использовать этот подход, потому что не хочу изменять заголовки библиотеки.
  • Создайте целевой файл .cmake, который помогает внешним проектам включать правильные заголовки вместе свсе необходимое -D определяет. Я тоже не могу использовать этот подход, потому что мои внешние проекты не используют cmake для сборки.Кроме того, я хотел бы создать библиотеку, которую было бы так легко включить.

Любые другие мысли?

Редактировать 2 : я могуЯ должен уточнить мое утверждение, что команда install CMake не заменяет определения.Возьмем следующий пример:

//sampleheader.hpp
#ifndef SAMPLEHEADER_HPP_
#define SAMPLEHEADER_HPP_

#include OS_SPECIFIC_HEADER

//...

Теперь у меня есть файл CMakeLists.txt, который делает что-то вроде этого:

# ...
if (${OS} MATCHES "arm-emblinux")
    add_definitions(-DOS_SPECIFIC_HEADER="emblinuxHeader.hpp")
elseif (${OS} MATCHES "linux")
    add_definitions(-DOS_SPECIFIC_HEADER="linuxHeader.hpp")
endif()
# ...

Все компилируется нормально, но когда команда install выше получаетвызвал, у меня есть файл заголовка в моей ../include/ директории, все еще с заполнителем OS_SPECIFIC_HEADER в нем.И, конечно, это не может быть должным образом включено в любой проект разработки.

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