Я пытаюсь настроить проект, в котором мой репозиторий импортирует все зависимости в виде подмодулей git для упрощения разработки. Мои коллеги могут просто клонировать репо, git submodule update --init --recursive
, cmake .
а также make
и иметь полностью рабочую среду разработки на месте. Структура каталогов настроена как суперстройка с CMakeLists.txt
на верхнем уровне, который строит все подмодули, используя ExternalProject_Add
, в результате чего получается следующая структура:
root
- CMakeLists.txt (superbuild)
- git_submodule_1
- git_submodule_2
- usr
- lib
- include
- my_project
- CMakeLists.txt (project)
CMakeLists.txt
выглядит примерно так:
SET (INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/usr)
# Install git_submodule_1 with ${INSTALL_PREFIX} as a prefix
ExternalProject_Add( ... )
# Install git_submodule_2 with ${INSTALL_PREFIX} as a prefix
ExternalProject_Add( ... )
ExternalProject_Add(
MyProject
PREFIX ${CMAKE_SOURCE_DIR}/my_project
DEPENDS ExternalProject_git_submodule_1 ExternalProject_git_submodule_2
SOURCE_DIR ${CMAKE_SOURCE_DIR}/my_project
CMAKE_ARGS
-DCMAKE_LIBRARY_PATH:string=${INSTALL_PREFIX}/lib
-DCMAKE_PROGRAM_PATH:string=${INSTALL_PREFIX}/bin
-DCMAKE_INCLUDE_PATH:string=${INSTALL_PREFIX}/include
# etc, nothing nonstandard here
)
Процесс сборки работает отлично. я make
на верхнем уровне зависимости устанавливаются в usr
Я cd
в my_project
Я делаю свою работу, все встроенные общие библиотеки найдены и связаны, я счастлив.
Тем не менее, когда я иду, чтобы запустить исполняемый файл на OS X, встроенный в my_project
Я считаю, что динамические библиотеки помещаются в usr/lib
каталог не может быть найден. Похоже, что CMake только устанавливает RPATH
для библиотек встроенный в каталог проекта, который в этом случае просто my_project
,
Можно ли как-нибудь добавить пользовательскую папку для установки в RPATH
для библиотек времени исполнения и исполняемых файлов?
Несколько заметок:
DYLD_LIBRARY_PATH
включить пользовательские места установки работ. Однако это добавляет дополнительный шаг к установке, и это раздражает, когда я пытаюсь отладить проблемы установки. DYLD_FALLBACK_LIBRARY_PATH
также работает, хотя это также не очень хороший вариант, поскольку он также добавляет дополнительный набор, и пользователям, использующим домашнее пиво, этот вариант не понравится Для исполняемых файлов и общих библиотек, созданных с my_project/CMakeLists.txt
добавлять ${INSTALL_PREFIX}/lib
установить rpath, а также заставить CMake связать цели в дереве сборки с этим установочным rpath следующим образом:
set_target_properties(my_exe PROPERTIES INSTALL_RPATH "${INSTALL_PREFIX}/lib")
set_target_properties(my_exe PROPERTIES BUILD_WITH_INSTALL_RPATH ON)
Таким образом, загрузчик должен найти внешние библиотеки, установленные на ${CMAKE_SOURCE_DIR}/usr/lib
каталог при запуске исполняемого файла из дерева сборки.
Других решений пока нет …