Я пытаюсь очень просто использовать 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». Мой вопрос совершенно другой и скорее касается сложного случая статической компоновки.
ExternalProject_Add
пригодным для использования сfind_package
. Другими словами, вы правы в том, что эти две команды не взаимодействуют напрямую. Но есть способы заставить их сотрудничать. Именно это задано в указанном вопросе. (И ответы на самом деле предоставляют такие способы). - person Tsyvarev   schedule 04.05.2017find_package
- самый простой способ заполненияITK_LIBRARIES
переменных, если строить ИТК средствамиExternalProject
(неadd_subdirectory
). В данном случае никакой специфики статических библиотек нет: если ITK собирает статические библиотеки, тоfind_package()
должен их найти. Другими автоматическими способами являются... просто изобретение велосипеда (реализация логики скриптаITKConfig.cmake
, используемогоfind_package
). - person Tsyvarev   schedule 04.05.2017find_package
любой ценой. - person malat   schedule 04.05.2017