From 26debae7595cbda83d963da490ccc1b9d301f3dd Mon Sep 17 00:00:00 2001
From: Eric Cano <Eric.Cano@cern.ch>
Date: Fri, 6 Nov 2015 18:57:34 +0100
Subject: [PATCH] Ported rpm packaging from CASTOR. CTA packaging still
 incomplete.

---
 CMakeLists.txt                                | 150 +++++++----
 cmake/CTAInstallationFunctions.cmake          | 245 ++++++++++++++++++
 cmake/CTAVersions.cmake                       |   2 +
 cmake/UseRPMTools.cmake                       | 179 +++++++++++++
 cmake/UseRPMToolsEnvironment.cmake            |  33 +++
 cta.spec.in                                   |  76 ++++++
 .../tape/tapeserver/daemon/CMakeLists.txt     |   1 +
 7 files changed, 642 insertions(+), 44 deletions(-)
 create mode 100644 cmake/CTAInstallationFunctions.cmake
 create mode 100644 cmake/CTAVersions.cmake
 create mode 100644 cmake/UseRPMTools.cmake
 create mode 100644 cmake/UseRPMToolsEnvironment.cmake
 create mode 100644 cta.spec.in

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0f93526097..b2e70efeef 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,47 +18,109 @@ set(CMAKE_CXX_FLAGS "-fPIC -pedantic -Wall -Wextra -Werror -Wno-unused-parameter
 set(CMAKE_C_FLAGS_RELWITHDEBINFO "-g")
 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-g")
 
-# With the exception of shared-library plugins, the CASTOR rpms only install the
-# /usr/lib64/libcastor*.so symbolic links for libraries used by end-user
-# developers.  Therefore the locations of the internal CASTOR libraries required
-# by tapeserved and not by end-user developers need to be imported into cmake.
-add_library(castorlegacymsg SHARED IMPORTED)
-set_target_properties(castorlegacymsg PROPERTIES
-  IMPORTED_LOCATION /usr/lib64/libcastorlegacymsg.so.2.1)
-add_library(castorserver SHARED IMPORTED)
-set_target_properties(castorserver PROPERTIES
-  IMPORTED_LOCATION /usr/lib64/libcastorserver.so.2.1)
-add_library(castortapegatewayprotocol SHARED IMPORTED)
-set_target_properties(castortapegatewayprotocol PROPERTIES
-  IMPORTED_LOCATION /usr/lib64/libcastortapegatewayprotocol.so.2.1)
-
-IF(NOT CMAKE_BUILD_TYPE STREQUAL "")
-  # If the user specifies -DCMAKE_BUILD_TYPE on the command line, take their definition and dump it in the cache
-  message(STATUS "Setting build type to ${CMAKE_BUILD_TYPE} as requested.")
-  SET(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Choose the type of build.")
-ELSE()
-  # log choosen default (RelWithDebInfo) and set it
-  message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
-  message (STATUS "Override with -DCMAKE_BUILD_TYPE:STRING=Debug")  
-  set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE)
-  # Set the possible values of build type for cmake-gui
-  # this command is not yet available in SLC6's cmake 2.6
-  # set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
-ENDIF(NOT CMAKE_BUILD_TYPE STREQUAL "")
-
-set(CMAKE_DISABLE_SOURCE_CHANGES ON)
-set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
-list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
-
-include_directories(${PROJECT_SOURCE_DIR})
-include_directories(${CMAKE_BINARY_DIR})
-
-add_subdirectory(cmdline)
-add_subdirectory(common)
-add_subdirectory(objectstore)
-add_subdirectory(nameserver)
-add_subdirectory(remotens)
-add_subdirectory(scheduler)
-add_subdirectory(tapeserver)
-add_subdirectory(tests)
-add_subdirectory(xroot_plugins)
+# Generate the compilation variables, if needed
+if (NOT DEFINED SKIP_UNIT_TESTS)
+  message (STATUS "Setting SKIP_UNIT_TESTS to the value of 1")
+  message (STATUS "Override with -DSKIP_UNIT_TESTS:STRING=0")
+  set(SKIP_UNIT_TESTS 1)
+else (NOT DEFINED SKIP_UNIT_TESTS)
+  message (STATUS "Already set: SKIP_UNIT_TESTS=${SKIP_UNIT_TESTS}")
+endif (NOT DEFINED SKIP_UNIT_TESTS)
+
+IF(DEFINED PackageOnly)
+  message (STATUS "Running CMake in package-only mode")
+   set(COMPILE_PACKAGING "1") 
+ELSE(DEFINED PackageOnly)
+  message (STATUS "Running in full configuration mode.")
+  message (STATUS "Override with -DPackageOnly:Bool=true")
+  # Generate the compilation variables, if needed
+  if (NOT DEFINED COMPILE_PACKAGING)
+    message (STATUS "Setting COMPILE_PACKAGING to the value of 1")
+    message (STATUS "Override with -DCOMPILE_PACKAGING:STRING=0")
+    set(COMPILE_PACKAGING 1)
+  else (NOT DEFINED COMPILE_PACKAGING)
+    message (STATUS "Already set: COMPILE_PACKAGING=${COMPILE_PACKAGING}")
+  endif (NOT DEFINED COMPILE_PACKAGING)
+
+
+  # With the exception of shared-library plugins, the CASTOR rpms only install the
+  # /usr/lib64/libcastor*.so symbolic links for libraries used by end-user
+  # developers.  Therefore the locations of the internal CASTOR libraries required
+  # by tapeserved and not by end-user developers need to be imported into cmake.
+  add_library(castorlegacymsg SHARED IMPORTED)
+  set_target_properties(castorlegacymsg PROPERTIES
+    IMPORTED_LOCATION /usr/lib64/libcastorlegacymsg.so.2.1)
+  add_library(castorserver SHARED IMPORTED)
+  set_target_properties(castorserver PROPERTIES
+    IMPORTED_LOCATION /usr/lib64/libcastorserver.so.2.1)
+  add_library(castortapegatewayprotocol SHARED IMPORTED)
+  set_target_properties(castortapegatewayprotocol PROPERTIES
+    IMPORTED_LOCATION /usr/lib64/libcastortapegatewayprotocol.so.2.1)
+
+  IF(NOT CMAKE_BUILD_TYPE STREQUAL "")
+    # If the user specifies -DCMAKE_BUILD_TYPE on the command line, take their definition and dump it in the cache
+    message(STATUS "Setting build type to ${CMAKE_BUILD_TYPE} as requested.")
+    SET(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Choose the type of build.")
+  ELSE()
+    # log choosen default (RelWithDebInfo) and set it
+    message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
+    message (STATUS "Override with -DCMAKE_BUILD_TYPE:STRING=Debug")  
+    set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE)
+    # Set the possible values of build type for cmake-gui
+    # this command is not yet available in SLC6's cmake 2.6
+    # set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
+  ENDIF(NOT CMAKE_BUILD_TYPE STREQUAL "")
+
+  set(CMAKE_DISABLE_SOURCE_CHANGES ON)
+  set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
+  list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
+  include(cmake/CTAInstallationFunctions.cmake)
+  include(cmake/CTAVersions.cmake)
+
+  include_directories(${PROJECT_SOURCE_DIR})
+  include_directories(${CMAKE_BINARY_DIR})
+
+  add_subdirectory(cmdline)
+  add_subdirectory(common)
+  add_subdirectory(objectstore)
+  add_subdirectory(nameserver)
+  add_subdirectory(remotens)
+  add_subdirectory(scheduler)
+  add_subdirectory(tapeserver)
+  add_subdirectory(tests)
+  add_subdirectory(xroot_plugins)
+ENDIF(DEFINED PackageOnly)
+
+################################################################################
+# Packaging step (replacing the maketar)
+# See http://www.vtk.org/Wiki/CMakeUserUseRPMTools
+################################################################################
+if (${COMPILE_PACKAGING} STREQUAL "1")
+  include(cmake/UseRPMToolsEnvironment.cmake)
+  set(CPACK_SOURCE_PACKAGE_FILE_NAME
+   "${PROJECT_NAME}-${CTA_VERSION}-${CTA_RELEASE}")
+  message (STATUS
+    "Setting package file name to: ${CPACK_SOURCE_PACKAGE_FILE_NAME}")
+  set(CPACK_SOURCE_IGNORE_FILES "/.git/")
+  include(CPack)
+  include(cmake/UseRPMTools.cmake)
+  if (RPMTools_FOUND)
+    RPMTools_ADD_RPM_TARGETS(
+      ${PROJECT_NAME} ${PROJECT_NAME}.spec.in)
+  endif (RPMTools_FOUND)
+endif (${COMPILE_PACKAGING} STREQUAL "1")
+
+#add_custom_target(test test/castorUnitTests
+#                    COMMENT "Not running the unit tests" VERBATIM)
+
+add_custom_target(test test/unitTests
+                    #  
+                    #COMMAND valgrind --track-fds=yes --leak-check=full --demangle=no --gen-suppressions=all --show-reachable=yes --error-exitcode=1 test/castorUnitTests
+                    #COMMAND test/castorThreadedUnitTests
+                    #COMMAND valgrind --track-fds=yes --leak-check=full --show-reachable=yes --error-exitcode=1  test/castorThreadedUnitTests
+                    #COMMAND valgrind --tool=helgrind -v --demangle=no --conflict-cache-size=30000000 --error-exitcode=1 test/castorThreadedUnitTests
+                    #COMMAND test/castorMultiprocessUnitTests
+                    #COMMAND valgrind --tool=helgrind --error-exitcode=1 test/castorMultiprocessUnitTests 
+                    DEPENDS test/unitTests #test/castorThreadedUnitTests test/castorMultiprocessUnitTests test/castorThreadedUnitTests.supp
+                    COMMENT "Running unit tests" VERBATIM)
+
diff --git a/cmake/CTAInstallationFunctions.cmake b/cmake/CTAInstallationFunctions.cmake
new file mode 100644
index 0000000000..9a5d55fdca
--- /dev/null
+++ b/cmake/CTAInstallationFunctions.cmake
@@ -0,0 +1,245 @@
+################################################################################
+# Global rules and variables
+################################################################################
+set (CTA_DEST_BIN_DIR /usr/bin)
+set (CTA_DEST_LIB_DIR /usr/lib64)
+set (CTA_DEST_MAN_DIR /usr/share/man)
+set (CTA_DEST_INCLUDE_DIR /usr/include)
+set (CTA_DEST_PERL_LIBDIR /usr/lib/perl/CTA)
+set (CTA_DEST_C_HEADERS_DIR ${CTA_DEST_INCLUDE_DIR}/castor/h)
+set (CTA_DEST_CPP_HEADERS_DIR ${CTA_DEST_INCLUDE_DIR}/castor/castor)
+set (CTA_DEST_WWW_DIR /var/www)
+set (CTA_DEST_UDEV_RULE_DIR /etc/udev/rules.d)
+
+message (STATUS "CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}")
+message (STATUS "CMAKE_SIZEOF_VOID_P = ${CMAKE_SIZEOF_VOID_P}")
+if (${CMAKE_SYSTEM_NAME} MATCHES "Linux" AND
+   ${CMAKE_SIZEOF_VOID_P} MATCHES "8")
+  set (CTA_DEST_LIB_DIR /usr/lib64)
+  message (STATUS "CTA_DEST_LIB_DIR = ${CTA_DEST_LIB_DIR}")
+else ()
+  set (CTA_DEST_LIB_DIR /usr/lib)
+  message (STATUS "CTA_DEST_LIB_DIR = ${CTA_DEST_LIB_DIR}")
+endif ()
+
+set (CTA_BIN_SCRIPT_PERMS
+  OWNER_READ OWNER_WRITE OWNER_EXECUTE
+  GROUP_READ             OWNER_EXECUTE
+  WORLD_READ             WORLD_EXECUTE)
+
+set (CTA_ETC_PERMS
+  OWNER_READ OWNER_WRITE
+  GROUP_READ
+  WORLD_READ)
+
+set (CTA_ETC_CRON_D_PERMS
+  OWNER_READ OWNER_WRITE
+  GROUP_READ
+  WORLD_READ)
+
+set (CTA_ETC_XINETD_D_PERMS
+  OWNER_READ OWNER_WRITE
+  GROUP_READ
+  WORLD_READ)
+
+set (CTA_EXAMPLE_PERMS
+  OWNER_READ OWNER_WRITE
+  GROUP_READ
+  WORLD_READ)
+
+set (CTA_HEADER_PERMS
+  OWNER_READ OWNER_WRITE
+  GROUP_READ
+  WORLD_READ)
+
+set (CTA_INITSCRIPT_PERMS
+  OWNER_READ OWNER_WRITE OWNER_EXECUTE
+  GROUP_READ             GROUP_EXECUTE
+  WORLD_READ             WORLD_EXECUTE)
+
+set (CTA_LOGROTATE_PERMS
+  OWNER_READ OWNER_WRITE
+  GROUP_READ
+  WORLD_READ)
+
+set (CTA_MAN_PAGE_PERMS
+  OWNER_READ OWNER_WRITE
+  GROUP_READ
+  WORLD_READ)
+
+set (CTA_NON_EXEC_PERMS
+  OWNER_READ OWNER_WRITE
+  GROUP_READ
+  WORLD_READ)
+
+set (CTA_PYTHON_LIB_PERMS
+  OWNER_READ OWNER_WRITE
+  GROUP_READ            
+  WORLD_READ)
+
+set (CTA_SCRIPT_PERMS
+  OWNER_READ OWNER_WRITE OWNER_EXECUTE
+  GROUP_READ             GROUP_EXECUTE
+  WORLD_READ             WORLD_EXECUTE)
+
+set (CTA_SYSCONFIG_PERMS
+  OWNER_READ OWNER_WRITE
+  GROUP_READ
+  WORLD_READ)
+
+set (CTA_UDEV_RULES_PERMS
+  OWNER_READ OWNER_WRITE
+  GROUP_READ
+  WORLD_READ)
+
+set (CTA_SQL_PERMS
+  OWNER_READ OWNER_WRITE
+  GROUP_READ
+  WORLD_READ)
+
+function (CTAInstallDir _name)
+  install (CODE
+    "message (STATUS \"Installing directory \$ENV{DESTDIR}${_name}\")")
+  install (CODE "file (MAKE_DIRECTORY \$ENV{DESTDIR}${_name})")
+endfunction ()
+
+function (CTAInstallEtcCronD _name)
+  install (FILES ${_name}.cron_d
+    DESTINATION /etc/cron.d
+    PERMISSIONS ${CTA_ETC_CRON_D_PERMS}
+    RENAME ${_name})
+endfunction ()
+
+function (CTAInstallEtcExample _name)
+  install (FILES ${_name}.etc
+    DESTINATION /etc
+    PERMISSIONS ${CTA_ETC_PERMS}
+    RENAME ${_name}.example)
+endfunction ()
+
+function (CTAInstallEtcXinetdD _name)
+  install (FILES ${_name}.xinetd_d
+    DESTINATION /etc/xinetd.d
+    PERMISSIONS ${CTA_ETC_XINETD_D_PERMS}
+    RENAME ${_name})
+endfunction ()
+
+function (CTAInstallExample _name _dest)
+  install (FILES ${_name}
+    DESTINATION ${_dest}
+    PERMISSIONS ${CTA_EXAMPLE_PERMS}
+    RENAME ${_name}.example)
+endfunction ()
+
+function (CTAInstallScript _name)
+  install (FILES ${_name}
+    DESTINATION ${CTA_DEST_BIN_DIR}
+    PERMISSIONS ${CTA_BIN_SCRIPT_PERMS})
+endfunction ()
+
+function (CTAInstallPythonLib _name)
+  if (${ARGC} GREATER 1)
+    set (_subdir "/${ARGV1}")
+  else ()
+    set (_subdir "")
+  endif ()
+  install (FILES ${_name}
+    DESTINATION ${CTA_DEST_PYTHON_LIBDIR}${_subdir}
+    PERMISSIONS ${CTA_PYTHON_LIB_PERMS})
+endfunction ()
+
+function (CTAInstallManPage _name _section)
+  install (FILES ${_name}.man
+    DESTINATION ${CTA_DEST_MAN_DIR}/man${_section}
+    PERMISSIONS ${CTA_MAN_PAGE_PERMS}
+    RENAME ${_name}.${_section}castor)
+endfunction ()
+
+function (CTAInstallExeManPage _name)
+  CTAInstallManPage (${_name} 1)
+endfunction ()
+
+function (CTAInstallSysManPage _name)
+  CTAInstallManPage (${_name} 2)
+endfunction ()
+
+function (CTAInstallLibManPage _name)
+  CTAInstallManPage (${_name} 3)
+endfunction ()
+
+function (CTAInstallFileManPage _name)
+  CTAInstallManPage (${_name} 4)
+endfunction ()
+
+function (CTAInstallAdmManPage _name)
+  CTAInstallManPage (${_name} 8)
+endfunction ()
+
+function (CTAInstallLogrotate _name)
+  install (FILES ${_name}.logrotate
+    DESTINATION /etc/logrotate.d
+    PERMISSIONS ${CTA_LOGROTATE_PERMS}
+    RENAME ${_name})
+endfunction ()
+
+function (CTAInstallSysconfigExample _name)
+  install (FILES ${_name}.sysconfig
+    DESTINATION /etc/sysconfig
+    PERMISSIONS ${CTA_SYSCONFIG_PERMS}
+    RENAME ${_name}.example)
+endfunction ()
+
+function (CTAInstallInitScript _name)
+  install (FILES ${_name}.init
+    DESTINATION /etc/init.d
+    PERMISSIONS ${CTA_INITSCRIPT_PERMS}
+    RENAME ${_name})
+endfunction ()
+
+set (CTA_CONFIG_PERMS
+  OWNER_READ OWNER_WRITE
+  GROUP_READ)
+
+function (CTAInstallConfigFile _name)
+  install (FILES ${_name}CONFIG
+    DESTINATION /etc/castor
+    PERMISSIONS ${CTA_CONFIG_PERMS}
+    RENAME ${_name}CONFIG.example)
+endfunction ()
+
+function (CTAInstallConfigFileLowercase _name)
+  install (FILES ${_name}
+    DESTINATION /etc/castor
+    PERMISSIONS ${CTA_CONFIG_PERMS}
+    RENAME ${_name}.example)
+endfunction ()
+
+function (CTAInstallConfigNoRename _name)
+  install (FILES ${_name}
+    DESTINATION /etc/castor
+    PERMISSIONS ${CTA_CONFIG_PERMS})
+endfunction ()
+
+function (CastorSetLibraryVersions _name)
+  set_target_properties (${_name} PROPERTIES
+  VERSION ${MAJOR_CTA_VERSION}.${MINOR_CTA_VERSION}
+  SOVERSION ${MAJOR_CTA_VERSION})
+endfunction ()
+
+function (CTAInstallUdevRule _name)
+  install (FILES ${_name}
+    DESTINATION ${CTA_DEST_UDEV_RULE_DIR}
+    PERMISSIONS ${CTA_UDEV_RULES_PERMS})
+endfunction ()
+
+function (CTAInstallSQL _name)
+  install (FILES ${CMAKE_CURRENT_BINARY_DIR}/${_name}
+    DESTINATION ${CTA_DEST_SQL_DIR}
+    PERMISSIONS ${CTA_SQL_PERMS})
+endfunction ()
+
+function (CTAInstallSQLFromSource _name)
+  install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/${_name}
+    DESTINATION ${CTA_DEST_SQL_DIR}
+    PERMISSIONS ${CTA_SQL_PERMS})
+endfunction ()
diff --git a/cmake/CTAVersions.cmake b/cmake/CTAVersions.cmake
new file mode 100644
index 0000000000..ca528db650
--- /dev/null
+++ b/cmake/CTAVersions.cmake
@@ -0,0 +1,2 @@
+set(CTA_VERSION 0)
+set(CTA_RELEASE 0)
\ No newline at end of file
diff --git a/cmake/UseRPMTools.cmake b/cmake/UseRPMTools.cmake
new file mode 100644
index 0000000000..b22729a03e
--- /dev/null
+++ b/cmake/UseRPMTools.cmake
@@ -0,0 +1,179 @@
+#
+# - Find tools needed for building RPM Packages
+#   on Linux systems and defines macro that helps to
+#   build source or binary RPM, the MACRO assumes
+#   CMake 2.4.x which includes CPack support.
+#   CPack is used to build tar.gz source tarball
+#   which may be used by a custom user-made spec file.
+#
+# - Define RPMTools_ADD_RPM_TARGETS which defines
+#   two (top-level) CUSTOM targets for building
+#   source and binary RPMs
+#
+# Those CMake macros are provided by the TSP Developer Team
+# https://savannah.nongnu.org/projects/tsp
+#
+
+IF (WIN32)  
+  MESSAGE(STATUS "RPM tools not available on Win32 systems")
+ENDIF(WIN32)
+
+IF (UNIX)
+  # Look for RPM builder executable
+  FIND_PROGRAM(RPMTools_RPMBUILD_EXECUTABLE 
+    NAMES rpmbuild
+    PATHS "/usr/bin;/usr/lib/rpm"
+    PATH_SUFFIXES bin
+    DOC "The RPM builder tool")
+  
+  IF (RPMTools_RPMBUILD_EXECUTABLE)
+    MESSAGE(STATUS "Looking for RPMTools... - found rpmuild is ${RPMTools_RPMBUILD_EXECUTABLE}")
+    SET(RPMTools_RPMBUILD_FOUND "YES")
+    GET_FILENAME_COMPONENT(RPMTools_BINARY_DIRS ${RPMTools_RPMBUILD_EXECUTABLE} PATH)
+  ELSE (RPMTools_RPMBUILD_EXECUTABLE) 
+    SET(RPMTools_RPMBUILD_FOUND "NO")
+    MESSAGE(STATUS "Looking for RPMTools... - rpmbuild NOT FOUND")
+  ENDIF (RPMTools_RPMBUILD_EXECUTABLE)
+
+  # Detect if CPack was included or not
+  IF (NOT DEFINED "CPACK_PACKAGE_NAME") 
+    MESSAGE(FATAL_ERROR "CPack was not included, you should include CPack before Using RPMTools")
+  ENDIF (NOT DEFINED "CPACK_PACKAGE_NAME")
+  
+  IF (RPMTools_RPMBUILD_FOUND)
+    SET(RPMTools_FOUND TRUE)    
+    #
+    # - first arg  (ARGV0) is RPM name
+    # - second arg (ARGV1) is the RPM spec file path [optional]
+    # - third arg  (ARGV2) is the RPM ROOT DIRECTORY used to build RPMs [optional]
+    #
+    MACRO(RPMTools_ADD_RPM_TARGETS RPMNAME)
+
+      #
+      # If no spec file is provided create a minimal one
+      #
+      IF ("${ARGV1}" STREQUAL "")
+	SET(SPECFILE_PATH "${CMAKE_BINARY_DIR}/${RPMNAME}.spec")
+      ELSE ("${ARGV1}" STREQUAL "")
+	SET(SPECFILE_PATH "${ARGV1}")
+      ENDIF("${ARGV1}" STREQUAL "")
+      
+      # Verify whether if RPM_ROOTDIR was provided or not
+      IF("${ARGV2}" STREQUAL "") 
+	SET(RPM_ROOTDIR ${CMAKE_BINARY_DIR}/RPM)
+      ELSE ("${ARGV2}" STREQUAL "")
+	SET(RPM_ROOTDIR "${ARGV2}")	
+      ENDIF("${ARGV2}" STREQUAL "")
+      MESSAGE(STATUS "RPMTools:: Using RPM_ROOTDIR=${RPM_ROOTDIR}")
+
+      # Prepare RPM build tree
+      FILE(MAKE_DIRECTORY ${RPM_ROOTDIR})
+      FILE(MAKE_DIRECTORY ${RPM_ROOTDIR}/tmp)
+      FILE(MAKE_DIRECTORY ${RPM_ROOTDIR}/BUILD)
+      FILE(MAKE_DIRECTORY ${RPM_ROOTDIR}/RPMS)
+      FILE(MAKE_DIRECTORY ${RPM_ROOTDIR}/SOURCES)
+      FILE(MAKE_DIRECTORY ${RPM_ROOTDIR}/SPECS)
+      FILE(MAKE_DIRECTORY ${RPM_ROOTDIR}/SRPMS)
+
+      # Append the distribution name to the CPACK package tarball name
+      #set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_SOURCE_PACKAGE_FILE_NAME}${RPMTools_RPMBUILD_DIST}")
+
+      #
+      # We check whether if the provided spec file is
+      # to be configure or not.
+      # 
+      IF ("${ARGV1}" STREQUAL "")
+	SET(SPECFILE_PATH "${RPM_ROOTDIR}/SPECS/${RPMNAME}.spec")
+	SET(SPECFILE_NAME "${RPMNAME}.spec")
+	MESSAGE(STATUS "No Spec file given generate a minimal one --> ${RPM_ROOTDIR}/SPECS/${RPMNAME}.spec")
+      	FILE(WRITE ${RPM_ROOTDIR}/SPECS/${RPMNAME}.spec
+	  "# -*- rpm-spec -*-
+Summary:        ${RPMNAME}
+Name:           ${RPMNAME}
+Version:        ${PACKAGE_VERSION}
+Release:        1
+License:        Unknown
+Group:          Unknown
+Source:         ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz
+BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root
+BuildRequires:	cmake
+
+%define prefix /opt/${RPMNAME}-%{version}
+%define rpmprefix $RPM_BUILD_ROOT%{prefix}
+%define srcdirname %{name}-%{version}-Source
+
+%description
+${RPMNAME} : No description for now
+
+%prep
+%setup -q -n %{srcdirname}
+
+%build
+cd ..
+rm -rf build_tree
+mkdir build_tree
+cd build_tree
+cmake -DCMAKE_INSTALL_PREFIX=%{rpmprefix} ../%{srcdirname}
+make
+  
+%install 
+cd ../build_tree
+make install
+
+%clean
+rm -rf %{srcdirname}
+rm -rf build_tree
+
+%files
+%defattr(-,root,root,-)
+%dir %{prefix}
+%{prefix}/*
+
+%changelog
+* Wed Feb 28 2007 Erk <eric.noulard@gmail.com>
+  Generated by CMake UseRPMTools macros"
+	)
+
+      ELSE ("${ARGV1}" STREQUAL "")
+	SET(SPECFILE_PATH "${ARGV1}")
+	
+	GET_FILENAME_COMPONENT(SPECFILE_EXT ${SPECFILE_PATH} EXT)      
+	IF ("${SPECFILE_EXT}" STREQUAL ".spec")
+	  # This is a 'ready-to-use' spec file which does not need to be CONFIGURED
+	  GET_FILENAME_COMPONENT(SPECFILE_NAME ${SPECFILE_PATH} NAME)
+	  MESSAGE(STATUS "Simple copy spec file <${SPECFILE_PATH}> --> <${RPM_ROOTDIR}/SPECS/${SPECFILE_NAME}>")
+	  CONFIGURE_FILE(
+	    ${SPECFILE_PATH} 
+	    ${RPM_ROOTDIR}/SPECS/${SPECFILE_NAME}
+	    COPYONLY)
+	ELSE ("${SPECFILE_EXT}" STREQUAL ".spec")
+	  # This is a to-be-configured spec file
+	  GET_FILENAME_COMPONENT(SPECFILE_NAME ${SPECFILE_PATH} NAME_WE)
+	  SET(SPECFILE_NAME "${SPECFILE_NAME}.spec")
+	  MESSAGE(STATUS "Configuring spec file <${SPECFILE_PATH}> --> <${RPM_ROOTDIR}/SPECS/${SPECFILE_NAME}>")
+	  CONFIGURE_FILE(
+	    ${SPECFILE_PATH} 
+	    ${RPM_ROOTDIR}/SPECS/${SPECFILE_NAME}
+	    @ONLY)
+	ENDIF ("${SPECFILE_EXT}" STREQUAL ".spec")
+      ENDIF("${ARGV1}" STREQUAL "")
+            
+      ADD_CUSTOM_TARGET(${RPMNAME}_srpm
+	COMMAND cpack -G TGZ --config CPackSourceConfig.cmake
+	COMMAND ${CMAKE_COMMAND} -E copy ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz ${RPM_ROOTDIR}/SOURCES
+	COMMAND ${RPMTools_RPMBUILD_EXECUTABLE} -bs --define=\"_topdir ${RPM_ROOTDIR}\"  --define '_source_filedigest_algorithm md5' --define '_binary_filedigest_algorithm md5' --define 'neutralpackage 1' --nodeps --buildroot=${RPM_ROOTDIR}/tmp ${RPM_ROOTDIR}/SPECS/${SPECFILE_NAME} 
+	)
+      
+      ADD_CUSTOM_TARGET(${RPMNAME}_rpm
+	COMMAND cpack -G TGZ --config CPackSourceConfig.cmake
+	COMMAND ${CMAKE_COMMAND} -E copy ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz ${RPM_ROOTDIR}/SOURCES    
+	COMMAND ${RPMTools_RPMBUILD_EXECUTABLE} -bb --define=\"_topdir ${RPM_ROOTDIR}\" $ENV{RPMDEFS} --buildroot=${RPM_ROOTDIR}/tmp ${RPM_ROOTDIR}/SPECS/${SPECFILE_NAME} 
+	)  
+    ENDMACRO(RPMTools_ADD_RPM_TARGETS)
+
+  ELSE (RPMTools_RPMBUILD_FOUND)
+    SET(RPMTools FALSE)
+  ENDIF (RPMTools_RPMBUILD_FOUND)  
+  
+ENDIF (UNIX)
+  
diff --git a/cmake/UseRPMToolsEnvironment.cmake b/cmake/UseRPMToolsEnvironment.cmake
new file mode 100644
index 0000000000..c76530428b
--- /dev/null
+++ b/cmake/UseRPMToolsEnvironment.cmake
@@ -0,0 +1,33 @@
+# Small duplication of the main UseRPMToolsEnvironement
+# in order to have rpm variables handy before calling
+# CPack (which in turn should be done before UseRPMTools)
+
+IF (WIN32)  
+  MESSAGE(STATUS "RPM tools not available on Win32 systems")
+ENDIF(WIN32)
+
+IF (UNIX)
+  # Look for RPM builder executable
+  FIND_PROGRAM(RPMTools_RPMBUILD_EXECUTABLE 
+    NAMES rpmbuild
+    PATHS "/usr/bin;/usr/lib/rpm"
+    PATH_SUFFIXES bin
+    DOC "The RPM builder tool")
+  
+  IF (RPMTools_RPMBUILD_EXECUTABLE)
+    MESSAGE(STATUS "Looking for RPMTools... - found rpmuild is ${RPMTools_RPMBUILD_EXECUTABLE}")
+    SET(RPMTools_RPMBUILD_FOUND "YES")
+    GET_FILENAME_COMPONENT(RPMTools_BINARY_DIRS ${RPMTools_RPMBUILD_EXECUTABLE} PATH)
+  ELSE (RPMTools_RPMBUILD_EXECUTABLE) 
+    SET(RPMTools_RPMBUILD_FOUND "NO")
+    MESSAGE(STATUS "Looking for RPMTools... - rpmbuild NOT FOUND")
+  ENDIF (RPMTools_RPMBUILD_EXECUTABLE)
+
+  # Detetect rpmbuild environment (dist variable)
+  execute_process(COMMAND ${RPMTools_RPMBUILD_EXECUTABLE} --showrc
+    OUTPUT_VARIABLE RPMTools_RPMBUILD_SHOWRC)
+  string(REGEX MATCH "-14: dist[^\n]*" RPMTools_RPMBUILD_DIST "${RPMTools_RPMBUILD_SHOWRC}")
+  # message(STATUS "Found line for rpmbuild dist: ${RPMTools_RPMBUILD_DIST}")
+  string(REGEX REPLACE ".*\t" "" RPMTools_RPMBUILD_DIST "${RPMTools_RPMBUILD_DIST}")
+  message(STATUS "Detected rpmbuild dist: ${RPMTools_RPMBUILD_DIST}")
+ENDIF (UNIX)
\ No newline at end of file
diff --git a/cta.spec.in b/cta.spec.in
new file mode 100644
index 0000000000..635823bccd
--- /dev/null
+++ b/cta.spec.in
@@ -0,0 +1,76 @@
+# Generic macros
+#---------------
+%define name cta
+%define ctaVersion @CTA_VERSION@
+%define ctaRelease @CTA_RELEASE@
+
+# Neutral packaging (for srpm)
+#-----------------------------
+%if 0%{?neutralpackage:1} > 0
+%define mydist %{nil}
+%else
+%define mydist %{?dist}
+%endif
+
+# Skipping unit tests (for developpers)
+#--------------------------------------
+%define skip_unit_tests @SKIP_UNIT_TESTS@
+
+# General settings
+#-----------------
+Summary: CERN Tape Archive
+Name: %{name}
+Version: %{ctaVersion}
+Release: %{ctaRelease}%{mydist}
+Source: %{name}-%{ctaVersion}-%{ctaRelease}.tar.gz
+License: http://cern.ch/castor/DIST/CONDITIONS
+Group: Application/cta
+BuildRoot: %{_builddir}/%{name}-%{version}-root
+BuildRequires: cmake >= 2.6 redhat-rpm-config
+# only build debug info if you're building the whole code
+
+%description
+The CTA project is the CERN Tape Archive system.
+
+%prep
+%setup -q -n %{name}-%{ctaVersion}-%{ctaRelease}
+
+%build
+
+mkdir -p build
+cd build
+# The cmake step does the selection between client/server compilation or just client
+cmake .. -DCOMPILE_PACKAGING:STRING=0
+%{__make} -s %{_smp_mflags}
+
+%install
+# define castor version (modified by maketar.sh to put the exact version)
+%{__rm} -rf ${RPM_BUILD_ROOT}
+
+cd build
+%{__make} install DESTDIR=${RPM_BUILD_ROOT} EXPORTMAN=${RPM_BUILD_ROOT}/usr/share/man
+
+%clean
+%{__rm} -rf $RPM_BUILD_ROOT
+%{__rm} -rf $RPM_BUILD_DIR/%{name}-%{version}
+
+
+%check
+%if "%{skip_unit_tests}" == "0"
+cd build
+%{__make} test
+%endif
+
+# The packages will be cta-tapeserver, cta-frontend, cta-cli
+
+%package -n cta-tapeserver
+Summary: CERN Tape Archive
+Group: Application/CTA
+%description -n cta-tapeserver
+CERN Tape Archive:
+The tape server daemon
+%files -n cta-tapeserver
+%defattr(-,root,root)
+%attr(0644,root,root) /usr/bin/tapeserverd
+
+
diff --git a/tapeserver/castor/tape/tapeserver/daemon/CMakeLists.txt b/tapeserver/castor/tape/tapeserver/daemon/CMakeLists.txt
index 724c1c9400..5f048588d0 100644
--- a/tapeserver/castor/tape/tapeserver/daemon/CMakeLists.txt
+++ b/tapeserver/castor/tape/tapeserver/daemon/CMakeLists.txt
@@ -79,6 +79,7 @@ add_dependencies(castorTapeServerDaemon castormessagesprotobuf)
 
 add_executable(tapeserverd TapeDaemon.cpp)
 target_link_libraries(tapeserverd castorTapeServerDaemon SCSI System Utils File TapeDrive castorcommon castorclient castorlegacymsg castorserver castortapereactor ${LIBCAP_LIB} ${ZLIB_LIBRARIES} castormessages zmq)
+install (TARGETS tapeserverd DESTINATION ${CTA_DEST_BIN_DIR})
 
 add_library(castortapeserverdaemonutils SHARED
   ProcessForkerProxyDummy.cpp)
-- 
GitLab