Hi Eric,

On 06/01/2012, at 7:36 PM, Eric Noulard wrote:

>> From a ton of googling, consensus seems to be that for directories that you 
>> "know" are on the target system, you don't have to list them in the %files 
>> list.  I'm confident that /etc/init.d is in this category.
> 
> I think you are right for that and we should add a list of "don't"
> include directories,
> or more generally
> We should add
> 
> CPACK_RPM_FILTER_FILELIST
> [...]
> You are welcome to file a bug report on that.

I will, but I think I found an underlying bug too... read on.

> I think there is an unexpected [nasty] workaround...
> [...]
> This should work. At least it works on my small test here.
> Please tell us if it works for you.

Almost.  The RPM compiles with the %ignore'd comment (lovely dirty hack, by the 
way).  But the resulting RPM still has the offending directory:

$ rpm -q --filesbypkg -p mypackage.rpm
mypackage /etc
mypackage /etc/init.d
mypackage /etc/init.d/mydaemon
[...]

Hand-editing the .spec file and completely removing the %ignore line, and it's 
still being included.

I think I found out why.  When I pack verbosely, I get these warnings from 
rpmbuild:

warning: File listed twice: /etc/init.d/mydaemon
warning: File listed twice: /etc/sysconfig
warning: File listed twice: /etc/sysconfig/autodesk
warning: File listed twice: /etc/sysconfig/autodesk
warning: File listed twice: /etc/sysconfig/autodesk/mydaemon
warning: File listed twice: /etc/sysconfig/autodesk/mydaemon
warning: File listed twice: /etc/sysconfig/autodesk/mydaemon
[...]

What's happening is that CPack is putting directories in the %files list (as it 
should) but it isn't tagging them with the %dir directive, so rpmbuild is doing 
a little mini "find . -print" on each line in %files, and ends up re-including 
/etc/init.d when it processes /etc.

About the %dir directive: 
http://www.rpm.org/max-rpm/s1-rpm-inside-files-list-directives.html#S3-RPM-INSIDE-DIR-DIRECTIVE

I confirmed that by %ignore-ing /etc too:
SET(CPACK_RPM_jobmanager_USER_FILELIST "%ignore /etc" "%ignore /etc/init.d")
(%dir would have worked for /etc too) and now the RPM correctly has only 
mydaemon and not its ancestors:
$ rpm -q --filesbypkg -p /tmp/mypackage.rpm
mypackage /etc/init.d/mydaemon

NOW the workaround succeeds.

So here's my assertion:

CPackRPM should be explicitly marking directories with "%dir" in the %files 
list, to prevent rpmbuild from recursively including each directory's 
descendants implicitly.

That's a pretty big change in behaviour, though.  What do other users of 
CPackRPM think?  Perhaps it's never actually come up because we haven't had 
CPACK_RPM_USER_FILELIST for long enough for anyone to notice.

> Ok with, but on my side I do happily review clean patches :-]

I'll file a bug report for the %dir "File listed twice" issue as well as a 
placeholder for your suggested CPACK_RPM_FILTER_FILELIST variable.  Then I'll 
get to work on some patches.

Thanks for the hack.  I've now got a workaround until 2.8.8. :)

--

Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to