Команда внешних проектов 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.

Другие вопросы по тегам