CMake:Packaging With CPack: Difference between revisions

From KitwarePublic
Jump to navigationJump to search
No edit summary
(Reorganised and made article more concise)
Line 2: Line 2:
=Introduction=
=Introduction=


''CPack'' is a powerful, easy to use, cross-platform software packaging tool distributed with [http://www.cmake.org CMake] since version 2.4.2. It uses the generators concept from CMake, to abstract package generation on specific platforms. It can be used with or without CMake, but it
''CPack'' is a powerful, easy to use, cross-platform software packaging tool distributed with [http://www.cmake.org CMake] since version 2.4.2. It uses the generators concept from CMake, to abstract package generation on specific platforms, and it can be used with or without CMake.
may depend on some software being installed on the system, for details see the information about the supported package formats below.
 
Using a simple configuration file or using a CMake module, the author of a project can package a complex project into a simple installer.
Using either a simple configuration file or the CMake module, a complex project can be packaged into an installer.
 
 
=Using CPack without CMake=
 
CPack can be used directly by specifying a CPackConfig.cmake file, which uses CMake syntax and defines several variables. Here is an example CPackConfig.cmake file for a Linux system:
 
<pre><nowiki>SET(CPACK_CMAKE_GENERATOR "Unix Makefiles")
SET(CPACK_GENERATOR "STGZ;TGZ;TZ")
SET(CPACK_INSTALL_CMAKE_PROJECTS "/home/andy/vtk/CMake-bin;CMake;ALL;/")
SET(CPACK_NSIS_DISPLAY_NAME "CMake 2.5")
SET(CPACK_OUTPUT_CONFIG_FILE "/home/andy/vtk/CMake-bin/CPackConfig.cmake")
SET(CPACK_PACKAGE_DESCRIPTION_FILE "/home/andy/vtk/CMake/Copyright.txt")
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "CMake is a build tool")
SET(CPACK_PACKAGE_EXECUTABLES "ccmake;CMake")
SET(CPACK_PACKAGE_FILE_NAME "cmake-2.5.0-Linux-i686")
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake 2.5")
SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "CMake 2.5.0")
SET(CPACK_PACKAGE_NAME "CMake")
SET(CPACK_PACKAGE_VENDOR "Kitware")
SET(CPACK_PACKAGE_VERSION "2.5.0")
SET(CPACK_PACKAGE_VERSION_MAJOR "2")
SET(CPACK_PACKAGE_VERSION_MINOR "5")
SET(CPACK_PACKAGE_VERSION_PATCH "0")
SET(CPACK_RESOURCE_FILE_LICENSE "/home/andy/vtk/CMake/Copyright.txt")
SET(CPACK_RESOURCE_FILE_README "/home/andy/vtk/CMake/Templates/CPack.GenericDescription.txt")
SET(CPACK_RESOURCE_FILE_WELCOME "/home/andy/vtk/CMake/Templates/CPack.GenericWelcome.txt")
SET(CPACK_SOURCE_GENERATOR "TGZ;TZ")
SET(CPACK_SOURCE_OUTPUT_CONFIG_FILE "/home/andy/vtk/CMake-bin/CPackSourceConfig.cmake")
SET(CPACK_SOURCE_PACKAGE_FILE_NAME "cmake-2.5.0")
SET(CPACK_SOURCE_STRIP_FILES "")
SET(CPACK_STRIP_FILES "bin/ccmake;bin/cmake;bin/cpack;bin/ctest")
SET(CPACK_SYSTEM_NAME "Linux-i686")
SET(CPACK_TOPLEVEL_TAG "Linux-i686")</nowiki></pre>
 
These variables can also be overwritten on the command line using the option "-D":
 
cpack -D CPACK_PACKAGE_VENDOR=Me -D CPACK_SYSTEM_NAME=super-duper-linux ...
 


=Using CPack with CMake=
=Using CPack with CMake=


CMake comes with CPack module, which will generate appropriate CPack input
CMake comes with a CPack module, which will automatically generate an appropriate CPack configuration file. To use the module, simply invoke the following command:
file. To use this module, some CMake variables need to be set. These variables
will be copied to the CPack input file.


A simple CMake section to use CPack from CMake is this:
<pre><nowiki>INCLUDE(CPack)</nowiki></pre>


<pre><nowiki>INCLUDE(CPack)</nowiki></pre>
This generates a new target called ''"package"'' in your build system. When this target is built, CPack will be invoked to generate all of the packages.  Internally, CPack will use [[CMake:Install_Commands | CMake's install mechanism]] to automatically populate the package.


This will generate new target in Makefile (or Visual Studio, or Xcode) called ''"package"''. By running this target, CPack will be invoked, which will generate all the packages. Internally CPack will use [[CMake:Install_Commands | CMake's install mechanism]] to populate the package. Example output of the ''"package"'' target of Makefile is:
An example output of the ''"package"'' target (from a Linux Makefile) is:


<pre><nowiki>Run CPack packaging tool...
<pre><nowiki>Run CPack packaging tool...
Line 44: Line 80:
CPack: Package /home/andy/CMake-bin/cmake-2.5.0-Linux-i686.tar.Z generated.</nowiki></pre>
CPack: Package /home/andy/CMake-bin/cmake-2.5.0-Linux-i686.tar.Z generated.</nowiki></pre>


When adding line:
INCLUDE(CPack)
CMake module ''CPack.cmake'' will generate CPack configuration file called CPackConfig.cmake.


A more typical CMake list section for CPack configuration would be:
==Using CMake variables to configure CPack==
 
To configure CPack, it is possible to define [[CMake:CPackConfiguration| CPack variables]] inside a CMake file.  These variables will be copied across to the generated CPackConfig.cmake file before CPack is invoked.
 
This is an example CMake list section for CPack configuration:


<pre><nowiki>
<pre><nowiki>
Line 77: Line 114:
SET(CPACK_PACKAGE_EXECUTABLES "MyExecutable" "My Executable")
SET(CPACK_PACKAGE_EXECUTABLES "MyExecutable" "My Executable")
INCLUDE(CPack)</nowiki></pre>
INCLUDE(CPack)</nowiki></pre>
=Using CPack without CMake=
CPack can be used directly by specifying CPackConfig.cmake file. This file uses CMake syntax and has to contain several variables. Here is example CPackConfig.cmake files from CMake build directory on Linux system:
<pre><nowiki>SET(CPACK_CMAKE_GENERATOR "Unix Makefiles")
SET(CPACK_GENERATOR "STGZ;TGZ;TZ")
SET(CPACK_INSTALL_CMAKE_PROJECTS "/home/andy/vtk/CMake-bin;CMake;ALL;/")
SET(CPACK_NSIS_DISPLAY_NAME "CMake 2.5")
SET(CPACK_OUTPUT_CONFIG_FILE "/home/andy/vtk/CMake-bin/CPackConfig.cmake")
SET(CPACK_PACKAGE_DESCRIPTION_FILE "/home/andy/vtk/CMake/Copyright.txt")
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "CMake is a build tool")
SET(CPACK_PACKAGE_EXECUTABLES "ccmake;CMake")
SET(CPACK_PACKAGE_FILE_NAME "cmake-2.5.0-Linux-i686")
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake 2.5")
SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "CMake 2.5.0")
SET(CPACK_PACKAGE_NAME "CMake")
SET(CPACK_PACKAGE_VENDOR "Kitware")
SET(CPACK_PACKAGE_VERSION "2.5.0")
SET(CPACK_PACKAGE_VERSION_MAJOR "2")
SET(CPACK_PACKAGE_VERSION_MINOR "5")
SET(CPACK_PACKAGE_VERSION_PATCH "0")
SET(CPACK_RESOURCE_FILE_LICENSE "/home/andy/vtk/CMake/Copyright.txt")
SET(CPACK_RESOURCE_FILE_README "/home/andy/vtk/CMake/Templates/CPack.GenericDescription.txt")
SET(CPACK_RESOURCE_FILE_WELCOME "/home/andy/vtk/CMake/Templates/CPack.GenericWelcome.txt")
SET(CPACK_SOURCE_GENERATOR "TGZ;TZ")
SET(CPACK_SOURCE_OUTPUT_CONFIG_FILE "/home/andy/vtk/CMake-bin/CPackSourceConfig.cmake")
SET(CPACK_SOURCE_PACKAGE_FILE_NAME "cmake-2.5.0")
SET(CPACK_SOURCE_STRIP_FILES "")
SET(CPACK_STRIP_FILES "bin/ccmake;bin/cmake;bin/cpack;bin/ctest")
SET(CPACK_SYSTEM_NAME "Linux-i686")
SET(CPACK_TOPLEVEL_TAG "Linux-i686")</nowiki></pre>
These variables can be overwritten on the command line using the option "-D":
cpack -D CPACK_PACKAGE_VENDOR=Me -D CPACK_SYSTEM_NAME=super-duper-linux ...


{{CMake/Template/Footer}}
{{CMake/Template/Footer}}

Revision as of 18:52, 28 November 2007

Introduction

CPack is a powerful, easy to use, cross-platform software packaging tool distributed with CMake since version 2.4.2. It uses the generators concept from CMake, to abstract package generation on specific platforms, and it can be used with or without CMake.

Using either a simple configuration file or the CMake module, a complex project can be packaged into an installer.


Using CPack without CMake

CPack can be used directly by specifying a CPackConfig.cmake file, which uses CMake syntax and defines several variables. Here is an example CPackConfig.cmake file for a Linux system:

SET(CPACK_CMAKE_GENERATOR "Unix Makefiles")
SET(CPACK_GENERATOR "STGZ;TGZ;TZ")
SET(CPACK_INSTALL_CMAKE_PROJECTS "/home/andy/vtk/CMake-bin;CMake;ALL;/")
SET(CPACK_NSIS_DISPLAY_NAME "CMake 2.5")
SET(CPACK_OUTPUT_CONFIG_FILE "/home/andy/vtk/CMake-bin/CPackConfig.cmake")
SET(CPACK_PACKAGE_DESCRIPTION_FILE "/home/andy/vtk/CMake/Copyright.txt")
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "CMake is a build tool")
SET(CPACK_PACKAGE_EXECUTABLES "ccmake;CMake")
SET(CPACK_PACKAGE_FILE_NAME "cmake-2.5.0-Linux-i686")
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake 2.5")
SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "CMake 2.5.0")
SET(CPACK_PACKAGE_NAME "CMake")
SET(CPACK_PACKAGE_VENDOR "Kitware")
SET(CPACK_PACKAGE_VERSION "2.5.0")
SET(CPACK_PACKAGE_VERSION_MAJOR "2")
SET(CPACK_PACKAGE_VERSION_MINOR "5")
SET(CPACK_PACKAGE_VERSION_PATCH "0")
SET(CPACK_RESOURCE_FILE_LICENSE "/home/andy/vtk/CMake/Copyright.txt")
SET(CPACK_RESOURCE_FILE_README "/home/andy/vtk/CMake/Templates/CPack.GenericDescription.txt")
SET(CPACK_RESOURCE_FILE_WELCOME "/home/andy/vtk/CMake/Templates/CPack.GenericWelcome.txt")
SET(CPACK_SOURCE_GENERATOR "TGZ;TZ")
SET(CPACK_SOURCE_OUTPUT_CONFIG_FILE "/home/andy/vtk/CMake-bin/CPackSourceConfig.cmake")
SET(CPACK_SOURCE_PACKAGE_FILE_NAME "cmake-2.5.0")
SET(CPACK_SOURCE_STRIP_FILES "")
SET(CPACK_STRIP_FILES "bin/ccmake;bin/cmake;bin/cpack;bin/ctest")
SET(CPACK_SYSTEM_NAME "Linux-i686")
SET(CPACK_TOPLEVEL_TAG "Linux-i686")

These variables can also be overwritten on the command line using the option "-D":

cpack -D CPACK_PACKAGE_VENDOR=Me -D CPACK_SYSTEM_NAME=super-duper-linux ...


Using CPack with CMake

CMake comes with a CPack module, which will automatically generate an appropriate CPack configuration file. To use the module, simply invoke the following command:

INCLUDE(CPack)

This generates a new target called "package" in your build system. When this target is built, CPack will be invoked to generate all of the packages. Internally, CPack will use CMake's install mechanism to automatically populate the package.

An example output of the "package" target (from a Linux Makefile) is:

Run CPack packaging tool...
CPack: Create package using STGZ
CPack: Install projects
CPack: - Run preinstall target for: CMake
CPack: - Install project: CMake
CPack: - Strip files
CPack: Compress package
CPack: Finalize package
CPack: Package /home/andy/CMake-bin/cmake-2.5.0-Linux-i686.sh generated.
CPack: Create package using TGZ
CPack: Install projects
CPack: - Run preinstall target for: CMake
CPack: - Install project: CMake
CPack: - Strip files
CPack: Compress package
CPack: Finalize package
CPack: Package /home/andy/CMake-bin/cmake-2.5.0-Linux-i686.tar.gz generated.
CPack: Create package using TZ
CPack: Install projects
CPack: - Run preinstall target for: CMake
CPack: - Install project: CMake
CPack: - Strip files
CPack: Compress package
CPack: Finalize package
CPack: Package /home/andy/CMake-bin/cmake-2.5.0-Linux-i686.tar.Z generated.


Using CMake variables to configure CPack

To configure CPack, it is possible to define CPack variables inside a CMake file. These variables will be copied across to the generated CPackConfig.cmake file before CPack is invoked.

This is an example CMake list section for CPack configuration:

INCLUDE(InstallRequiredSystemLibraries)

SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "My funky project")
SET(CPACK_PACKAGE_VENDOR "Me, myself, and I")
SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/ReadMe.txt")
SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt")
SET(CPACK_PACKAGE_VERSION_MAJOR "1")
SET(CPACK_PACKAGE_VERSION_MINOR "3")
SET(CPACK_PACKAGE_VERSION_PATCH "2")
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}")
IF(WIN32 AND NOT UNIX)
  # There is a bug in NSI that does not handle full unix paths properly. Make
  # sure there is at least one set of four (4) backlasshes.
  SET(CPACK_PACKAGE_ICON "${CMake_SOURCE_DIR}/Utilities/Release\\\\InstallIcon.bmp")
  SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\MyExecutable.exe")
  SET(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY} My Famous Project")
  SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\www.my-project-home-page.org")
  SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\www.my-personal-home-page.com")
  SET(CPACK_NSIS_CONTACT "me@my-personal-home-page.com")
  SET(CPACK_NSIS_MODIFY_PATH ON)
ELSE(WIN32 AND NOT UNIX)
  SET(CPACK_STRIP_FILES "bin/MyExecutable")
  SET(CPACK_SOURCE_STRIP_FILES "")
ENDIF(WIN32 AND NOT UNIX)
SET(CPACK_PACKAGE_EXECUTABLES "MyExecutable" "My Executable")
INCLUDE(CPack)



CMake: [Welcome | Site Map]