mirror of
https://github.com/rspamd/rspamd.git
synced 2024-08-14 02:14:40 +02:00
242 lines
9.6 KiB
CMake
242 lines
9.6 KiB
CMake
# DpkgDeb : Create debian packages for your projects and sub projects. Written by Mehdi Rabah
|
|
# Was heavily inspired by UseDebian (Mathieu Malaterre) and UseRPMTools (TSP Team) modules
|
|
|
|
# need /usr/bin/dpkg
|
|
|
|
# USAGE : ADD_DEBIAN_PACKAGE ( DEB_TARGET_NAME [CONTROL_FILE] )
|
|
# You need to set the control file either by setting these variables
|
|
# or by giving as second parameter the path to the control file you want to use
|
|
# If you choose to set the variables, you must set the mandatory variables:
|
|
# (see man 5 deb-control for more details)
|
|
#
|
|
# -- MANDATORY Variables
|
|
# Package: ${PACKAGE_NAME}. Must be a lowercase string
|
|
# Version: ${PACKAGE_VERSION}. Like 1.1.0
|
|
# Release: ${PACKAGE_RELEASE}. A number beetween 0 and 9
|
|
# Maintainer: ${PACKAGE_MAINTAINER_NAME} and ${PACKAGE_MAINTAINER_EMAIL}.
|
|
# Description summary: ${PACKAGE_DESCRIPTION_SUMMARY}. Project summary
|
|
# Description : ${PACKAGE_DESCRIPTION}. Warning : for now, use of special characters (>, (, ', ... ) is not allowed
|
|
#
|
|
# -- OPTIONAL Variables
|
|
# Architecture: ${DEBIAN_ARCHITECTURE}, by default i386 for intel on debian like
|
|
# Depends: ${CPACK_DEBIAN_PACKAGE_DEPENDS}
|
|
# Section: ${PACKAGE_SECTION}
|
|
# Priority: ${PACKAGE_PRIORITY}
|
|
# Essential: ${PACKAGE_ESSENTIAL}
|
|
# Source: ${PACKAGE_SOURCE}
|
|
# Pre-Depends: ${PACKAGE_PREDEPENDS}
|
|
# Recommends: ${PACKAGE_RECOMMENDS}
|
|
# Suggests: ${PACKAGE_SUGGESTS}
|
|
# Breaks: ${PACKAGE_BREAKS}
|
|
# Conflicts: ${PACKAGE_CONFLICTS}
|
|
# Replaces: ${PACKAGE_REPLACES}
|
|
# Provides: ${PACKAGE_PROVIDES}
|
|
|
|
# TODO: Make clean does not clean the DEBIAN_DIR folder
|
|
# TODO: use objdump -p to automatically generate depedencies (cf dh_makeshlibs)
|
|
|
|
FIND_PROGRAM(DPKG
|
|
NAMES dpkg-deb
|
|
PATHS "/usr/bin")
|
|
|
|
IF ( DPKG )
|
|
GET_FILENAME_COMPONENT(DPKG_PATH ${DPKG} ABSOLUTE)
|
|
MESSAGE(STATUS "Found dpkg-deb : ${DPKG_PATH}")
|
|
SET(DPKG_FOUND "YES")
|
|
ELSE ( DPKG )
|
|
MESSAGE(STATUS "dpkg-deb NOT found. deb generation will not be available")
|
|
SET(DPKG_FOUND "NO")
|
|
ENDIF ( DPKG )
|
|
|
|
# Main and only command of this module. For more details, visit this webpage
|
|
# http://tldp.org/HOWTO/Debian-Binary-Package-Building-HOWTO/
|
|
MACRO(ADD_DEBIAN_PACKAGE DEBNAME)
|
|
|
|
SET ( CONTROL_FILE ${PROJECT_BINARY_DIR}/control_${PROJECT_NAME} )
|
|
|
|
# First choice for control file : user defined variables
|
|
IF ("${ARGV1}" STREQUAL "")
|
|
|
|
# Check if the mandatory variables are here
|
|
IF(NOT PACKAGE_NAME OR NOT PACKAGE_VERSION OR NOT DEFINED PACKAGE_RELEASE OR
|
|
NOT PACKAGE_MAINTAINER_NAME OR NOT PACKAGE_MAINTAINER_EMAIL OR
|
|
NOT PACKAGE_DESCRIPTION_SUMMARY OR NOT PACKAGE_DESCRIPTION )
|
|
message ( FATAL_ERROR "ADD_DEBIAN_PACKAGE command was not correctly configured for ${PROJECT_NAME}. See the documentation for more details" )
|
|
ENDIF(NOT PACKAGE_NAME OR NOT PACKAGE_VERSION OR NOT DEFINED PACKAGE_RELEASE OR
|
|
NOT PACKAGE_MAINTAINER_NAME OR NOT PACKAGE_MAINTAINER_EMAIL OR
|
|
NOT PACKAGE_DESCRIPTION_SUMMARY OR NOT PACKAGE_DESCRIPTION )
|
|
|
|
IF(NOT DEBIAN_ARCHITECTURE)
|
|
EXECUTE_PROCESS(COMMAND "/usr/bin/dpkg" "--print-architecture" OUTPUT_VARIABLE DEBIAN_ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
ENDIF(NOT DEBIAN_ARCHITECTURE)
|
|
|
|
# Writing the control file
|
|
# see man 5 deb-control for more details
|
|
ADD_CUSTOM_COMMAND(
|
|
OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Package: ${PACKAGE_NAME}" > ${CONTROL_FILE}
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Version: ${PACKAGE_VERSION}" >> ${CONTROL_FILE}
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Maintainer: ${PACKAGE_MAINTAINER_NAME}"
|
|
\"<"${PACKAGE_MAINTAINER_EMAIL}\">" >> ${CONTROL_FILE}
|
|
|
|
COMMAND ${CMAKE_COMMAND}
|
|
ARGS -E echo "Architecture: ${DEBIAN_ARCHITECTURE}" >> ${CONTROL_FILE}
|
|
)
|
|
|
|
IF ( DEFINED CPACK_DEBIAN_PACKAGE_DEPENDS )
|
|
ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Depends: ${CPACK_DEBIAN_PACKAGE_DEPENDS}" >> ${CONTROL_FILE}
|
|
APPEND )
|
|
ENDIF ( DEFINED CPACK_DEBIAN_PACKAGE_DEPENDS )
|
|
|
|
IF ( DEFINED PACKAGE_SECTION )
|
|
ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Section: ${PACKAGE_SECTION}" >> ${CONTROL_FILE}
|
|
APPEND )
|
|
ENDIF ( DEFINED PACKAGE_SECTION)
|
|
IF ( DEFINED PACKAGE_HOMEPAGE )
|
|
ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Homepage: ${PACKAGE_HOMEPAGE}" >> ${CONTROL_FILE}
|
|
APPEND )
|
|
ENDIF ( DEFINED PACKAGE_HOMEPAGE)
|
|
|
|
IF ( DEFINED PACKAGE_PRIORITY )
|
|
ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Priority: ${PACKAGE_PRIORITY}" >> ${CONTROL_FILE}
|
|
APPEND)
|
|
ENDIF ( DEFINED PACKAGE_PRIORITY)
|
|
|
|
IF ( DEFINED PACKAGE_ESSENTIAL )
|
|
ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Essential: ${PACKAGE_ESSENTIAL}" >> ${CONTROL_FILE}
|
|
APPEND)
|
|
ENDIF ( DEFINED PACKAGE_ESSENTIAL)
|
|
|
|
IF ( DEFINED PACKAGE_SOURCE )
|
|
ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Source: ${PACKAGE_SOURCE}" >> ${CONTROL_FILE}
|
|
APPEND)
|
|
ENDIF ( DEFINED PACKAGE_SOURCE)
|
|
|
|
IF ( DEFINED PACKAGE_PREDEPENDS )
|
|
ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Pre-Depends: ${PACKAGE_PREDEPENDS}" >> ${CONTROL_FILE}
|
|
APPEND)
|
|
ENDIF ( DEFINED PACKAGE_PREDEPENDS )
|
|
|
|
IF ( DEFINED PACKAGE_RECOMMENDS )
|
|
ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Recommends: ${PACKAGE_RECOMMENDS}" >> ${CONTROL_FILE}
|
|
APPEND)
|
|
ENDIF ( DEFINED PACKAGE_RECOMMENDS)
|
|
|
|
IF ( DEFINED PACKAGE_SUGGESTS )
|
|
ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Suggests: ${PACKAGE_SUGGESTS}" >> ${CONTROL_FILE}
|
|
APPEND)
|
|
ENDIF ( DEFINED PACKAGE_SUGGESTS )
|
|
|
|
IF ( DEFINED PACKAGE_BREAKS )
|
|
ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Breaks: ${PACKAGE_BREAKS}" >> ${CONTROL_FILE}
|
|
APPEND)
|
|
ENDIF ( DEFINED PACKAGE_BREAKS )
|
|
|
|
IF ( DEFINED PACKAGE_CONFLICTS )
|
|
ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Conflicts: ${PACKAGE_CONFLICTS}" >> ${CONTROL_FILE}
|
|
APPEND)
|
|
ENDIF ( DEFINED PACKAGE_CONFLICTS )
|
|
|
|
IF ( DEFINED PACKAGE_REPLACES )
|
|
ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Replaces: ${PACKAGE_REPLACES}" >> ${CONTROL_FILE}
|
|
APPEND)
|
|
ENDIF ( DEFINED PACKAGE_REPLACES )
|
|
|
|
IF ( DEFINED PACKAGE_PROVIDES )
|
|
ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Provides: ${PACKAGE_PROVIDES}" >> ${CONTROL_FILE}
|
|
APPEND)
|
|
ENDIF ( DEFINED PACKAGE_PROVIDES )
|
|
|
|
ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"Description: ${PACKAGE_DESCRIPTION_SUMMARY}" >> ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
" ." >> ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
" ${PACKAGE_DESCRIPTION}" >> ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
" ." >> ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
"" >> ${CONTROL_FILE}
|
|
COMMENT "Generating control file"
|
|
APPEND
|
|
)
|
|
ELSE ("${ARGV1}" STREQUAL "")
|
|
ADD_CUSTOM_COMMAND(
|
|
OUTPUT ${CONTROL_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E copy "${ARGV1}" ${CONTROL_FILE}
|
|
COMMENT "Copying user specified control file : ${ARGV1}"
|
|
)
|
|
ENDIF("${ARGV1}" STREQUAL "")
|
|
|
|
# let's create a directory to call 'make install DESTDIR=...' into:
|
|
SET ( DEBIAN_DIR ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}_${PACKAGE_VERSION}-${PACKAGE_RELEASE}_${DEBIAN_ARCHITECTURE} )
|
|
FILE ( REMOVE ${DEBIAN_DIR} )
|
|
FILE ( MAKE_DIRECTORY ${DEBIAN_DIR} )
|
|
FILE ( MAKE_DIRECTORY ${DEBIAN_DIR}/DEBIAN )
|
|
|
|
# Calling "make install DESTDIR=${DEBIAN_DIR}"
|
|
ADD_CUSTOM_TARGET(deb_destdir_install
|
|
COMMAND ${CMAKE_MAKE_PROGRAM} install CMAKE_INSTALL_PREFIX=/ DESTDIR=${DEBIAN_DIR}
|
|
DEPENDS ${CMAKE_BINARY_DIR}/cmake_install.cmake
|
|
COMMENT "Installing with DESTDIR = ${DEBIAN_DIR}"
|
|
)
|
|
ADD_DEPENDENCIES(deb_destdir_install deb_destdir_preinstall)
|
|
ADD_CUSTOM_TARGET(deb_destdir_preinstall
|
|
COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=/ -DDESTDIR=${DEBIAN_DIR} .
|
|
DEPENDS ${CMAKE_BINARY_DIR}/cmake_install.cmake
|
|
COMMENT "Configuring with DESTDIR = ${DEBIAN_DIR}"
|
|
)
|
|
ADD_DEPENDENCIES(deb_destdir_preinstall all preinstall)
|
|
|
|
# Calling dpkg --build
|
|
ADD_CUSTOM_COMMAND(
|
|
OUTPUT ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}_${PACKAGE_VERSION}-${PACKAGE_RELEASE}_${DEBIAN_ARCHITECTURE}.deb
|
|
COMMAND ${CMAKE_COMMAND} -E copy ${CONTROL_FILE} ${DEBIAN_DIR}/DEBIAN/control
|
|
COMMAND ${DPKG_PATH} --build ${DEBIAN_DIR}
|
|
# removing control, so its (re)generated each time we need to build the package
|
|
COMMAND ${CMAKE_COMMAND} -E remove ${CONTROL_FILE}
|
|
DEPENDS ${CONTROL_FILE}
|
|
COMMENT "Generating deb package"
|
|
)
|
|
|
|
# the final target:
|
|
ADD_CUSTOM_TARGET(${DEBNAME}_deb
|
|
DEPENDS ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}_${PACKAGE_VERSION}-${PACKAGE_RELEASE}_${DEBIAN_ARCHITECTURE}.deb
|
|
)
|
|
|
|
ADD_DEPENDENCIES(${DEBNAME}_deb deb_destdir_install)
|
|
|
|
ENDMACRO(ADD_DEBIAN_PACKAGE DEBNAME)
|