[cmake-developers] [CMake 0013451]: RPMs created with CPackRPM.cmake should not include non-empty directories in their contents-list
Mantis Bug Tracker
mantis at public.kitware.com
Thu Aug 2 12:03:20 EDT 2012
The following issue has been SUBMITTED.
======================================================================
http://public.kitware.com/Bug/view.php?id=13451
======================================================================
Reported By: Andy Piper
Assigned To:
======================================================================
Project: CMake
Issue ID: 13451
Category: Modules
Reproducibility: always
Severity: major
Priority: normal
Status: new
======================================================================
Date Submitted: 2012-08-02 12:03 EDT
Last Modified: 2012-08-02 12:03 EDT
======================================================================
Summary: RPMs created with CPackRPM.cmake should not include
non-empty directories in their contents-list
Description:
I am building RPM packages using the CPackRPM.cmake module. The RPMs have a
default install prefix of "/opt/mycompany" and have been made relocatable like
so:
set(CPACK_PACKAGING_INSTALL_PREFIX "/opt/mycompany")
set(CPACK_PACKAGE_RELOCATABLE TRUE)
The RPMs are relocatable because they are being installed into custom locations
(using the --prefix option) by non-root users who have private RPM databases
(see section 4 of http://www.nordugrid.org/documents/rpm_for_everybody.html).
This setup will allow us to install different versions of our components for
development and maintenance work on a single machine, as required.
When attempting to install our RPMs to custom locations as a non-root user using
a command like this:
rpm -ivh --prefix=/home/andy/workspace/myproject/contrib \
--dbpath=/home/andy/workspace/myproject/contrib/rpmdb \
mypackage-1.0.rpm
...the following error was reported:
error: unpacking of archive failed on file /opt: cpio: chmod failed -
Operation not permitted
But I wasn't installing the RPM to /opt! So I looked at the content-list of the
RPM created using CPackRPM.cmake (using "less <rpm-package>"), and saw that it
began with:
/opt
/opt/mycompany
/opt/mycompany/lib64
/opt/mycompany/lib64/libcomponent_one.so
...etc...
(FYI, The path "/opt/mycompany" will be replaced by the --prefix option in the
"rpm" command above)
I then looked at at the content-list of another relocatable RPM with the same
default install prefix, but this package had been created by hand using the
"rpmbuild" command and a normal .spec file. The content-list in this RPM began
with:
/opt/mycompany/lib64/libcomponent_two.so
...etc...
There were no entries to explicitly create non-empty directories, and this RPM
*could* be installed to non-default locations by non-root users (with their
fancy private RPM databases). This told me that the entries to create non-empty
directories should not be present in the content-list: the RPM package-manager
will handle these directories for you.
This led me towards the "EXECUTE_PROCESS(COMMAND find . -type f ...)" call in
CPackRPM.cmake which populates the content-list for the RPM being built. This
command was searching from the "build root" directory (".") and was including
non-empty directories in its output. After changing the search to start at the
install-prefix directory ("./${CPACK_PACKAGING_INSTALL_PREFIX}") and ignoring
non-empty directories, the RPM-installation issue was resolved.
So the fix is to change the "find" command from this:
find . -type f -o -type l -o (-type d -a -not -name ".")
to this:
find ./${CPACK_PACKAGING_INSTALL_PREFIX} -type f -o -type l -o (-type d -a
-not -name "." -a -empty)
I have attached a patch with this fix.
Steps to Reproduce:
Build any RPM using CPackRPM.cmake and examine the file-list using "less
<rpm-package>". The content-list will begin with a series of one or more
non-empty directories, when it should begin with the first file (or
intentionally empty directory)
Additional Information:
Fix has been tested on SLES 11.2 and OpenSUSE 12.1
======================================================================
Issue History
Date Modified Username Field Change
======================================================================
2012-08-02 12:03 Andy Piper New Issue
2012-08-02 12:03 Andy Piper File Added: CPackRPM.cmake.patch
======================================================================
More information about the cmake-developers
mailing list