Создание библиотеки в CMake в зависимости от исходных файлов, недоступных при создании файлов сборки - PullRequest
0 голосов
/ 31 августа 2018

У меня есть файл конфигурации CMake, в котором собраны две библиотеки:

  1. сторонняя библиотека (здесь она называется ThirdPartyLib), содержащая пакет поддержки ОС / платы в реальном времени от поставщика. Он построен вне CMake, используя набор инструментов autotools.
  2. расширенная версия прежней библиотеки (здесь она называется 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.)

1 Ответ

0 голосов
/ 31 августа 2018

Лично мне не нравится команда ExternalProject_Add, потому что она делает слишком много вещей на мой вкус, но я отвлекся.

Что делать, если вы делаете что-то подобное, где bar моделирует вашу цель ExtendedThirdPartyLib, поскольку она зависит от сгенерированных файлов

cmake_minimum_required(VERSION 3.11)

project(lol C)

set(SOURCES lol.c) # only this file exists

add_library(lol ${SOURCES})

set(FOO_FILES "foo1.c" "foo2.c")

add_custom_command(OUTPUT ${FOO_FILES}
  COMMAND ${CMAKE_COMMAND} -E touch ${FOO_FILES}
  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
  COMMENT "Creating ${FOO_FILES}"
  VERBATIM)

add_custom_target(foo DEPENDS ${FOO_FILES})

add_library(bar ${FOO_FILES})

add_dependencies(bar foo)

target_link_libraries(lol bar)

Весь подход основан на том факте, что метод, в котором производятся / генерируются файлы, определяется явным образом с помощью пользовательской команды и связанной пользовательской цели.

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

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