#.rst:
# CPackDeb
# --------
#
# The builtin (binary) CPack Deb generator (Unix only)
#
# Variables specific to CPack Debian (DEB) generator
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#
# CPackDeb may be used to create Deb package using CPack.
# CPackDeb is a CPack generator thus it uses the CPACK_XXX variables
# used by CPack : http://www.cmake.org/Wiki/CMake:CPackConfiguration.
# CPackDeb generator should work on any linux host but it will produce
# better deb package when Debian specific tools 'dpkg-xxx' are usable on
# the build system.
#
# CPackDeb has specific features which are controlled by the specifics
# CPACK_DEBIAN_XXX variables.You'll find a detailed usage on the wiki:
# http://www.cmake.org/Wiki/CMake:CPackPackageGenerators#DEB_.28UNIX_only.29
#
# However as a handy reminder here comes the list of specific variables:
#
# .. variable:: CPACK_DEBIAN_PACKAGE_NAME
#
#  * Mandatory : YES
#  * Default   : CPACK_PACKAGE_NAME (lower case)
#
#  The debian package summary
#
# .. variable:: CPACK_DEBIAN_PACKAGE_VERSION
#
#  * Mandatory : YES
#  * Default   : CPACK_PACKAGE_VERSION
#
#  The debian package version
#
# .. variable:: CPACK_DEBIAN_PACKAGE_ARCHITECTURE
#
#  * Mandatory : YES
#  * Default   : Output of dpkg --print-architecture (or i386 if dpkg is not found)
#
#  The debian package architecture
#
# .. variable:: CPACK_DEBIAN_PACKAGE_DEPENDS
#
#  * Mandatory : NO
#  * Default   : -
#
#  May be used to set deb dependencies.
#
# .. variable:: CPACK_DEBIAN_PACKAGE_MAINTAINER
#
#  * Mandatory : YES
#  * Default   : CPACK_PACKAGE_CONTACT
#
#  The debian package maintainer
#
# .. variable:: CPACK_DEBIAN_PACKAGE_DESCRIPTION
#
#  * Mandatory : YES
#  * Default   : CPACK_PACKAGE_DESCRIPTION_SUMMARY
#
#  The debian package description
#
# .. variable:: CPACK_DEBIAN_PACKAGE_SECTION
#
#  * Mandatory : YES
#  * Default   : 'devel'
#
# .. variable:: CPACK_DEBIAN_COMPRESSION_TYPE
#
#  * Mandatory : YES
#  * Default   : 'gzip'
#
#     Possible values are: lzma, xz, bzip2 and gzip.
#
# .. variable:: CPACK_DEBIAN_PACKAGE_PRIORITY
#
#  * Mandatory : YES
#  * Default   : 'optional'
#
#  The debian package priority
#
# .. variable:: CPACK_DEBIAN_PACKAGE_HOMEPAGE
#
#  * Mandatory : NO
#  * Default   : -
#
#  The URL of the web site for this package, preferably (when applicable) the
#  site from which the original source can be obtained and any additional
#  upstream documentation or information may be found.
#  The content of this field is a simple URL without any surrounding
#  characters such as <>.
#
# .. variable:: CPACK_DEBIAN_PACKAGE_SHLIBDEPS
#
#  * Mandatory : NO
#  * Default   : OFF
#
#  May be set to ON in order to use dpkg-shlibdeps to generate
#  better package dependency list.
#  You may need set CMAKE_INSTALL_RPATH toi appropriate value
#  if you use this feature, because if you don't dpkg-shlibdeps
#  may fail to find your own shared libs.
#  See http://www.cmake.org/Wiki/CMake_RPATH_handling.
#
# .. variable:: CPACK_DEBIAN_PACKAGE_DEBUG
#
#  * Mandatory : NO
#  * Default   : -
#
#  May be set when invoking cpack in order to trace debug information
#  during CPackDeb run.
#
# .. variable:: CPACK_DEBIAN_PACKAGE_PREDEPENDS
#
#  * Mandatory : NO
#  * Default   : -
#
#  see http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
#  This field is like Depends, except that it also forces dpkg to complete installation of
#  the packages named before even starting the installation of the package which declares
#  the pre-dependency.
#
# .. variable:: CPACK_DEBIAN_PACKAGE_ENHANCES
#
#  * Mandatory : NO
#  * Default   : -
#
#  see http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
#  This field is similar to Suggests but works in the opposite direction.
#  It is used to declare that a package can enhance the functionality of another package.
#
# .. variable:: CPACK_DEBIAN_PACKAGE_BREAKS
#
#  * Mandatory : NO
#  * Default   : -
#
#  see http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
#  When one binary package declares that it breaks another, dpkg will refuse to allow the
#  package which declares Breaks be installed unless the broken package is deconfigured first,
#  and it will refuse to allow the broken package to be reconfigured.
#
# .. variable:: CPACK_DEBIAN_PACKAGE_CONFLICTS
#
#  * Mandatory : NO
#  * Default   : -
#
#  see http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
#  When one binary package declares a conflict with another using a Conflicts field,
#  dpkg will refuse to allow them to be installed on the system at the same time.
#
# .. variable:: CPACK_DEBIAN_PACKAGE_PROVIDES
#
#  * Mandatory : NO
#  * Default   : -
#
#  see http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
#  A virtual package is one which appears in the Provides control field of another package.
#
# .. variable:: CPACK_DEBIAN_PACKAGE_REPLACES
#
#  * Mandatory : NO
#  * Default   : -
#
#  see http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
#  Packages can declare in their control file that they should overwrite
#  files in certain other packages, or completely replace other packages.
#
# .. variable:: CPACK_DEBIAN_PACKAGE_RECOMMENDS
#
#  * Mandatory : NO
#  * Default   : -
#
#  see http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
#  Allows packages to declare a strong, but not absolute, dependency on other packages.
#
# .. variable:: CPACK_DEBIAN_PACKAGE_SUGGESTS
#
#  * Mandatory : NO
#  * Default   : -
#
#  see http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
#  Allows packages to declare a suggested package install grouping.
#
# .. variable:: CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
#
#  * Mandatory : NO
#  * Default   : -
#
#  This variable allow advanced user to add custom script to the
#  control.tar.gz Typical usage is for conffiles, postinst, postrm, prerm.
#  Usage::
#
#   set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
#       "${CMAKE_CURRENT_SOURCE_DIR/prerm;${CMAKE_CURRENT_SOURCE_DIR}/postrm")


#=============================================================================
# Copyright 2007-2009 Kitware, Inc.
# Copyright 2007-2009 Mathieu Malaterre <mathieu.malaterre@gmail.com>
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distribute this file outside of CMake, substitute the full
#  License text for the above reference.)

# CPack script for creating Debian package
# Author: Mathieu Malaterre
#
# http://wiki.debian.org/HowToPackageForDebian

if(CMAKE_BINARY_DIR)
  message(FATAL_ERROR "CPackDeb.cmake may only be used by CPack internally.")
endif()

if(NOT UNIX)
  message(FATAL_ERROR "CPackDeb.cmake may only be used under UNIX.")
endif()

# CPACK_DEBIAN_PACKAGE_SHLIBDEPS
# If specify OFF, only user depends are used
if(NOT DEFINED CPACK_DEBIAN_PACKAGE_SHLIBDEPS)
  set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF)
endif()

find_program(FAKEROOT_EXECUTABLE fakeroot)
if(FAKEROOT_EXECUTABLE)
  set(CPACK_DEBIAN_FAKEROOT_EXECUTABLE ${FAKEROOT_EXECUTABLE})
endif()

if(CPACK_DEBIAN_PACKAGE_SHLIBDEPS)
  # dpkg-shlibdeps is a Debian utility for generating dependency list
  find_program(SHLIBDEPS_EXECUTABLE dpkg-shlibdeps)

  # Check version of the dpkg-shlibdeps tool using CPackRPM method
  if(SHLIBDEPS_EXECUTABLE)
    execute_process(COMMAND env LC_ALL=C ${SHLIBDEPS_EXECUTABLE} --version
      OUTPUT_VARIABLE _TMP_VERSION
      ERROR_QUIET
      OUTPUT_STRIP_TRAILING_WHITESPACE)
    string(REGEX MATCH "dpkg-shlibdeps version ([0-9]+\\.[0-9]+\\.[0-9]+)"
      SHLIBDEPS_EXECUTABLE_VERSION
      ${_TMP_VERSION})
    set(SHLIBDEPS_EXECUTABLE_VERSION "${CMAKE_MATCH_1}")
    if(CPACK_DEBIAN_PACKAGE_DEBUG)
      message( "CPackDeb Debug: dpkg-shlibdeps version is <${SHLIBDEPS_EXECUTABLE_VERSION}>")
    endif()

    # Generating binary list - Get type of all install files
    execute_process(COMMAND find -type f
      COMMAND xargs file
      WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
      OUTPUT_VARIABLE CPACK_DEB_INSTALL_FILES)

    # Convert to CMake list
    string(REPLACE "\n" ";" CPACK_DEB_INSTALL_FILES ${CPACK_DEB_INSTALL_FILES})

    # Only dynamically linked ELF files are included
    # Extract only file name infront of ":"
    foreach ( _FILE ${CPACK_DEB_INSTALL_FILES})
      if ( ${_FILE} MATCHES "ELF.*dynamically linked")
         string(REGEX MATCH "(^.*):" _FILE_NAME ${_FILE})
         list(APPEND CPACK_DEB_BINARY_FILES ${CMAKE_MATCH_1})
      endif()
    endforeach()

    message( "CPackDeb: - Generating dependency list")

    # Create blank control file for running dpkg-shlibdeps
    # There might be some other way to invoke dpkg-shlibdeps without creating this file
    # but standard debian package should not have anything that can collide with this file or directory
    file(MAKE_DIRECTORY ${CPACK_TEMPORARY_DIRECTORY}/debian)
    file(WRITE ${CPACK_TEMPORARY_DIRECTORY}/debian/control "")

    # Execute dpkg-shlibdeps
    # --ignore-missing-info : allow dpkg-shlibdeps to run even if some libs do not belong to a package
    # -O : print to STDOUT
    execute_process(COMMAND ${SHLIBDEPS_EXECUTABLE} --ignore-missing-info -O ${CPACK_DEB_BINARY_FILES}
      WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
      OUTPUT_VARIABLE SHLIBDEPS_OUTPUT
      RESULT_VARIABLE SHLIBDEPS_RESULT
      ERROR_VARIABLE SHLIBDEPS_ERROR
      OUTPUT_STRIP_TRAILING_WHITESPACE )
    if(CPACK_DEBIAN_PACKAGE_DEBUG)
      # dpkg-shlibdeps will throw some warnings if some input files are not binary
      message( "CPackDeb Debug: dpkg-shlibdeps warnings \n${SHLIBDEPS_ERROR}")
    endif()
    if (NOT SHLIBDEPS_RESULT EQUAL 0)
      message (FATAL_ERROR "CPackDeb: dpkg-shlibdeps: ${SHLIBDEPS_ERROR}")
    endif ()

    #Get rid of prefix generated by dpkg-shlibdeps
    string (REGEX REPLACE "^.*Depends=" "" CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS ${SHLIBDEPS_OUTPUT})

    if(CPACK_DEBIAN_PACKAGE_DEBUG)
      message( "CPackDeb Debug: Found dependency: ${CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS}")
    endif()

    # Remove blank control file
    # Might not be safe if package actual contain file or directory named debian
    file(REMOVE_RECURSE "${CPACK_TEMPORARY_DIRECTORY}/debian")

    # Append user depend if set
    if (CPACK_DEBIAN_PACKAGE_DEPENDS)
      set (CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS}, ${CPACK_DEBIAN_PACKAGE_DEPENDS}")
    else ()
      set (CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS}")
    endif ()

  else ()
    if(CPACK_DEBIAN_PACKAGE_DEBUG)
      message( "CPackDeb Debug: Using only user-provided depends because dpkg-shlibdeps is not found.")
    endif()
  endif()

else ()
  if(CPACK_DEBIAN_PACKAGE_DEBUG)
    message( "CPackDeb Debug: Using only user-provided depends")
  endif()
endif()

# Let's define the control file found in debian package:

# Binary package:
# http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-binarycontrolfiles

# DEBIAN/control
# debian policy enforce lower case for package name
# Package: (mandatory)
if(NOT CPACK_DEBIAN_PACKAGE_NAME)
  string(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_DEBIAN_PACKAGE_NAME)
endif()

# Version: (mandatory)
if(NOT CPACK_DEBIAN_PACKAGE_VERSION)
  if(NOT CPACK_PACKAGE_VERSION)
    message(FATAL_ERROR "CPackDeb: Debian package requires a package version")
  endif()
  set(CPACK_DEBIAN_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION})
endif()

# Architecture: (mandatory)
if(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
  # There is no such thing as i686 architecture on debian, you should use i386 instead
  # $ dpkg --print-architecture
  find_program(DPKG_CMD dpkg)
  if(NOT DPKG_CMD)
    message(STATUS "CPackDeb: Can not find dpkg in your path, default to i386.")
    set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE i386)
  endif()
  execute_process(COMMAND "${DPKG_CMD}" --print-architecture
    OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
    OUTPUT_STRIP_TRAILING_WHITESPACE
    )
endif()

# have a look at get_property(result GLOBAL PROPERTY ENABLED_FEATURES),
# this returns the successful find_package() calls, maybe this can help
# Depends:
# You should set: DEBIAN_PACKAGE_DEPENDS
# TODO: automate 'objdump -p | grep NEEDED'
if(NOT CPACK_DEBIAN_PACKAGE_DEPENDS)
  message(STATUS "CPACK_DEBIAN_PACKAGE_DEPENDS not set, the package will have no dependencies.")
endif()

# Maintainer: (mandatory)
if(NOT CPACK_DEBIAN_PACKAGE_MAINTAINER)
  if(NOT CPACK_PACKAGE_CONTACT)
    message(FATAL_ERROR "CPackDeb: Debian package requires a maintainer for a package, set CPACK_PACKAGE_CONTACT or CPACK_DEBIAN_PACKAGE_MAINTAINER")
  endif()
  set(CPACK_DEBIAN_PACKAGE_MAINTAINER ${CPACK_PACKAGE_CONTACT})
endif()

# Description: (mandatory)
if(NOT CPACK_DEBIAN_PACKAGE_DESCRIPTION)
  if(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
    message(FATAL_ERROR "CPackDeb: Debian package requires a summary for a package, set CPACK_PACKAGE_DESCRIPTION_SUMMARY or CPACK_DEBIAN_PACKAGE_DESCRIPTION")
  endif()
  set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
endif()

# Section: (recommended)
if(NOT CPACK_DEBIAN_PACKAGE_SECTION)
  set(CPACK_DEBIAN_PACKAGE_SECTION "devel")
endif()

# Priority: (recommended)
if(NOT CPACK_DEBIAN_PACKAGE_PRIORITY)
  set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
endif()

# Compression: (recommended)
if(NOT CPACK_DEBIAN_COMPRESSION_TYPE)
  set(CPACK_DEBIAN_COMPRESSION_TYPE "gzip")
endif()


# Recommends:
# You should set: CPACK_DEBIAN_PACKAGE_RECOMMENDS

# Suggests:
# You should set: CPACK_DEBIAN_PACKAGE_SUGGESTS

# CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
# This variable allow advanced user to add custom script to the control.tar.gz (inside the .deb archive)
# Typical examples are:
# - conffiles
# - postinst
# - postrm
# - prerm"
# Usage:
# set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
#    "${CMAKE_CURRENT_SOURCE_DIR/prerm;${CMAKE_CURRENT_SOURCE_DIR}/postrm")

# Are we packaging components ?
if(CPACK_DEB_PACKAGE_COMPONENT)
  set(CPACK_DEB_PACKAGE_COMPONENT_PART_NAME "-${CPACK_DEB_PACKAGE_COMPONENT}")
  string(TOLOWER "${CPACK_PACKAGE_NAME}${CPACK_DEB_PACKAGE_COMPONENT_PART_NAME}" CPACK_DEBIAN_PACKAGE_NAME)
else()
  set(CPACK_DEB_PACKAGE_COMPONENT_PART_NAME "")
endif()

set(WDIR "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}${CPACK_DEB_PACKAGE_COMPONENT_PART_PATH}")

# Print out some debug information if we were asked for that
if(CPACK_DEBIAN_PACKAGE_DEBUG)
   message("CPackDeb:Debug: CPACK_TOPLEVEL_DIRECTORY          = ${CPACK_TOPLEVEL_DIRECTORY}")
   message("CPackDeb:Debug: CPACK_TOPLEVEL_TAG                = ${CPACK_TOPLEVEL_TAG}")
   message("CPackDeb:Debug: CPACK_TEMPORARY_DIRECTORY         = ${CPACK_TEMPORARY_DIRECTORY}")
   message("CPackDeb:Debug: CPACK_OUTPUT_FILE_NAME            = ${CPACK_OUTPUT_FILE_NAME}")
   message("CPackDeb:Debug: CPACK_OUTPUT_FILE_PATH            = ${CPACK_OUTPUT_FILE_PATH}")
   message("CPackDeb:Debug: CPACK_PACKAGE_FILE_NAME           = ${CPACK_PACKAGE_FILE_NAME}")
   message("CPackDeb:Debug: CPACK_PACKAGE_INSTALL_DIRECTORY   = ${CPACK_PACKAGE_INSTALL_DIRECTORY}")
   message("CPackDeb:Debug: CPACK_TEMPORARY_PACKAGE_FILE_NAME = ${CPACK_TEMPORARY_PACKAGE_FILE_NAME}")
endif()

# For debian source packages:
# debian/control
# http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-sourcecontrolfiles

# .dsc
# http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-debiansourcecontrolfiles

# Builds-Depends:
#if(NOT CPACK_DEBIAN_PACKAGE_BUILDS_DEPENDS)
#  set(CPACK_DEBIAN_PACKAGE_BUILDS_DEPENDS
#    "debhelper (>> 5.0.0), libncurses5-dev, tcl8.4"
#  )
#endif()
