CMake - как заблокировать выполнение установочных скриптов во время упаковки?

Мой файл CMakeLists.txt содержит команды, которые должен выполнять make install, и все это прекрасно работает. Пример CMakeLists.txt ниже - это короткая выдержка из моего фактического файла CMake (содержимое tm0001.cpp здесь не важно - это может быть любая программа на C++):

cmake_minimum_required(VERSION 3.12)

project(tm0001)

set(CMAKE_CXX_STANDARD 11)
add_executable(${PROJECT_NAME} tm0001.cpp)

install(
  TARGETS ${PROJECT_NAME}
  DESTINATION /usr/local/bin
  PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)

install(CODE "message(\"-- This must be called during installation only\")")

set(CPACK_PACKAGE_CONTACT "HEKTO")
set(CPACK_GENERATOR "DEB")
include(CPack)

Я вижу, что команда message также выполняется make package, мне нужен нет.

Как указать CMake нет для выполнения сценариев установки командой make package? Я не мог найти никакого способа сделать это с помощью команды CMake if.

Не могли бы вы предоставить минимальный CMakeLists.txt, воспроизводящий проблему?

compor 14.09.2018 14:27

@compor - готово, спасибо

HEKTO 14.09.2018 17:32

С точки зрения упаковщиков, я считаю, что изменять состояние системы при установке пакета - плохая идея. Возможно, вместо этого добавьте сообщение о том, что администратор должен перезапустить демон.

arved 14.09.2018 17:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
405
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Как уже было сказано в комментарии, «работать с systemd» (и делать что-либо, не связанное со сборкой или упаковкой вашего проекта) из команд install - крайне плохая идея. Команда install (даже подписи SCRIPT и CODE) предназначены для использования для действий по установке, а не для любого другие побочные эффекты.

Правильный способ действовать здесь - создать собственный пакет (DEB / RPM) со сценарием после установки, где, используя предоставленные системой макросы (например, описанный здесь), вы можете правильно установить свой пакет. Взгляните на CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA, чтобы узнать, как предоставить действия по установке пакета.

Другой недостаток - использовать жестко заданный путь (/usr/bin/). И, кстати, лучшее место для (чистого) приложения-демона я предлагаю /usr/sbin/. Взгляните на модуль GNUInstallDirs, поставляемый с CMake, для получения дополнительных ссылок.

Я спрашивал о CMake Только, вызов systemctl - это просто пример. На самом деле я делаю много разных вещей во время установки с помощью cmake и dpkg, но я не хочу делать это во время упаковки. Если CMake не может этого сделать, это проблема CMake, но не моего вопроса. Использование каталога /usr/bin также является примером, я мог бы использовать любой другой каталог.

HEKTO 17.09.2018 18:05

Дело в том, чтобы не делать ничего, что не связано с процессом сборки или упаковки из конфигурации CMake. Переместите свой много разных вещей в какой-нибудь вспомогательный скрипт или что-то в этом роде - это не часть вашего проекта, очевидно, это должны быть действия после установки вашего пакета. Если вы выполняете sudo make install локально, просто выполните sudo ./run-post-install.sh после ... и также включите эти действия в управляющий файл Debian. Но верный способ - разработать свой проект таким образом, чтобы вам не нужно было размещать его локально! :)

zaufi 17.09.2018 18:12

Да, это не проблема с вашим вопросом ... Это проблема вашего понимания процесса разработки (с CMake%). Вероятно, я могу догадаться, как отличить make install, выполняемый CPack, от выполняемого вручную, но это будет основано на деталях реализации, поэтому его нельзя рассматривать как надежное решение вашей проблемы, возникшей в результате странного использования CMake%)

zaufi 17.09.2018 18:19

Мой вывод из этого разговора заключается в том, что CMake не позволяет целевым объектам install и package нормально сосуществовать.

HEKTO 17.09.2018 20:48

Сделайте отлично вещи, и все будет отлично :) - делать грязный вещи ... ну вы знаете%) Для меня обе цели довольно хорошо сосуществуют в довольно сложных проектах.

zaufi 17.09.2018 20:53
Ответ принят как подходящий

Я отвечаю на свой вопрос, потому что существующий ответ не решает мою основную проблему. Я не смог найти никакого способа (на уровне CMake) заблокировать выполнение команд install во время make package - даже сценарий postinst вызывается этой командой.

К счастью, я мог изменить сам скрипт postinst, чтобы он ничего не делал, если он называется не по как dpkg:

if [ -z ${DPKG_ADMINDIR} ]; then
  echo "postinst: missing 'dpkg' environment (not an error during packaging)"
  exit 0
fi

Уловка, конечно, но у меня она сработала.

Что я сделал, так это указать команды установки с CODE / SCRIPT как отдельный компонент, например. установить (КОД ... КОМПОНЕНТ после установки).

Затем также добавлены другие команды установки без кода в качестве другого компонента, например. установить (ФАЙЛЫ ... КОМПОНЕНТНЫЕ файлы-установить)

Затем CPack необходимо настроить для упаковки только компонента установки файлов (решение этого легко найти - подсказка: используйте переменные CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE, CPACK_COMPONENTS_ALL и CPACK_ (RPM / DEB /...)_ COMPONENT_INSTALL).

Конечно, тогда в полученном пакете не будут запускаться эти компоненты CODE во время установки пакета - их нужно добавить отдельно в качестве сценария после установки.

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