Merge topic 'cpack-rpm-refactored-file-listing'

cd953bf7 Help: Add notes for topic 'cpack-rpm-refactored-file-listing'
76080c32 CPackRPM content listing refactor
152e9b32 CPackRPM package content list code move
This commit is contained in:
Brad King 2015-04-21 08:44:57 -04:00 committed by CMake Topic Stage
commit 50eefbb7e3
5 changed files with 167 additions and 71 deletions

View File

@ -0,0 +1,6 @@
cpack-rpm-refactored-file-listing
---------------------------------
* The :module:`CPackRPM` module learned a new
:variable:`CPACK_RPM_ADDITIONAL_MAN_DIRS` variable to specify
directories containing man pages for the brp-compress RPM macro.

View File

@ -419,6 +419,33 @@
# May be used to remove CPACK_PACKAGING_INSTALL_PREFIX and CPACK_RPM_<COMPONENT>_PACKAGE_PREFIX # May be used to remove CPACK_PACKAGING_INSTALL_PREFIX and CPACK_RPM_<COMPONENT>_PACKAGE_PREFIX
# from relocatable RPM prefix paths. # from relocatable RPM prefix paths.
# #
# .. variable:: CPACK_RPM_ADDITIONAL_MAN_DIRS
#
# * Mandatory : NO
# * Default : -
#
# May be used to set additional man dirs that could potentially be compressed
# by brp-compress RPM macro. Variable content must be a list of regular
# expressions that point to directories containing man files or to man files
# directly. Note that in order to compress man pages a path must also be
# present in brp-compress RPM script and that brp-compress script must be
# added to RPM configuration by the operating system.
#
# Regular expressions that are added by default were taken from brp-compress
# RPM macro:
#
# - /usr/man/man.*
# - /usr/man/.*/man.*
# - /usr/info.*
# - /usr/share/man/man.*
# - /usr/share/man/.*/man.*
# - /usr/share/info.*
# - /usr/kerberos/man.*
# - /usr/X11R6/man/man.*
# - /usr/lib/perl5/man/man.*
# - /usr/share/doc/.*/man/man.*
# - /usr/lib/.*/man/man.*
#
# Packaging of Symbolic Links # Packaging of Symbolic Links
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^ # ^^^^^^^^^^^^^^^^^^^^^^^^^^^
# #
@ -538,6 +565,107 @@ function(cpack_rpm_prepare_relocation_paths)
set(TMP_RPM_PREFIXES "${TMP_RPM_PREFIXES}" PARENT_SCOPE) set(TMP_RPM_PREFIXES "${TMP_RPM_PREFIXES}" PARENT_SCOPE)
endfunction() endfunction()
function(cpack_rpm_prepare_content_list)
# get files list
cmake_policy(PUSH)
cmake_policy(SET CMP0009 NEW)
file(GLOB_RECURSE CPACK_RPM_INSTALL_FILES LIST_DIRECTORIES true RELATIVE "${WDIR}" "${WDIR}/*")
cmake_policy(POP)
set(CPACK_RPM_INSTALL_FILES "/${CPACK_RPM_INSTALL_FILES}")
string(REPLACE ";" ";/" CPACK_RPM_INSTALL_FILES "${CPACK_RPM_INSTALL_FILES}")
# if we are creating a relocatable package, omit parent directories of
# CPACK_RPM_PACKAGE_PREFIX. This is achieved by building a "filter list"
# which is passed to the find command that generates the content-list
if(CPACK_RPM_PACKAGE_RELOCATABLE)
# get a list of the elements in CPACK_RPM_PACKAGE_PREFIXES that are
# destinct parent paths of other relocation paths and remove the
# final element (so the install-prefix dir itself is not omitted
# from the RPM's content-list)
list(SORT RPM_USED_PACKAGE_PREFIXES)
set(_DISTINCT_PATH "NOT_SET")
foreach(_RPM_RELOCATION_PREFIX ${RPM_USED_PACKAGE_PREFIXES})
if(NOT "${_RPM_RELOCATION_PREFIX}" MATCHES "${_DISTINCT_PATH}/.*")
set(_DISTINCT_PATH "${_RPM_RELOCATION_PREFIX}")
string(REPLACE "/" ";" _CPACK_RPM_PACKAGE_PREFIX_ELEMS " ${_RPM_RELOCATION_PREFIX}")
list(REMOVE_AT _CPACK_RPM_PACKAGE_PREFIX_ELEMS -1)
unset(_TMP_LIST)
# Now generate all of the parent dirs of the relocation path
foreach(_PREFIX_PATH_ELEM ${_CPACK_RPM_PACKAGE_PREFIX_ELEMS})
list(APPEND _TMP_LIST "${_PREFIX_PATH_ELEM}")
string(REPLACE ";" "/" _OMIT_DIR "${_TMP_LIST}")
separate_arguments(_OMIT_DIR)
list(APPEND _RPM_DIRS_TO_OMIT ${_OMIT_DIR})
endforeach()
endif()
endforeach()
endif()
if(CPACK_RPM_PACKAGE_DEBUG)
message("CPackRPM:Debug: Initial list of path to OMIT in RPM: ${_RPM_DIRS_TO_OMIT}")
endif()
if(NOT DEFINED CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST)
set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST /etc /etc/init.d /usr /usr/share /usr/share/doc /usr/bin /usr/lib /usr/lib64 /usr/include)
if(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION)
message("CPackRPM:Debug: Adding ${CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION} to builtin omit list.")
list(APPEND CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST "${CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION}")
endif()
endif()
if(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST)
if(CPACK_RPM_PACKAGE_DEBUG)
message("CPackRPM:Debug: CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST= ${CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST}")
endif()
list(APPEND _RPM_DIRS_TO_OMIT ${CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST})
endif()
if(CPACK_RPM_PACKAGE_DEBUG)
message("CPackRPM:Debug: Final list of path to OMIT in RPM: ${_RPM_DIRS_TO_OMIT}")
endif()
list(REMOVE_ITEM CPACK_RPM_INSTALL_FILES ${_RPM_DIRS_TO_OMIT})
# add man paths that will be compressed
# (copied from /usr/lib/rpm/brp-compress - script that does the actual
# compressing)
list(APPEND MAN_LOCATIONS "/usr/man/man.*" "/usr/man/.*/man.*" "/usr/info.*"
"/usr/share/man/man.*" "/usr/share/man/.*/man.*" "/usr/share/info.*"
"/usr/kerberos/man.*" "/usr/X11R6/man/man.*" "/usr/lib/perl5/man/man.*"
"/usr/share/doc/.*/man/man.*" "/usr/lib/.*/man/man.*")
if(CPACK_RPM_ADDITIONAL_MAN_DIRS)
if(CPACK_RPM_PACKAGE_DEBUG)
message("CPackRPM:Debug: CPACK_RPM_ADDITIONAL_MAN_DIRS= ${CPACK_RPM_ADDITIONAL_MAN_DIRS}")
endif()
list(APPEND MAN_LOCATIONS ${CPACK_RPM_ADDITIONAL_MAN_DIRS})
endif()
foreach(PACK_LOCATION IN LISTS CPACK_RPM_INSTALL_FILES)
foreach(MAN_LOCATION IN LISTS MAN_LOCATIONS)
# man pages are files inside a certain location
if(PACK_LOCATION MATCHES "${MAN_LOCATION}/"
AND NOT IS_DIRECTORY "${WDIR}${PACK_LOCATION}"
AND NOT IS_SYMLINK "${WDIR}${PACK_LOCATION}")
list(FIND CPACK_RPM_INSTALL_FILES "${PACK_LOCATION}" INDEX)
# insert file location that covers compressed man pages
# even if using a wildcard causes duplicates as those are
# handled by RPM and we still keep the same file list
# in spec file - wildcard only represents file type (e.g. .gz)
list(INSERT CPACK_RPM_INSTALL_FILES ${INDEX} "${PACK_LOCATION}*")
# remove file location that doesn't cover compressed man pages
math(EXPR INDEX ${INDEX}+1)
list(REMOVE_AT CPACK_RPM_INSTALL_FILES ${INDEX})
break()
endif()
endforeach()
endforeach()
set(CPACK_RPM_INSTALL_FILES "${CPACK_RPM_INSTALL_FILES}" PARENT_SCOPE)
endfunction()
function(cpack_rpm_symlink_get_relocation_prefixes LOCATION PACKAGE_PREFIXES RETURN_VARIABLE) function(cpack_rpm_symlink_get_relocation_prefixes LOCATION PACKAGE_PREFIXES RETURN_VARIABLE)
foreach(PKG_PREFIX IN LISTS PACKAGE_PREFIXES) foreach(PKG_PREFIX IN LISTS PACKAGE_PREFIXES)
string(REGEX MATCH "^${PKG_PREFIX}/.*" FOUND_ "${LOCATION}") string(REGEX MATCH "^${PKG_PREFIX}/.*" FOUND_ "${LOCATION}")
@ -1285,76 +1413,7 @@ function(cpack_rpm_generate_package)
#string(REGEX REPLACE " " "\\\\ " CPACK_RPM_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}") #string(REGEX REPLACE " " "\\\\ " CPACK_RPM_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}")
set(CPACK_RPM_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}") set(CPACK_RPM_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}")
# if we are creating a relocatable package, omit parent directories of cpack_rpm_prepare_content_list()
# CPACK_RPM_PACKAGE_PREFIX. This is achieved by building a "filter list"
# which is passed to the find command that generates the content-list
if(CPACK_RPM_PACKAGE_RELOCATABLE)
# get a list of the elements in CPACK_RPM_PACKAGE_PREFIXES that are
# destinct parent paths of other relocation paths and remove the
# final element (so the install-prefix dir itself is not omitted
# from the RPM's content-list)
set(SORTED_RPM_USED_PACKAGE_PREFIXES "${RPM_USED_PACKAGE_PREFIXES}")
list(SORT SORTED_RPM_USED_PACKAGE_PREFIXES)
set(_DISTINCT_PATH "NOT_SET")
foreach(_RPM_RELOCATION_PREFIX ${SORTED_RPM_USED_PACKAGE_PREFIXES})
if(NOT "${_RPM_RELOCATION_PREFIX}" MATCHES "${_DISTINCT_PATH}/.*")
set(_DISTINCT_PATH "${_RPM_RELOCATION_PREFIX}")
string(REPLACE "/" ";" _CPACK_RPM_PACKAGE_PREFIX_ELEMS ".${_RPM_RELOCATION_PREFIX}")
list(REMOVE_AT _CPACK_RPM_PACKAGE_PREFIX_ELEMS -1)
unset(_TMP_LIST)
# Now generate all of the parent dirs of the relocation path
foreach(_PREFIX_PATH_ELEM ${_CPACK_RPM_PACKAGE_PREFIX_ELEMS})
list(APPEND _TMP_LIST "${_PREFIX_PATH_ELEM}")
string(REPLACE ";" "/" _OMIT_DIR "${_TMP_LIST}")
list(FIND _RPM_DIRS_TO_OMIT "${_OMIT_DIR}" _DUPLICATE_FOUND)
if(_DUPLICATE_FOUND EQUAL -1)
set(_OMIT_DIR "-o -path ${_OMIT_DIR}")
separate_arguments(_OMIT_DIR)
list(APPEND _RPM_DIRS_TO_OMIT ${_OMIT_DIR})
endif()
endforeach()
endif()
endforeach()
endif()
if (CPACK_RPM_PACKAGE_DEBUG)
message("CPackRPM:Debug: Initial list of path to OMIT in RPM: ${_RPM_DIRS_TO_OMIT}")
endif()
if (NOT DEFINED CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST)
set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST /etc /etc/init.d /usr /usr/share /usr/share/doc /usr/bin /usr/lib /usr/lib64 /usr/include)
if (CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION)
message("CPackRPM:Debug: Adding ${CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION} to builtin omit list.")
list(APPEND CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST "${CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION}")
endif()
endif()
if(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST)
if (CPACK_RPM_PACKAGE_DEBUG)
message("CPackRPM:Debug: CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST= ${CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST}")
endif()
foreach(_DIR ${CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST})
list(APPEND _RPM_DIRS_TO_OMIT "-o;-path;.${_DIR}")
endforeach()
endif()
if (CPACK_RPM_PACKAGE_DEBUG)
message("CPackRPM:Debug: Final list of path to OMIT in RPM: ${_RPM_DIRS_TO_OMIT}")
endif()
# Use files tree to construct files command (spec file)
# We should not forget to include symlinks (thus -o -type l)
# We should include directory as well (thus -type d)
# but not the main local dir "." (thus -a -not -name ".")
# We must remove the './' due to the local search and escape the
# file name by enclosing it between double quotes (thus the sed)
# Then we must authorize any man pages extension (adding * at the end)
# because rpmbuild may automatically compress those files
execute_process(COMMAND find . -type f -o -type l -o (-type d -a -not ( -name "." ${_RPM_DIRS_TO_OMIT} ) )
COMMAND sed s:.*/man.*/.*:&*:
COMMAND sed s/\\.\\\(.*\\\)/\"\\1\"/
WORKING_DIRECTORY "${WDIR}"
OUTPUT_VARIABLE CPACK_RPM_INSTALL_FILES)
# In component case, put CPACK_ABSOLUTE_DESTINATION_FILES_<COMPONENT> # In component case, put CPACK_ABSOLUTE_DESTINATION_FILES_<COMPONENT>
# into CPACK_ABSOLUTE_DESTINATION_FILES_INTERNAL # into CPACK_ABSOLUTE_DESTINATION_FILES_INTERNAL

View File

@ -50,6 +50,13 @@ install(FILES mylib.h
COMPONENT headers) COMPONENT headers)
if("${CPACK_GENERATOR}" MATCHES "RPM") if("${CPACK_GENERATOR}" MATCHES "RPM")
############## test man pages
install(FILES mylib
DESTINATION share/man/mylib/man3/mylib.1)
install(FILES mylib
DESTINATION share/man/mylib/man3/mylib.1 RENAME mylib2)
############## test symlinks
# Package symbolic links # Package symbolic links
install(DIRECTORY DESTINATION ${CMAKE_INSTALL_LIBDIR}/inside_relocatable_one/depth_two/depth_three COMPONENT libraries) install(DIRECTORY DESTINATION ${CMAKE_INSTALL_LIBDIR}/inside_relocatable_one/depth_two/depth_three COMPONENT libraries)
install(DIRECTORY DESTINATION ${CMAKE_INSTALL_LIBDIR}/inside_relocatable_two/depth_two/different_relocatable/bar COMPONENT libraries) install(DIRECTORY DESTINATION ${CMAKE_INSTALL_LIBDIR}/inside_relocatable_two/depth_two/different_relocatable/bar COMPONENT libraries)

View File

@ -233,7 +233,14 @@ if(CPackGen MATCHES "RPM")
/usr/foo/bar/bin/@in@_@path@@with/@and /usr/foo/bar/bin/@in@_@path@@with/@and
/usr/foo/bar/bin/@in@_@path@@with/@and/@ /usr/foo/bar/bin/@in@_@path@@with/@and/@
/usr/foo/bar/bin/@in@_@path@@with/@and/@/@in_path@ /usr/foo/bar/bin/@in@_@path@@with/@and/@/@in_path@
/usr/foo/bar/bin/@in@_@path@@with/@and/@/@in_path@/mylibapp2$") /usr/foo/bar/bin/@in@_@path@@with/@and/@/@in_path@/mylibapp2
/usr/foo/bar/share
/usr/foo/bar/share/man
/usr/foo/bar/share/man/mylib
/usr/foo/bar/share/man/mylib/man3
/usr/foo/bar/share/man/mylib/man3/mylib.1
/usr/foo/bar/share/man/mylib/man3/mylib.1/mylib
/usr/foo/bar/share/man/mylib/man3/mylib.1/mylib2$")
else() else()
message(FATAL_ERROR "error: unexpected rpm package '${check_file}'") message(FATAL_ERROR "error: unexpected rpm package '${check_file}'")
endif() endif()

View File

@ -0,0 +1,17 @@
.\" Manpage for mylib.
.\" Contact bugs@mylib_author.net.in to correct errors or typos.
.TH mylib 3 "01 May 2015" "1.0" "mylib.so man page"
.SH NAME
mylib \- cpack testing lib
.SH SYNOPSIS
mylib.so
.SH DESCRIPTION
mylib.so test man page.
.SH OPTIONS
Lib does not take any options.
.SH SEE ALSO
mylib(3)
.SH BUGS
No known bugs.
.SH AUTHOR
Someone (author@lib_author.net.in)