CMake:Packaging With CPack: Difference between revisions
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 | ''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. | ||
Using a simple configuration file or | 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 | 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 | |||
<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. | |||
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> | ||
==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> | ||
{{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)