Я (кросс-) компилирую разделяемую библиотеку 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 в нем.И, конечно, это не может быть должным образом включено в любой проект разработки.