Команда внешних проектов cmake, кажется, игнорирует INSTALL_DIR
Во-первых, я относительно новичок в cmake. Я пытаюсь использовать cmake для создания проекта с одной внешней зависимостью. Я указываю INSTALL_DIR для внешнего проекта CMAKE_INSTALL_PREFIX, поэтому он устанавливается в то же место, что и родительский проект. Но когда я запускаю make, он игнорирует его и пытается установить в /usr/local/lib.
Вот мой CMakeList.txt:
cmake_minimum_required( VERSION 2.8 )
include( ExternalProject )
project( capture )
add_library( capture SHARED capture.cc )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )
ExternalProject_Add( proj_exceptions
GIT_REPOSITORY /home/user/workspace/exceptions
INSTALL_DIR ${CMAKE_INSTALL_PREFIX}
)
add_library( exceptions SHARED IMPORTED )
set_property( TARGET exceptions
PROPERTY IMPORTED_LOCATION ${CMAKE_INSTALL_PREFIX}/lib/libexceptions.so
)
add_dependencies( exceptions proj_exceptions )
include_directories( ${CMAKE_INSTALL_PREFIX}/include )
target_link_libraries( capture exceptions )
install( TARGETS capture DESTINATION lib )
install( FILES capture.h DESTINATION include )
CMakeLists.txt для внешнего проекта выглядит так:
cmake_minimum_required( VERSION 2.8 )
project( exceptions )
add_library( exceptions SHARED exceptions.cc )
install( TARGETS exceptions DESTINATION lib )
install( FILES exceptions.hh DESTINATION include )
Он клонирует и создает внешний проект просто отлично, но затягивает шаг установки:
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib/libexceptions.so
CMake Error at cmake_install.cmake:42 (file):
file INSTALL cannot copy file
"/home/user/workspace/capture/build/proj_exceptions-prefix/src/proj_exceptions-build/libexceptions.so"
to "/usr/local/lib/libexceptions.so".
Makefile:66: recipe for target 'install' failed
Как видите, конфигурация установки пуста. Просматривая сгенерированный конфиг для внешнего проекта, я нашел это в cmake_install.cmake:
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_PREFIX "/usr/local")
endif()
Таким образом, кажется, что передача INSTALL_DIR в ExternalProject_Add не устанавливает префикс установки. Шаг установки завершится успешно, если я вместо этого использую:
ExternalProject_Add( proj_exceptions
GIT_REPOSITORY /home/djones/workspace/exceptions
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}"
)
Так в чем же цель INSTALL_DIR?
1 ответ
Вы правы для цели INSTALL_DIR, но, возможно, вы пропустили некоторые шаги.
Согласно документу cmake 2.8 о внешнем проекте:
Шаг установки
INSTALL_DIR находится под двоичным каталогом вызывающего проекта. Используйте INSTALL_DIR, чтобы указать другое местоположение. Обратите внимание, что в дополнение к установке INSTALL_DIR, вы также должны передать -DCMAKE_INSTALL_PREFIX или --prefix в команду CMake или configure. Он не используется автоматически на этапе настройки, поскольку не все проекты следуют этому соглашению.
# [INSTALL_DIR dir]
Вы можете обратиться к каталогу установки в вашей команде configure, например:
CONFIGURE_COMMAND SOURCE_DIR/configure --prefix=INSTALL_DIR # [INSTALL_COMMAND cmd...]
Проекты на основе CMake используют 'cmake-build' для сборки цели установки. Другие проекты используют 'make install'. Используйте INSTALL_COMMAND для настройки шага установки. Используйте INSTALL_COMMAND "", чтобы пропустить шаг установки. Команда установки выполняется с рабочим каталогом, установленным в.
Поэтому попробуйте обновить команду cmake или использовать пользовательскую функцию INSTALL_COMMAND.