File packman2obs.sh of Package fakePackman
#!/bin/bash
# Not sure if it requires BASH, hardcoded just in case.
DATE='20010101'
# For the changelog date
export LC_ALL=C
for DISTRO in $@; do
# I create different tars for 32 and 64 bits just in case their symbol tables are different
for ARCH in i586 x86_64; do
# Data is obtained from the -devel package, that is supposed to be unique
RPM_FILE=$(ls $DISTRO/*devel*.$ARCH.rpm)
NAME=$(rpm -qp --qf '%{NAME}' $RPM_FILE)
RELEASE=$(rpm -qp --qf '%{RELEASE}' $RPM_FILE)
TEMPDIR=$(mktemp -d)
# In cases like ffmpeg the real libraries are splitted in multiple packages so I accept any RPM, probably a check would be needed
for RPM in $DISTRO/*.$ARCH.rpm; do
rpm2cpio $RPM | (cd $TEMPDIR; cpio -idm 2>/dev/null) || { echo "unpack failed: $?"; exit 2; }
done
# I don't need docs
for FILE in $(rpm -qpd $RPM_FILE); do
rm -rf $TEMPDIR$FILE
done
# .a files contain the code and must be deleted, and I don't like .la ones ;-)
find $TEMPDIR ! -type d -a \( -name '*.a' -o -name '*.la' \) -delete
find $TEMPDIR -empty -delete
for LIBRARY in $(find $TEMPDIR -type f -name '*.so*' | sort); do
# I only want symbols from the dynamic table
strip "$LIBRARY"
# Generate source from library
../gensyms.pl "$LIBRARY" -o "$LIBRARY.c" -v "$LIBRARY.v"
# Also need the soname
readelf -d "$LIBRARY" | fgrep SONAME | sed 's/.*\[\(.*\)\]/\1/' > $LIBRARY.soname
rm -f "$LIBRARY"
# For the Makefile $LIBRARY path must be relative
LIBRARY=$(echo $LIBRARY | sed "s:$TEMPDIR/::")
if [ -e "$TEMPDIR/$LIBRARY.v" ]; then
printf "$LIBRARY : $LIBRARY.c\n\tcc \$(CFLAGS) -shared -fpic -Wl,-soname=\`cat \$@.soname\` -Wl,--version-script="$LIBRARY".v -o \$@ \$<\n\trm -f $LIBRARY.c $LIBRARY.v $LIBRARY.soname\n\n" >> $TEMPDIR/Makefile.temp
else
printf "$LIBRARY : $LIBRARY.c\n\tcc \$(CFLAGS) -shared -fpic -Wl,-soname=\`cat \$@.soname\` -o \$@ \$<\n\trm -f $LIBRARY.c $LIBRARY.soname\n\n" >> $TEMPDIR/Makefile.temp
fi
done
# I need an "all" rule
awk 'BEGIN {printf "all : "} /^[^\t]/ {printf $1" "} END {printf "\n\n"}' $TEMPDIR/Makefile.temp > $TEMPDIR/Makefile.pmet
cat $TEMPDIR/Makefile.pmet $TEMPDIR/Makefile.temp > $TEMPDIR/Makefile
rm -f $TEMPDIR/Makefile.{temp,pmet}
tar cjf "$NAME-$ARCH-$DISTRO.tar.bz2" --owner root --group root --mtime="$DATE" -C $TEMPDIR .
touch -d "$DATE" "$NAME-$ARCH-$DISTRO.tar.bz2"
echo "$NAME-$ARCH-$DISTRO.tar.bz2 done"
rm -rf $TEMPDIR
done
# The stupid data is because of build-compare
echo "Name: $NAME
URL: http://build.opensuse.org/
License: Contact author
Group: Development/Libraries
Version: $DATE
Release: 1
Summary: Fake $NAME
%ifarch i586
Source0: http://build.opensuse.org/$NAME-i586-$DISTRO.tar.bz2
%else %ifarch x86_64
Source0: http://build.opensuse.org/$NAME-x86_64-$DISTRO.tar.bz2
%endif
BuildRequires: pkg-config" > $NAME-$DISTRO.spec
PATCHNUM=0
for PATCH in *.patch; do
[ -f $PATCH ] && echo "Patch$((PATCHNUM++)): $PATCH" >> $NAME-$DISTRO.spec
done
echo "
%description
$NAME
This version is modified to remove any real code.
%prep
%setup -qc" >> $NAME-$DISTRO.spec
PATCHNUM=0
for PATCH in *.patch; do
[ -f $PATCH ] && echo "%patch$((PATCHNUM++))" >> $NAME-$DISTRO.spec
done
echo "
%build
%{__make} CFLAGS=\"\$RPM_OPT_FLAGS\" %{?jobs:-j%jobs}
%install
cp -a * %{buildroot}
rm -f %{buildroot}/Makefile
find %{buildroot} -name '*.orig' -delete
# Every file minus those already available in the filesystem package
rpm -ql filesystem > .filesystemlist
find %{buildroot} -mindepth 1 | sed 's:%{buildroot}::' > .rpmlist
sort .rpmlist .filesystemlist | uniq -d > .duplist
sort .rpmlist .duplist | uniq -u > %{name}.files
%{__rm} -f .filesystemlist .duplist .rpmlist
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
%files -f %{name}.files
%defattr(-, root, root, 0755)
%changelog
$(echo "* $(date -d "$DATE" '+%a %b %d %Y') Me")
- converted by packman2obs.sh from Packman version" >> $NAME-$DISTRO.spec
touch -d "$DATE" $NAME-$DISTRO.spec
echo "$NAME-${DISTRO}.spec done."
done