#!/bin/sh ###################################################################### url="" pkgbase= vers= arch=i386 build=P1 src="$pkgbase-$vers" OPT_CONFIG="" DOCS="README" pkgs="$pkgbase-$vers" pkgl="$pkgbase-$vers-$arch-$build" ###################################################################### fscheck() { PANGRAM="The quick brown fox jumps over the lazy dog." echo -n "Checking for the filesystem ... " mkdir pangram ; ( cd pangram ; touch $PANGRAM ) mv pangram pangram~ ; mkdir pangram ; touch -r pangram~ pangram tar cpf pangram.tar pangram ; rmdir pangram ; mv pangram~ pangram for i in $PANGRAM ; do tar rpf pangram.tar pangram/$i ; done touch -t `date '+%m%d0900'` pangram.tar ; gzip pangram.tar touch pangram.tar.gz ; mv pangram.tar.gz pangram1.tgz tar cpf pangram.tar pangram touch -t `date '+%m%d0900'` pangram.tar ; gzip pangram.tar touch pangram.tar.gz ; mv pangram.tar.gz pangram2.tgz if cmp -s pangram1.tgz pangram2.tgz ; then echo "OK" rm -rf pangram pangram1.tgz pangram2.tgz else echo "NG" cat <<- "EOF" Hmm, packaging may not be done properly on this filesystem. Would you please try again on a default filesystem, thanks! Happy packaging!! Quitting... EOF exit fi } install2() { install -d ${2%/*} ; install -m 644 $1 $2 } strip_bindir() { echo "compressing in $1" if [ -d $1 ] ; then ( shopt -s nullglob cd $1 for i in * ; do echo "$i" if [ -h $i ] ; then continue ; fi chk=`file $i | grep "not stripped"` if [ "x$chk" != "x" ] ; then echo "stripping -p $i" strip -p $i fi done ) fi } strip_libdir() { echo "compressing in $1" if [ -d $1 ] ; then ( shopt -s nullglob cd $1 for i in *.so *.so.* *.a ; do echo "$i" if [ -h $i ] ; then continue ; fi chk=`nm -a $i | grep " a "` if [ "x$chk" != "x" ] ; then if [ "x$i" != "x${i%.a}" ] ; then echo -n "ranlib and " touch -r $i $i.mt ; ranlib $i ; touch -r $i.mt $i ; rm $i.mt fi echo "stripping -gp $i" strip -gp $i fi done ) fi } gzip_dir() { echo "compressing in $1" if [ -d $1 ] ; then ( cd $1 files=`ls -f --indicator-style=none | tail +3` for i in $files ; do echo "$i" if [ ! -f $i -a ! -h $i -o "x$i" != "x${i%.gz}" ] ; then continue ; fi lnks=`ls -l $i | awk '{print $2}'` if [ $lnks -gt 1 ] ; then inum=`ls -i $i | awk '{print $1}'` for j in `find . -maxdepth 1 -inum $inum` ; do if [ ${j#./} == $i ] ; then gzip -f $i else rm ${j#./} ; ln $i.gz ${j#./}.gz fi done elif [ -h $i ] ; then ln_target=`ls -l $i | awk '{print $11}'` rm $i ; ln -s $ln_target.gz $i.gz else gzip $i fi done for i in $files ; do mv ${i%.gz}.gz $C ; done for i in $files ; do mv $C/${i%.gz}.gz . ; done ) fi } gzip_one() { gzip $1 ; mv $1.gz $C ; mv $C/${1##*/}.gz ${1%/*} } compress() { for i in {$P/usr,$P}/{bin,sbin} ; do strip_bindir $i ; done for i in {$P/usr,$P}/lib ; do strip_libdir $i ; done if [ -f $infodir/dir ] ; then rm -f $infodir/dir ; fi gzip_dir $infodir for i in `seq 8` ; do gzip_dir $mandir/man$i ; done } fscheck W=`pwd` for i in `seq 0 $((${#src[@]} - 1))` ; do S[$i]=$W/${src[$i]} ; B[$i]=$W/build`test ${#src[@]} -eq 1 || echo $i` done P=$W/work ; C=$W/pivot infodir=$P/usr/share/info mandir=$P/usr/share/man docdir=$P/usr/share/doc if [ $# -eq 0 ] ; then opt_download=1 opt_config=1 opt_build=1 opt_package=1 else for i in "$@" ; do case $i in download) opt_download=1 ;; config) opt_config=1 ;; build) opt_build=1 ;; package) opt_package=1 ;; esac done fi if [ "$opt_download" == "1" ] ; then for i in $url ; do if [ ! -f ${i##*/} ] ; then wget $i ; fi done for i in $url ; do case ${i##*.} in tar) tar xvpf ${i##*/} ;; gz) tar xvpzf ${i##*/} ;; bz2) tar xvpjf ${i##*/} ;; esac done fi if [ "$opt_config" == "1" ] ; then for i in `seq 0 $((${#B[@]} - 1))` ; do if [ -d ${B[$i]} ] ; then rm -rf ${B[$i]} ; fi ; cp -a ${S[$i]} ${B[$i]} done ###################################################################### # * ./configure を行う前に適用したい設定やパッチなどがある場合はここに # 記述します。 ###################################################################### for i in `seq 0 $((${#B[@]} - 1))` ; do cd ${B[$i]} if [ -f Makefile ] ; then make clean fi if [ -f config.log ] ; then rm -rf config.cache config.log fi if [ -x configure ] ; then ./configure --prefix=/usr --infodir='${prefix}'/share/info \ --mandir='${prefix}'/share/man ${OPT_CONFIG[$i]} fi done fi if [ "$opt_build" == "1" ] ; then for i in `seq 0 $((${#B[@]} - 1))` ; do cd ${B[$i]} if [ -f Makefile ] ; then make fi done fi if [ "$opt_package" == "1" ] ; then if [ `id -u` -ne 0 ] ; then read -p "Do you want to package as root? [y/N] " ans if [ "x$ans" == "xY" -o "x$ans" == "xy" ] ; then cd $W ; /bin/su -c "$0 package" ; exit fi fi if [ -d $P ] ; then rm -rf $P ; fi ; mkdir -p $P if [ -d $C ] ; then rm -rf $C ; fi ; mkdir -p $C touch $W/i.st ; sleep 1 for i in `seq 0 $((${#B[@]} - 1))` ; do cd ${B[$i]} if [ -f Makefile ] ; then make install DESTDIR=$P fi done ###################################################################### # * make install でコピーされないファイルがある場合はここに記述します。 ###################################################################### touch $W/i.et cd $W find $P -newer i.st ! -newer i.et -exec touch -t `date '+%m%d0900'` {} \; compress ###################################################################### # * compress 対象以外で圧縮したいディレクトリやファイルがある場合はここ # に記述します(strip_{bin,lib}dir や gzip_{dir,one} を使います)。 # * 他のアーカイブから追加したいファイルがある場合はここに記述します。 ###################################################################### for i in `seq 0 $((${#DOCS[@]} - 1))` ; do for j in ${DOCS[$i]} ; do for k in ${S[$i]}/$j ; do install2 $k $docdir/${src[$i]}/${k#${S[$i]}/} touch -r $k $docdir/${src[$i]}/${k#${S[$i]}/} gzip_one $docdir/${src[$i]}/${k#${S[$i]}/} done done if [ $i -eq 0 ] ; then install PlamoBuild.$pkgs $docdir/$src touch -t `date '+%m%d0900'` $docdir/$src/PlamoBuild.$pkgs gzip_one $docdir/$src/PlamoBuild.$pkgs else ln $docdir/$src/PlamoBuild.$pkgs.gz $docdir/${src[$i]} fi ( cd $docdir ; find ${src[$i]} -type d -exec touch -r $W/{} {} \; ) done ###################################################################### # * 完成した作業ディレクトリから tar イメージを作成する手順を以降に記述 # します(こだわりを求めないなら単に makepkg でも良いです)。 ###################################################################### # tar cvpf $pkgl.tar -C $P usr/bin/hoge # tar rvpf $pkgl.tar -C $P usr/share/man/man1/hoge.1.gz # tar rvpf $pkgl.tar -C $P usr/share/doc/$src # touch -t `date '+%m%d0900'` $pkgl.tar ; gzip $pkgl.tar ; touch $pkgl.tar.gz # mv $pkgl.tar.gz $pkgl.tgz ( cd $P ; makepkg ../$pkgl.tgz ) fi