2017-02-08 12 views
0

У меня есть проект, который использует внешнюю библиотеку. CMakeLists.txt проекта выглядит следующим образом:CMake: rebuild external project

cmake_minimum_required(VERSION 3.6.0) 

project(my-project) 

set(CMAKE_CXX_STANDARD 14) 

include(ExternalProject) 
find_package(Git REQUIRED) 

ExternalProject_Add(library 
     PREFIX ${my-project_SOURCE_DIR}/lib/library 
     GIT_REPOSITORY https://github.com/vendor/library 
     GIT_TAG master 
     UPDATE_COMMAND "" 
     INSTALL_COMMAND "" 
     ) 

link_directories(${my-project_SOURCE_DIR}/lib/library/src/library-build/src) 

add_subdirectory(src) 

И ЦСИ/CMakeLists.txt так:

include_directories(../lib/library/src/library/include) 

add_executable(my-project 
     main.cpp 
     ) 

add_dependencies(my-project library) 

target_link_libraries(my-project liblibrary.a) 

Он тянет библиотеку из Git и строит его в первый раз без каких-либо проблем.

Я хочу отредактировать исходный код библиотеки и автоматически перекомпилировать файл .a. Каким самым чистым способом я могу это достичь? В настоящее время он игнорирует любые обновления исходного кода, поскольку он уже имеет .a-файл библиотеки.

Когда я пытаюсь добавить

add_subdirectory(lib/library/src/library/src) 

к моей главной CMakeLists.txt, я получаю следующее сообщение об ошибке:

CMake Ошибка при Библиотека/Библиотека/SRC/библиотека/SRC/CMakeLists.txt: 55 (add_library): add_library не может создать целевую «библиотеку», потому что еще одна цель с тем же именем уже существует. Существующая цель - это настраиваемая цель, созданная в исходном каталоге «/ cygdrive/c/Code/my-project». Дополнительную информацию см. В документации по политике CMP0002.

Я предполагаю, что это вызвано вызовом

add_library(gram STATIC ${SOURCE_FILES}) 

в библиотеке CMakeLists.txt и затем вызвать

ExternalProject_Add(library ...) 

в проекте CMakeLists.txt.

Любые идеи?

+0

Либо включить другую библиотеку (с помощью 'add_subdirectory()'), либо через 'ExternalProject_add()'. Сообщение об ошибке должно быть понятным. –

+0

Как вы можете видеть, я уже использую 'ExternalProject_add()', и он не работает по своему желанию. 'add_subdirectory()' сам по себе не будет клонировать библиотеку из CVS. –

ответ

0

Как ваша главная цель использования ExternalProject_Add это загрузить зависимость от внешнего источника без настройки и построения, можно определить CMAKE_COMMAND, CONFIGURE_COMMAND и BUILD_COMMAND в виде пустых строк. То же, что вы уже сделали для UPDATE_COMMAND и INSTALL_COMMAND. Таким образом, ExternalProject_Add будет только клонировать репозиторий один раз.

Чтобы преодолеть столкновение имен, просто используйте другой для первого аргумента ExternalProject_Add, например. library_src:

ExternalProject_Add(library_src 
    PREFIX ${my-project_SOURCE_DIR}/lib/library 
    GIT_REPOSITORY https://github.com/vendor/library 
    GIT_TAG master 
    UPDATE_COMMAND "" 
    CONFIGURE_COMMAND "" 
    CMAKE_COMMAND "" 
    BUILD_COMMAND "" 
    INSTALL_COMMAND "" 
) 
ExternalProject_Get_Property(library_src SOURCE_DIR) 
add_subdirectory(${SOURCE_DIR}) 

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

 Смежные вопросы

  • Нет связанных вопросов^_^