Как использовать CMAKE_INSTALL_PREFIX

Я хочу создать Makefile с целью установки, делая установку в /usr вместо по умолчанию /usr/local. Предполагая, что каталог сборки сделан в подкаталоге источника, я выполняю:

cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..

CMakeCache.txt содержит: CMAKE_INSTALL_PREFIX:PATH=/usr (ХОРОШО?)

Сейчас я выполняю:

делать
сделать установку

Все файлы все еще установлены в usr / local. Что случилось?

Редактировать: CMAKE_INSTALL_PREFIX не существует ни в одном из файлов проекта CMakeLists.txt. Перед запуском cmake я удаляю все из выходного каталога. Директивы установки в CMakeLists.txt выглядят так:

install(TARGETS mylibrary DESTINATION lib)

6 ответов

Решение

Это должно быть (см. Документы):

cmake -DCMAKE_INSTALL_PREFIX=/usr ..

Есть два способа использовать эту переменную:

  • передавая его в качестве аргумента командной строки, как упоминал Иов:

    cmake -DCMAKE_INSTALL_PREFIX=< install_path > ..

  • присвоение ему значения в CMakeLists.txt:

    SET(CMAKE_INSTALL_PREFIX < install_path >)

    Но не забудьте разместить его ДО PROJECT(< project_name>) команда, иначе она не будет работать!

Но не забудьте поместить его перед командой ПРОЕКТ (<имя_проекта>), иначе она не будет работать!

Моя первая неделя использования cmake - после нескольких лет GNU autotools - так что я все еще учусь (лучше, чем написание макросов m4), но я думаю, что изменение CMAKE_INSTALL_PREFIX после установки проекта - лучшее место.

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)

set (CMAKE_INSTALL_PREFIX /foo/bar/bubba)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")
project (BarkBark)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")
set (CMAKE_INSTALL_PREFIX /foo/bar/bubba)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")

Первый запуск (без кеша)

CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- The C compiler identification is GNU 4.4.7
-- etc, etc,...
CIP = /usr/local (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- Configuring done
-- Generating done

Второй прогон

CIP = /foo/bar/bubba (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- Configuring done
-- Generating done

Дайте мне знать, если я ошибаюсь, мне нужно многому научиться. Это весело.

В современном CMake CLI это еще проще. Последняя команда устанавливает цели вbuildпапку вmyInstallationDirectoryиспользуяprefixвариант.

      cmake -S . -B build
cmake --build build
cmake --install build --prefix myInstallationDirectory

Ссылка: https://cmake.org/cmake/help/latest/manual/cmake.1.html?highlight=install#cmdoption-cmake--install-0

Это сработало для меня:

Поместите этот код в cmakelist.txt в самом верху:

      SET(CMAKE_INSTALL_PREFIX < install_path >)

Почему-то сделать это через командную строку у меня не получается:

      -D CMAKE_INSTALL_PREFIX=/home/user/Human-Detection-Module/build/install/

Например, чтобы добавить внешние проекты:

У меня работает следующее (cmake для Windows: v3.25.2) на основе этой темы :

      project("My_Project" VERSION 1.0.0 LANGUAGES C CXX)

if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    
    set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/external 
        CACHE PATH "Force path to set CMAKE_INSTALL_PREFIX" FORCE)

endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)

Для проверки запустите$> ccmake buildили$> ccmake .в каталоге сборки, чтобы увидеть, что для переменной кэша установлено значение:

       CMAKE_BUILD_TYPE                 Debug                                                                                     
 CMAKE_CONFIGURATION_TYPES        Debug;Release;MinSizeRel;RelWithDebInfo                                                   
 CMAKE_EXPORT_COMPILE_COMMANDS    ON                                                                                        
 CMAKE_INSTALL_PREFIX             D:/Projects/CMakeTest/external 

Раньше это было:

       CMAKE_BUILD_TYPE                 Debug                                                                                     
 CMAKE_CONFIGURATION_TYPES        Debug;Release;MinSizeRel;RelWithDebInfo                                                   
 CMAKE_EXPORT_COMPILE_COMMANDS    ON                                                                                        
 CMAKE_INSTALL_PREFIX             C:/Program Files/My_Project

Это на Windows, я думаю, что это будет/usr/cmake/My_projectна Linux.(если кто-то сможет подтвердить)

РЕДАКТИРОВАТЬ:

Если изменения не отражаются, вы можете удалитьCMakeCache.txt

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