Development/Tasks/Packaging/Specfile Hacks

From Mandriva Community Wiki

Jump to: navigation, search


This page serves as a copy and paste resource... (because I have a hard time remembering...). Small fixes that you can use to fix issues in rpm spec files.

Contents


rpmlint fixes

rpmlint has recently started to nag about CRLF files (Carriage Return + Line Feed). These are mostly files made using that OS from the evil empire. To fix this, you could do:

BuildRequires: file

%setup
# strip away annoying ^M
find . -type f|xargs file|grep 'CRLF'|cut -d: -f1|xargs perl -p -i -e 's/\r//'
find . -type f|xargs file|grep 'text'|cut -d: -f1|xargs perl -p -i -e 's/\r//'

(for some reason some ms files are not caught by the above, please tell me why...)

Other tools that also could be used are dos2unix, tr, sed, etc. I tried to use dos2unix for a while, but it totally trashed the mysql-query-browser-1.1.7 build...

Only time, trial and error will tell which method is the best..., I guess?

You may also get some warnings about included CVS/SVN files, and I usually fix that like this:

%setup
if [ -d ./CVS ]; then
    echo "Fixing strange attribs"
    find . -type d -perm 0700 -exec chmod 755 {} \;
    find . -type f -perm 0555 -exec chmod 755 {} \;
    find . -type f -perm 0444 -exec chmod 644 {} \;
fi

for i in `find . -type d -name CVS`  `find . -type d -name .svn` `find . -type f -name .cvs\*` `find . -type f -name .#\*`; do
    if [ -e "$i" ]; then rm -rf $i; fi >&/dev/null
done

One liners

Extract all spec files from main and contrib:

cd /extract/directory/location
for i in /SRPMS/main/*.rpm; do rpm2cpio $i | cpio -mi \*.spec; done
for i in /SRPMS/contrib/*.rpm; do rpm2cpio $i | cpio -mi \*.spec; done

Note: Correct spec file naming is crucial in this example, if not some will get owerwritten.

Search and replace

Multiline search and replace using perl (thanks goes to RafaelGarciaSuarez)

Suppose you have two lines in a file like this:

known_line1
known_line2

And you want to replace these with something else, this is how to do it:

perl -pi -e -0777 's/known_line1\nknown_line2/two other lines/g' the_file

ms windows users will have to use -i.bak like so:
perl -i.bak -0777 -pe 's/known_line1\nknown_line2/two other lines/g' the_file
Personal tools