Подтвердить что ты не робот

Автоматически устанавливать префикс установки на пользовательский путь, если явно не указано в командной строке

Для некоторых внутренних тестов я бы хотел, чтобы установочный префикс по умолчанию был подкаталогом каталога сборки, если явно не переопределен пользователем. Я знаю, что пользователь может указать префикс установки:

$ cmake -DCMAKE_INSTALL_PREFIX=/foo/bar ..

Но если пользователь этого не укажет, он должен по умолчанию, например, ${PWD}/installed.

Переменная CMAKE_INSTALL_PREFIX уже установлена ​​на /usr/local, поэтому я не могу просто проверить, не удаляться ли она до ее установки.

Мое текущее решение заключается в добавлении пользовательского переключателя, который пользователь должен вызывать, чтобы указать, что переменная CMAKE_INSTALL_PREFIX получает уважение:

option(ENABLE_INSTALL_PREFIX "Install build targets to system (path given by '-DCMAKE_INSTALL_PREFIX' or '${CMAKE_INSTALL_PREFIX}' if not specified)." OFF)
if ( ENABLE_INSTALL_PREFIX )
    set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root")
else()
    set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root" FORCE)
endif()

Мои вопросы:

(a) Есть ли какие-либо проблемы с вышеупомянутым, помимо раздражения дополнительного флага, который необходимо передать CMake, чтобы получить CMAKE_INSTALL_PREFIX, чтобы иметь эффект?

(b) Есть ли лучший, более чистый, более надежный, более идиоматический и/или менее раздражающий способ достижения вышеуказанного?

Спасибо.

4b9b3361

Ответ 1

CMake устанавливает логическую переменную CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT, если CMAKE_INSTALL_PREFIX не была явно указана и инициализирована по умолчанию. Вы можете переопределить его следующим образом:

if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/installed" CACHE PATH "default install path" FORCE )
endif()

Ответ 2

Несколько лет назад я хотел попытаться сделать то же самое. К сожалению, я никогда не смог найти полностью удовлетворительное решение. Вместо этого я решил использовать регулярное выражение, чтобы проверить, соответствует ли CMAKE_INSTALL_PREFIX по умолчанию.

например. в Windows я использую следующее для создания директории install в каталоге build:

if ( CMAKE_INSTALL_PREFIX MATCHES "^C:/Program Files" )
    # Override to an "Install" directory in the current build-dir
    message( STATUS "    Install-prefix was at default -> forcing it to the build-dir" )
    message( STATUS "        'set( CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install )'" )
    set( CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install )
endif ( CMAKE_INSTALL_PREFIX MATCHES "^C:/Program Files" )

Самая большая проблема с этой конструкцией заключается в том, что вы можете указать вручную, что CMake должен установить в C:\Program Files. Поскольку я распространяю свой инструмент с помощью NSIS-installer, это не проблема (для меня).

Возможно, вы могли бы попробовать что-то подобное в Unix.