Мой файл 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.
@compor - готово, спасибо
С точки зрения упаковщиков, я считаю, что изменять состояние системы при установке пакета - плохая идея. Возможно, вместо этого добавьте сообщение о том, что администратор должен перезапустить демон.





Как уже было сказано в комментарии, «работать с 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 также является примером, я мог бы использовать любой другой каталог.
Дело в том, чтобы не делать ничего, что не связано с процессом сборки или упаковки из конфигурации CMake. Переместите свой много разных вещей в какой-нибудь вспомогательный скрипт или что-то в этом роде - это не часть вашего проекта, очевидно, это должны быть действия после установки вашего пакета. Если вы выполняете sudo make install локально, просто выполните sudo ./run-post-install.sh после ... и также включите эти действия в управляющий файл Debian. Но верный способ - разработать свой проект таким образом, чтобы вам не нужно было размещать его локально! :)
Да, это не проблема с вашим вопросом ... Это проблема вашего понимания процесса разработки (с CMake%). Вероятно, я могу догадаться, как отличить make install, выполняемый CPack, от выполняемого вручную, но это будет основано на деталях реализации, поэтому его нельзя рассматривать как надежное решение вашей проблемы, возникшей в результате странного использования CMake%)
Мой вывод из этого разговора заключается в том, что CMake не позволяет целевым объектам install и package нормально сосуществовать.
Сделайте отлично вещи, и все будет отлично :) - делать грязный вещи ... ну вы знаете%) Для меня обе цели довольно хорошо сосуществуют в довольно сложных проектах.
Я отвечаю на свой вопрос, потому что существующий ответ не решает мою основную проблему. Я не смог найти никакого способа (на уровне 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 во время установки пакета - их нужно добавить отдельно в качестве сценария после установки.
Не могли бы вы предоставить минимальный
CMakeLists.txt, воспроизводящий проблему?