From c3cfe3c2ce3037e52906efe28347b925af0c056f Mon Sep 17 00:00:00 2001
From: Axel Naumann <Axel.Naumann@cern.ch>
Date: Mon, 18 Jul 2011 08:57:28 +0000
Subject: [PATCH] From Pere: Adds CPack installer capabilities to the CMake
 system. To generate the installers is as simple as making the target
 'package' . Alternatively you can use the cpack command like this:   cpack -G
 NSIS or   cpack -G PackageMaker

git-svn-id: http://root.cern.ch/svn/root/trunk@40270 27541ba8-7e3a-0410-8455-c3a389f83636
---
 CMakeLists.txt                           | 61 +++++++++++++++++++++---
 cmake/modules/CMakeCPackOptions.cmake.in | 39 +++++++++++++++
 cmake/modules/RootNewMacros.cmake        | 42 +++++++++-------
 core/CMakeLists.txt                      |  3 ++
 math/genetic/CMakeLists.txt              |  2 +-
 5 files changed, 123 insertions(+), 24 deletions(-)
 create mode 100644 cmake/modules/CMakeCPackOptions.cmake.in

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 343c3b52dd3..f38113d66f7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -36,9 +36,11 @@ include(SearchInstalledSoftware)
 ROOT_SHOW_OPTIONS()
 
 #---Set the library version in the main CMakeLists.txt------------------------------------------
-set(ROOT_MAJOR_VERSION 5)
-set(ROOT_MINOR_VERSION 28)
-set(ROOT_PATCH_VERSION 00)
+file(READ ${CMAKE_SOURCE_DIR}/build/version_number versionstr)
+string(STRIP ${versionstr} versionstr)
+string(REGEX REPLACE "([0-9]+)[.][0-9]+[/][0-9]+" "\\1" ROOT_MAJOR_VERSION ${versionstr})
+string(REGEX REPLACE "[0-9]+[.]([0-9]+)[/][0-9]+" "\\1" ROOT_MINOR_VERSION ${versionstr})
+string(REGEX REPLACE "[0-9]+[.][0-9]+[/]([0-9]+)" "\\1" ROOT_PATCH_VERSION ${versionstr})
 set(ROOT_VERSION "${ROOT_MAJOR_VERSION}.${ROOT_MINOR_VERSION}.${ROOT_PATCH_VERSION}")
 
 #---Configure and install various files neded later and for clients -----------------------------
@@ -79,6 +81,8 @@ if(roofit)
 endif()
 
 include(PostInstalledSoftware)
+install(EXPORT ${CMAKE_PROJECT_NAME}Exports DESTINATION cmake/modules) 
+
 #---Installation of project-wise artifacts-------------------------------------------------------
 if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_INSTALL_PREFIX)
   install(FILES LICENSE DESTINATION .)
@@ -87,12 +91,55 @@ if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_INSTALL_PREFIX)
                          PATTERN ".svn" EXCLUDE 
                          REGEX system.rootrc EXCLUDE 
                          REGEX root.mimes EXCLUDE)
-  install(DIRECTORY geom/   DESTINATION geom PATTERN ".svn" EXCLUDE)
   install(DIRECTORY fonts/  DESTINATION fonts PATTERN ".svn" EXCLUDE)
   install(DIRECTORY icons/  DESTINATION icons PATTERN ".svn" EXCLUDE)
   install(DIRECTORY macros/ DESTINATION macros PATTERN ".svn" EXCLUDE)
   install(DIRECTORY man/    DESTINATION man PATTERN ".svn" EXCLUDE)
-  install(DIRECTORY test/      DESTINATION test PATTERN ".svn" EXCLUDE)
-  install(DIRECTORY tutorials/ DESTINATION tutorials PATTERN ".svn" EXCLUDE)
+  install(DIRECTORY test/      DESTINATION test COMPONENT tests PATTERN ".svn" EXCLUDE)
+  install(DIRECTORY tutorials/ DESTINATION tutorials COMPONENT tests PATTERN ".svn" EXCLUDE)
   install(DIRECTORY cmake/modules DESTINATION cmake PATTERN ".svn" EXCLUDE)
-endif()
\ No newline at end of file
+endif()
+
+#---Packaging-------------------------------------------------------------------------------------
+include(InstallRequiredSystemLibraries)
+configure_file(cmake/modules/CMakeCPackOptions.cmake.in CMakeCPackOptions.cmake @ONLY)
+configure_file(README/README README.txt COPYONLY)
+configure_file(LICENSE LICENSE.txt COPYONLY)
+set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_BINARY_DIR}/CMakeCPackOptions.cmake)
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "ROOT project")
+set(CPACK_PACKAGE_VENDOR "HEPSoft")
+set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_BINARY_DIR}/README.txt")
+set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_BINARY_DIR}/LICENSE.txt")
+set(CPACK_RESOURCE_FILE_README "${CMAKE_BINARY_DIR}/README.txt")
+set(CPACK_PACKAGE_VERSION_MAJOR ${ROOT_MAJOR_VERSION})
+set(CPACK_PACKAGE_VERSION_MINOR ${ROOT_MINOR_VERSION})
+set(CPACK_PACKAGE_VERSION_PATCH ${ROOT_PATCH_VERSION})
+set(CPACK_PACKAGE_RELOCATABLE True)
+set(CPACK_PACKAGE_INSTALL_DIRECTORY "ROOT ${ROOT_MAJOR_VERSION}.${ROOT_MINOR_VERSION}")
+if(CMAKE_BUILD_TYPE STREQUAL Release)
+  set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${ROOT_VERSION}-${ROOT_ARCHITECTURE}")
+else()
+  set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${ROOT_VERSION}-${ROOT_ARCHITECTURE}-${CMAKE_BUILD_TYPE}")
+endif()
+set(CPACK_SOURCE_STRIP_FILES "")
+set(CPACK_PACKAGE_EXECUTABLES "root" "ROOT")
+include(CPack)
+
+#---Define components and installation types--------------------------------------------------
+cpack_add_install_type(full      DISPLAY_NAME "Full Installation")
+cpack_add_install_type(minimal   DISPLAY_NAME "Minimal Installation")
+cpack_add_install_type(developer DISPLAY_NAME "Developer Installation")
+cpack_add_component(applications DISPLAY_NAME "ROOT Applications" 
+                                 DESCRIPTION "ROOT executables such as root.exe"
+								 INSTALL_TYPES full minimal developer)
+cpack_add_component(libraries DISPLAY_NAME "ROOT Libraries" 
+                                 DESCRIPTION "All ROOT libraries and dictionaries"
+								 INSTALL_TYPES full minimal developer)
+cpack_add_component(headers DISPLAY_NAME "C++ Headers" 
+                                 DESCRIPTION "These are needed to do any development"
+								 INSTALL_TYPES full developer)
+cpack_add_component(tests DISPLAY_NAME "ROOT Tests and Tutorials" 
+                                 DESCRIPTION "These are needed to do any test and tutorial"
+								 INSTALL_TYPES full developer)
+								 
+								 
diff --git a/cmake/modules/CMakeCPackOptions.cmake.in b/cmake/modules/CMakeCPackOptions.cmake.in
new file mode 100644
index 00000000000..21972aaa239
--- /dev/null
+++ b/cmake/modules/CMakeCPackOptions.cmake.in
@@ -0,0 +1,39 @@
+# This file is configured at cmake time, and loaded at cpack time.
+# To pass variables to cpack from cmake, they must be configured
+# in this file.  
+
+# This file is configured at cmake time, and loaded at cpack time.
+# To pass variables to cpack from cmake, they must be configured
+# in this file.  
+
+if(CPACK_GENERATOR MATCHES "NSIS")
+  # 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@\\icons\\rootdrawing-logo.bmp")
+  set(CPACK_NSIS_MUI_ICON "@CMAKE_SOURCE_DIR@\\icons\\RootIcon.ico")
+  set(CPACK_NSIS_MUI_UNIICON "@CMAKE_SOURCE_DIR@\\icons\\RootIcon.ico")
+  set(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY}")
+  set(CPACK_NSIS_HELP_LINK "http:\\\\root.cern.ch")
+  set(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\root.cern.ch\\drupal\\content\\about")
+  set(CPACK_NSIS_CONTACT "roottalk@root.cern.ch")
+  set(CPACK_NSIS_MODIFY_PATH ON)
+  # Register .root file type
+  set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "
+      WriteRegStr HKCR '.root' '' 'RootFile'
+      WriteRegStr HKCR 'RootFile' '' 'Root Data File'
+      WriteRegStr HKCR 'RootFile\\shell' '' 'open'
+      WriteRegStr HKCR 'RootFile\\shell\\DefaultIcon' '' '$INSTDIR\\icons\\RootIcon.ico'
+      WriteRegStr HKCR 'RootFile\\shell\\open\\command' '' \\
+                       '$INSTDIR\\bin\\root.exe -l \"%1\"  \"$INSTDIR\\macros\\fileopen.C\"' 
+	  ")
+  set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "
+      DeleteRegKey HKCR '.root'
+      DeleteRegKey HKCR 'RootFile'
+	  ")
+endif()
+
+
+if("${CPACK_GENERATOR}" STREQUAL "PackageMaker")
+  set(CPACK_PACKAGING_INSTALL_PREFIX "/${CPACK_PACKAGE_INSTALL_DIRECTORY}")
+  set(CPACK_PACKAGE_DEFAULT_LOCATION "/Applications")
+endif()
diff --git a/cmake/modules/RootNewMacros.cmake b/cmake/modules/RootNewMacros.cmake
index 6ca6e1f7330..0cb0c7d1628 100644
--- a/cmake/modules/RootNewMacros.cmake
+++ b/cmake/modules/RootNewMacros.cmake
@@ -246,21 +246,32 @@ function(ROOT_LINKER_LIBRARY library)
   if(ARG_CMAKENOEXPORT)
     install(TARGETS ${library} RUNTIME DESTINATION bin
                                LIBRARY DESTINATION lib
-                               ARCHIVE DESTINATION lib)
+                               ARCHIVE DESTINATION lib
+                               COMPONENT libraries)
   else()
     install(TARGETS ${library} EXPORT ${CMAKE_PROJECT_NAME}Exports
                                RUNTIME DESTINATION bin
                                LIBRARY DESTINATION lib
-                               ARCHIVE DESTINATION lib)
-    install(EXPORT ${CMAKE_PROJECT_NAME}Exports DESTINATION cmake/modules) 
+                               ARCHIVE DESTINATION lib
+                               COMPONENT libraries)
+    #install(EXPORT ${CMAKE_PROJECT_NAME}Exports DESTINATION cmake/modules) 
   endif()
   if(WIN32)
     if(CMAKE_GENERATOR MATCHES "Visual Studio")
-	  install(FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug/lib${library}.pdb CONFIGURATIONS Debug DESTINATION bin) 
-	  install(FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/RelWithDebInfo/lib${library}.pdb CONFIGURATIONS RelWithDebInfo DESTINATION bin) 
-	else()
-      install(FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/lib${library}.pdb CONFIGURATIONS Debug RelWithDebInfo DESTINATION bin) 
-	endif()
+	    install(FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug/lib${library}.pdb 
+	            CONFIGURATIONS Debug
+              DESTINATION bin
+              COMPONENT libraries) 
+	    install(FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/RelWithDebInfo/lib${library}.pdb 
+	            CONFIGURATIONS RelWithDebInfo 
+              DESTINATION bin
+              COMPONENT libraries) 
+	  else()
+      install(FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/lib${library}.pdb 
+              CONFIGURATIONS Debug RelWithDebInfo 
+              DESTINATION bin
+              COMPONENT libraries) 
+	  endif()
   endif()
 endfunction()
 
@@ -275,11 +286,10 @@ function(ROOT_MODULE_LIBRARY library)
   set_target_properties(${library}  PROPERTIES ${ROOT_LIBRARY_PROPERTIES})
   target_link_libraries(${library} ${ARG_LIBRARIES})
   #----Installation details-------------------------------------------------------
-  #install(TARGETS ${library} EXPORT ${CMAKE_PROJECT_NAME}Exports DESTINATION ${lib})
   install(TARGETS ${library} RUNTIME DESTINATION bin
                              LIBRARY DESTINATION lib
-                             ARCHIVE DESTINATION lib)
-  #install(EXPORT ${CMAKE_PROJECT_NAME}Exports DESTINATION cmake) 
+                             ARCHIVE DESTINATION lib
+                             COMPONENT libraries)
 endfunction()
 
 #---------------------------------------------------------------------------------------------------
@@ -349,7 +359,7 @@ function(ROOT_GENERATE_ROOTMAP library)
   add_custom_target( ${libprefix}${library}.rootmap ALL DEPENDS  ${outfile})
   set_target_properties(${libprefix}${library}.rootmap PROPERTIES FOLDER RootMaps )
   #---Install the rootmap file------------------------------------
-  install(FILES ${outfile} DESTINATION lib)
+  install(FILES ${outfile} DESTINATION lib COMPONENT libraries)
 endfunction()
 
 #---------------------------------------------------------------------------------------------------
@@ -362,7 +372,8 @@ function(ROOT_INSTALL_HEADERS)
     set(dirs inc/)
   endif()
   foreach(d ${dirs})  
-    install(DIRECTORY ${d} DESTINATION include 
+    install(DIRECTORY ${d} DESTINATION include
+                           COMPONENT headers 
                            PATTERN ".svn" EXCLUDE
                            REGEX "LinkDef" EXCLUDE )
   endforeach()
@@ -393,10 +404,9 @@ function(ROOT_EXECUTABLE executable)
   endif()
   #----Installation details------------------------------------------------------
   if(ARG_CMAKENOEXPORT)
-    install(TARGETS ${executable} RUNTIME DESTINATION ${bin})
+    install(TARGETS ${executable} RUNTIME DESTINATION ${bin} COMPONENT applications)
   else()
-    install(TARGETS ${executable} EXPORT ${CMAKE_PROJECT_NAME}Exports RUNTIME DESTINATION ${bin})
-    install(EXPORT ${CMAKE_PROJECT_NAME}Exports DESTINATION cmake/modules) 
+    install(TARGETS ${executable} EXPORT ${CMAKE_PROJECT_NAME}Exports RUNTIME DESTINATION ${bin} COMPONENT applications)
   endif()
 endfunction()
 
diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt
index 18e5334d356..c091a201ab3 100644
--- a/core/CMakeLists.txt
+++ b/core/CMakeLists.txt
@@ -74,6 +74,9 @@ set_source_files_properties(${CMAKE_SOURCE_DIR}/core/base/src/TPRegexp.cxx
                             ${BASE1_DICTIONARY} ${BASE2_DICTIONARY}
                             COMPILE_FLAGS -I${PCRE_INCLUDE_DIR}
                            )
+set_source_files_properties(${CMAKE_SOURCE_DIR}/core/lzma/src/ZipLZMA.c
+                            COMPILE_FLAGS -I${LZMA_INCLUDE_DIR}
+                           )
 
 if(${GCC_MAJOR} EQUAL 4 AND ${GCC_MINOR} EQUAL 1)
   set_source_files_properties(${CMAKE_SOURCE_DIR}/core/base/src/TString.cxx
diff --git a/math/genetic/CMakeLists.txt b/math/genetic/CMakeLists.txt
index c14c62c1b72..00c9097d632 100644
--- a/math/genetic/CMakeLists.txt
+++ b/math/genetic/CMakeLists.txt
@@ -8,6 +8,6 @@ ROOT_USE_PACKAGE(tmva)
 
 ROOT_GENERATE_DICTIONARY(G__Genetic Math/GeneticMinimizer.h LINKDEF LinkDef.h)
 ROOT_GENERATE_ROOTMAP(Genetic LINKDEF LinkDef.h DEPENDENCIES RIO Hist Matrix Tree Graf Gpad TreePlayer MLP Minuit MathCore XMLIO TMVA)
-ROOT_LINKER_LIBRARY(Genetic *.cxx G__Genetic.cxx LIBRARIES Core Cint DEPENDENCIES MathCore TMVA)
+ROOT_LINKER_LIBRARY(Genetic *.cxx G__Genetic.cxx CMAKENOEXPORT LIBRARIES Core Cint DEPENDENCIES MathCore TMVA)
 
 ROOT_INSTALL_HEADERS()
-- 
GitLab