У меня есть файл конфигурации CMake, в котором собраны две библиотеки:
- сторонняя библиотека (здесь она называется ThirdPartyLib), содержащая пакет поддержки ОС / платы в реальном времени от поставщика. Он построен вне CMake, используя набор инструментов autotools.
- расширенная версия прежней библиотеки (здесь она называется ExtendedThirdPartyLib)
К сожалению, некоторые исходные коды, которые мне нужны (различные инструменты), не встроены в обычный сценарий сборки для (1). Поскольку я не хочу связываться со сценарием сборки поставщиков, я хочу добавить еще одну библиотеку (2), создающую недостающие файлы и, таким образом, расширяющую библиотеку у поставщика.
Я хочу иметь возможность сделать что-то подобное в CMakeFiles.txt
:
cmake_minimum_required(VERSION 3.2)
project(bsp)
include(ExternalProject)
ExternalProject_Add(
ThirdPartyLib
URL <http://some.url/bsp.tar.bz2
BUILD_COMMAND make -C ../external/ThirdPartyLib/src
)
set_target_properties(ThirdPartyLib PROPERTIES EXCLUDE_FROM_ALL TRUE)
add_library(ExtendedThirdPartyLib
${CMAKE_CURRENT_BINARY_DIR}/some/path/missing_file1.c
${CMAKE_CURRENT_BINARY_DIR}/some/path/missing_file2.c
)
add_dependencies(ExtendedThirdPartyLib ThirdPartyLib)
target_include_directories(ExtendedThirdPartyLib PUBLIC
${CMAKE_CURRENT_BINARY_DIR}/some/path/include
)
target_link_libraries(ExtendedThirdPartyLib ThirdPartyLib)
Проблема здесь в том, что путь к missing_file1.c
и missing_file2.c
недопустим, когда CMake генерирует файлы сборки (они извлекаются из архива от поставщика). CMake завершает работу с сообщением об ошибке: «Не удается найти исходный файл».
Есть ли хороший способ сделать эту работу? Т.е. Можно ли убедить CMake, что некоторые несуществующие входные файлы будут существовать, когда начнется сборка библиотеки? Или есть какой-нибудь другой рекомендуемый способ решить эту проблему?
(Я временно сделал локальные копии файлов, которые мне нужно собрать из архива поставщиков, но это, конечно, не очень хорошее решение. Если эти файлы будут изменены в будущих версиях пакета поставщиков, и я забуду перезаписать мои локальные копии это может быть ужасный беспорядок ...
Другим «решением» было бы создать небольшой make-файл вне CMake и каким-то образом использовать другой ExternalProject_Add
в CMakeFiles.txt. Но это тоже не очень хорошее решение, например если флаги компиляции и компоновщика изменены, мне нужно помнить также и файл makefile.)