Использование ExternalProject_Add с ITK

Я пытаюсь очень просто использовать ExternalProject против ITK. Это позволит моему автоматизированному подчиненному устройству jenkins извлекать ITK напрямую вместо использования системной библиотеки (поэтому я оставляю возможность использовать ExternalProject или нет).

Итак, я написал следующий фрагмент кода:

set(ITK_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/ITK")
set(ITK_INSTALL_PREFIX "${ITK_PREFIX}/install-$<CONFIG>")
ExternalProject_Add(ITK
URL http://sourceforge.net/projects/itk/files/itk/4.6/InsightToolkit-4.6.1.tar.xz
URL_MD5 d8dcab9193b55d4505afa94ab46de699
PREFIX ${ITK_PREFIX}
CMAKE_ARGS -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_EXAMPLES:BOOL=OFF -DBUILD_TESTING:BOOL=OFF -DModule_ITKReview:BOOL=ON -DITK_USE_SYSTEM_GDCM:BOOL=ON -DCMAKE_INSTALL_PREFIX=${ITK_INSTALL_PREFIX} -DGDCM_DIR:PATH=${GDCM_INSTALL_PREFIX}
BUILD_COMMAND "${CMAKE_COMMAND}" --build . --target install --config $<CONFIG>
)
# include directory:
include_directories(${ITK_INSTALL_PREFIX}/include/ITK-4.6)
# link directory:
#link_directories(${ITK_INSTALL_PREFIX}/lib/) # $ sign is escaped
link_directories(${ITK_PREFIX}/install-/lib)

Но тогда я не понимаю, как я могу заполнить следующую переменную: ITK_LIBRARIES, которую я использовал в своей кодовой базе.

Как мне написать:

set(ITK_LIBRARIES
  itksys-4.6
  ITKCommon-4.6
  ITKIOImageBase-4.6
  ITKIOMeta-4.6
  ITKIOGDCM-4.6
  pthread
  ...? possibly others ? possibly different order ? ...
)

Это похоже на взлом, который чрезвычайно сложно поддерживать, особенно. учитывая, что мне нужно связать с статическими библиотеками (требования для меня).


Очевидно, волшебным решением для меня было бы запустить find_package(ITK) и все. Но поскольку ExternalProject выполняются во время сборки, а не во время настройки, я не могу использовать это (ссылка).


Поскольку люди считают, что это дубликат, позвольте мне настаивать: «Да, я понимаю, что не могу использовать find_package». Мой вопрос совершенно другой и скорее касается сложного случая статической компоновки.


person malat    schedule 04.05.2017    source источник
comment
Возможный дубликат CMake ExternalProject_Add() и FindPackage()   -  person Tsyvarev    schedule 04.05.2017
comment
Уточнил, почему мой вопрос конкретно отличается. Интересно, как люди думают, что это дубликат, поскольку я даже объясняю и ссылаюсь на него...   -  person malat    schedule 04.05.2017
comment
Ссылочный вопрос объясняет, как сделать ExternalProject_Add пригодным для использования с find_package. Другими словами, вы правы в том, что эти две команды не взаимодействуют напрямую. Но есть способы заставить их сотрудничать. Именно это задано в указанном вопросе. (И ответы на самом деле предоставляют такие способы).   -  person Tsyvarev    schedule 04.05.2017
comment
Собственно, find_package - самый простой способ заполнения ITK_LIBRARIES переменных, если строить ИТК средствами ExternalProject (не add_subdirectory). В данном случае никакой специфики статических библиотек нет: если ITK собирает статические библиотеки, то find_package() должен их найти. Другими автоматическими способами являются... просто изобретение велосипеда (реализация логики скрипта ITKConfig.cmake, используемого find_package).   -  person Tsyvarev    schedule 04.05.2017
comment
Заказ статических библиотек — это кошмар. Так что вы правы, мне нужно использовать find_package любой ценой.   -  person malat    schedule 04.05.2017


Ответы (1)


Поэтому мне не следует создавать упорядоченный список статических библиотек в ITK_LIBRARIES, это слишком сложно. Вместо этого я должен использовать логику вызова find_package(ITK).

Мне нужно изменить способ создания проекта и перейти на решение типа SuperBuild.

person malat    schedule 04.05.2017