source: projects/texlive-vtlpkg/trunk/tlpdb2rpmspec.sh.in @ 1975

Revision 1975, 16.9 KB checked in by munepi, 14 years ago (diff)

fixed tlpdb2rpmspec.sh.in

  • Property svn:executable set to *
RevLine 
[1476]1#!/bin/bash
2# tlpdb2rpmspec
3#
4# Copyright 2010 Munehiro Yamamoto <munepi@vinelinux.org>
5# This file is licensed under the GNU General Public License version 2
6# or any later version.
7
8Usage(){
9    cat<<EOF
10Usage:  $(basename $0) [option] [pkgname]
11
12This script generates a rpm spec file for CTAN and collection-* packages of TeX Live.
13
14Options:
15        --name:                 return [pkgname]
16        --category:             return the category of [pkgname]
17        --revision:             return the revision of [pkgname]
18        --depend:               return dependencies of [pkgname]
19        --shortdesc:            return the short description of [pkgname]
20        --longdesc:             return the description of [pkgname]
21        --execute:              return post processe of [pkgname]
22        --catalogue-ctan:       return the locate of [pkgname]
23        --catalogue-date:       return the last update of [pkgname]
24        --catalogue-license:    return the license of [pkgname]
25        --catalogue-version:    return the version of [pkgname]
26        --filelist:             return the filelist of [pkgname]
27        --help:                 show this help
28
29Supoort collections-* packages:
30$(egrep "^name collection-" $TLPDB | sed -e "s,name ,,g")
31EOF
32}
33
34check-parameter(){
35    [ -z "$*" ] && Usage && return 1
36
37    while [ ! -z "$*" ]; do
38        case $1 in
[1521]39            --name|--category|--revision|--depend|--shortdesc|--longdesc|--execute|--catalogue-ctan|--catalogue-date|--catalogue-license|--catalogue-version|--filelist)
[1476]40                [ $with_option -eq 1 ] && \
41                    echo "E: you only give one option" && return 1
42                with_option=1
43                ;;
44            --help)
45                Usage
46                return 1
47                ;;
[1521]48            --minimal-collections|--standard-collections|--full-collections)
49                [ ! -f /etc/vine-release ] && \
50                    echo "E: support Vine Linux only" && return 1
51                ;;
52            *)
[1784]53                [ -z "$(egrep -n "^name $1$" $TLPDB)" ] && \
54                    echo "E: unknown option or package: $1" && return 1
[1476]55                ;;
56        esac
57        shift
58    done
59
60    return 0
61}
62
63
64## tlpkg4a [--name|--category|--revision|--depend|--shortdesc|--longdesc|--execute|--catalogue-ctan|--catalogue-date|--catalogue-license|--catalogue-version|--filelist] [pkgname]
65tlpkg4a(){
66    [ $# -eq 2 ] || return 1
67    local opt=$1
68    local pkg=$2
69    local fieldname=$(echo $opt | sed -e "s,--,,")
70
71    ## check param
72    case $opt in
73        --name|--category|--revision|--depend|--shortdesc|--longdesc|--execute|--catalogue-ctan|--catalogue-date|--catalogue-license|--catalogue-version|--filelist)
74            ;;
75        *)
76            echo "E: unknown option: $opt"
77            exit 1
78            ;;
79    esac
80
81    ## get the head line of $pkg record
82    pkg_LINE=$(egrep -n "^name $pkg$" $TLPDB | cut -d":" -f 1)
83
84    ## read tlpdb
[1496]85    is_pkg=0
[1476]86    tail -n $(( $TLPDB_MAXLINE - $pkg_LINE + 1 )) $TLPDB | \
87        while read field; do
88            ## find the record of $pkg
[1496]89            echo "$field" | egrep -q "^name $pkg" && is_pkg=1
90            [ $is_pkg -eq 0 ] && continue
[1476]91           
92            ## return the values of its field name
93            if [ "$opt" = "--filelist" ]; then
94            ## NOTE: we only need texmf-dist directories
95                echo "$field" | egrep "^texmf-dist" | \
96                    sed -e "s, details=.*,," -e "s, language=.*,,"
97            else
98                echo "$field" | egrep "^${fieldname} " | sed -e "s,${fieldname} ,,"
99            fi
100           
101            ## end of the record of $pkg
102            echo "$field" | egrep -q "^[[:blank:]]*$" && break
103        done
104   
105    return 0
106}
107
108## tlpkg2speclicense [pkgname]
109tlpkg2speclicense(){
110    [ $# -eq 1 ] || return 1
111    local pkg=$1
112
113    case $(tlpkg4a --catalogue-license $pkg) in
114        gpl3) echo "GPLv3+";;
115        gpl2) echo "GPLv2+";;
116        gpl) echo "GPL+";;
117        lppl|lppl1.2|lppl1.3) echo "LPPL";;
118        other-free) echo "Freely redistributable without restriction";;
119        pd) echo "Public Domain";;
120        noinfo) echo "No Info";;
121        lgpl) echo "LGPLv2+";;
122        gfsl) echo "LPPL";;
123        bsd) echo "BSD";;
124        knuth) echo "Knuth";;
125        unknown) echo "Unknown";;
126        gfl) echo "LPPL";;
127        artistic2) echo "Artistic 2.0";;
128        fdl) echo "GFDL";;
129        collection) echo "Public Domain";;
130        artistic) echo "Artistic";;
131        other) echo "Other";;
132        ofl) echo "OFSFLD";;
133        apache2) echo "ASL 2.0";;
134        nosource) echo "No Source";;
135        nosell) echo "No Sell";;
136        nocommercial) echo "Non-commercial";;
137        *) return 1;;
138    esac
139    return 0
140}
141
142## tlpkg2manifest [pkgname]
143tlpkg2manifest(){
144    [ $# -eq 1 ] || return 1
145    local pkg=$1
146    local pkgdeps="$(tlpkg4a --depend $pkg)"
[1521]147    local i=
[1476]148
149    tlpkg4a --filelist $pkg || return 1
150
[1496]151    ## if $pkg is not collection-*, only return the filelist of $pkg
152    echo $pkg | egrep -q "^collection-" || return 0
153
[1476]154    ##!! we need pure filelist of $pkg; remove collection-*
155    pkgdeps=$(echo $pkgdeps | sed -e "s,collection-[-A-Za-z0-9]*,,g")
156
157    [ -z "$pkgdeps" ] && return 0
158    for i in $pkgdeps; do
159        tlpkg4a --filelist $i || return 1
160    done
161
162    return 0
163}
164
165## tlpkg2maplist [pkgname]
166tlpkg2maplist(){
167    [ $# -eq 1 ] || return 1
168    local pkg=$1
169    local pkgdeps="$(tlpkg4a --depend $pkg)"
[1521]170    local i=
[1476]171
172    tlpkg4a --execute $pkg | grep -e "Map" | sed -e "s,^add,,g"
173
174    ##!! we need pure filelist of $pkg; remove collection-*
175    pkgdeps=$(echo $pkgdeps | sed -e "s,collection-[-A-Za-z0-9]*,,g")
176
177    [ -z "$pkgdeps" ] && return 0
178    for i in $pkgdeps; do
179        tlpkg4a --execute $i | grep -e "Map" | sed -e "s,^add,,g"
180    done
181
182    return 0
183}
184
[1496]185## tlpkg2inilist [pkgname]
186tlpkg2inilist(){
187    [ $# -eq 1 ] || return 1
188    local pkg=$1
189    local pkgdeps="$(tlpkg4a --depend $pkg)"
[1521]190    local i=
[1476]191
[1496]192    ## search AddFormat, AddHypen
193    tlpkg4a --execute $pkg | grep -e "Add"
194
195    ##!! we need pure filelist of $pkg; remove collection-*
196    pkgdeps=$(echo $pkgdeps | sed -e "s,collection-[-A-Za-z0-9]*,,g")
197
198    [ -z "$pkgdeps" ] && return 0
199    for i in $pkgdeps; do
200        tlpkg4a --execute $i | grep -e "Add"
201    done
202
203    return 0
204}
205
[1476]206## mkrpmspec [pkgname]
207mkrpmspec(){
208    [ $# -eq 1 ] || return 1
209    local pkg=$1
[1521]210    local i=
[1476]211
212    RPM_SUMMARY="TeX Live: $(tlpkg4a --shortdesc $pkg)"
213
214    ## Requires tag for texlive
215    RPM_REQUIRES=$(for i in $(tlpkg4a --depend $pkg | egrep "^collection-" | egrep -v "^collection-documentation"); do echo "Requires: texlive-$i = %{version}"; done)
216
217    ## License tag
218    RPM_LICENSE="$(tlpkg2speclicense $pkg),"
219    for i in $(tlpkg4a --depend $pkg | egrep -v "^collection-"); do
220        tmp=$(tlpkg2speclicense $i)
221        echo "$RPM_LICENSE" | grep -q "${tmp},"
222        [ $? -eq 1 ] && RPM_LICENSE="${RPM_LICENSE} ${tmp},"
223    done
224    RPM_LICENSE=$(echo "$RPM_LICENSE" | sed -e "s/,$//" | sed -e "s/^, //")
225    [ -z "$RPM_LICENSE" ] && RPM_LICENSE=distributable
226
[1499]227    PKG_SHORTDESC=$(tlpkg4a --shortdesc $pkg)
228    PKG_LONGDESC=$(tlpkg4a --longdesc $pkg)
229
230    PKG_CTANPKGSLIST=$(for i in $(tlpkg4a --depend $pkg); do \
231        if [ -z "$(echo "$i" | grep "collection-")" ]; then \
232            echo -n "$i: "; \
233            tmp=$(tlpkg4a --shortdesc $i); \
234            [ -z "${tmp}" ] && echo || echo "$tmp"; \
235        fi
236        done)
237
238    PKG_MANIFEST=$(tlpkg2manifest $pkg)
[1521]239    [ -z "${PKG_MANIFEST}" ] && \
240        echo "W: empty manifest: $pkg" && return 1
[1499]241
[1476]242    with_docpkg=0
243    [ -z "$(echo $pkg | grep "collection-documentation")" ] && \
[1499]244        [ ! -z "$(echo "${PKG_MANIFEST}" | grep texmf-dist/doc/)" ] && \
[1476]245        with_docpkg=1
246
[1496]247    with_maplist=0
248    MAPLIST="$(tlpkg2maplist $pkg)"
249    [ ! -z "$MAPLIST" ] && with_maplist=1
250    ##echo $with_maplist && echo "$MAPLIST" && exit
251
252    with_inilist=0
253    INILIST="$(tlpkg2inilist $pkg)"
254    [ ! -z "$INILIST" ] && with_inilist=1
255    ##echo $with_inilist && echo "$INILIST" && exit
256
[1476]257cat<<EOF
258## -*- coding: utf-8-unix -*-
[1709]259## NOTE: This spec file is generated by $(basename $0) ${VERSION}-${RELEASE}:
260## $(basename $0) $pkg
[1476]261
262%bcond_with firstbuild
263
264%define tex_destdir     %{_datadir}
265%define texmf           %{tex_destdir}/texmf
266%define texlive_src     %{tex_destdir}/texlive-sources
267%define build_tex_destdir       %{buildroot}%{tex_destdir}
268%define build_texmf     %{buildroot}%{texmf}
269
270%define exec_mktexlsr  [ -x %{_bindir}/texconfig-sys ] && PATH=%{_bindir}:\$PATH %{_bindir}/texconfig-sys rehash
271%define exec_texhash  [ -x %{_bindir}/texhash ] && PATH=%{_bindir}:\$PATH %{_bindir}/texhash
272%define exec_updmap   [ -x %{_bindir}/updmap-sys ] && PATH=%{_bindir}:\$PATH %{_bindir}/updmap-sys --nostop
273%define exec_fmtutil  [ -x %{_bindir}/fmtutil-sys ] && PATH=%{_bindir}:\$PATH %{_bindir}/fmtutil-sys --all >/dev/null 2>&1
274%define exec_upddeffont    [ -x %{_sbindir}/update-defaultfont ] && %{_sbindir}/update-defaultfont 2> /dev/null
275%define vartexfonts %{_var}/lib/texmf
276
277%define __find_provides %{nil}
278%define __find_requires %{nil}
279%define __perl_provides %{nil}
280%define __perl_requires %{nil}
281
282Autoreq: 0
283
284Summary: ${RPM_SUMMARY}
[1499]285Summary(ja): ${RPM_SUMMARY}
[1476]286Name: texlive-$pkg
287Version: ${VERSION}
[1915]288Release: ${RELEASE}%{?_dist_release}
[1476]289License: ${RPM_LICENSE}
290Group: Applications/Publishing
291URL:http://www.tug.org/texlive/
292
293Requires: texlive = %{version}
294$RPM_REQUIRES
295
296Requires(post):         texlive = %{version}
297Requires(postun):       texlive = %{version}
298BuildRequires:          texlive-sources = %{version}
299
300BuildArch:      noarch
301Buildroot:      %{_tmppath}/%{name}-%{version}-root
302
303Vendor:         ${RPM_VENDOR}
304Distribution:   ${RPM_DISTRIBUTION}
305Packager:       ${RPM_PACKAGER}
306
307%description
308The TeX Live software distribution offers a complete TeX system for a
309variety of Unix, Macintosh, Windows and other platforms. It
310encompasses programs for editing, typesetting, previewing and printing
311of TeX documents in many different languages, and a large collection
312of TeX macros and font libraries.
313
314The distribution includes extensive general documentation about TeX,
315as well as the documentation for the included software packages.
316
[1499]317This package is a collection of ${PKG_SHORTDESC}:
318${PKG_LONGDESC}
[1476]319
320This package contains the following CTAN packages:
[1499]321${PKG_CTANPKGSLIST}
[1476]322
[1499]323%description -l ja
324TeX Live ソフトウェアディストリビューションは、
325さまざまな Unix, Macintosh, Windows、および
326他のプラットホームに対して完全な TeX システムを提供します。
327多くの異なった言語を含む TeX ドキュメントの
328編集、組版、閲覧、印刷するためのプログラム、
329そして、TeX マクロやフォントライブラリの大きなコレクションを
330同梱しています。
331
332このディストリビューションは
333同梱しているソフトウェアパッケージのためのドキュメントばかりでなく、
334TeX に関するたくさんの一般的なドキュメントを含んでいます。
335
336このパッケージは以下のようなパッケージ集です。
337${PKG_SHORTDESC}:
338${PKG_LONGDESC}
339
340このパッケージは以下の CTAN パッケージを含んでいます:
341${PKG_CTANPKGSLIST}
342
[1476]343EOF
344
345## subpackage: %{name}-doc
346if [ $with_docpkg -eq 1 ]; then
347    cat<<EOF
348%package doc
349Summary: TeX Live: Documentation files of %{name}
350Group: Applications/Publishing
351Requires: %{name} = %{version}-%{release}
352
353%description doc
354This package contains documentation files of %{name}.
355
356EOF
357fi
358
359cat<<EOF
360%prep
361
362%build
363
364%install
365[ -n "%{buildroot}" -a "%{buildroot}" != / ] && %__rm -rf %{buildroot}
366
367PREF=%{buildroot}%{tex_destdir}
368
369manifest=(
[1499]370${PKG_MANIFEST}
[1476]371)
372
373%__mkdir_p \${PREF}/texmf-dist
374for i in "\${manifest[@]}"; do
375    %__install -D %{texlive_src}/\$i \${PREF}/\$i
376done
377
378## info
379%__rm -f %{buildroot}%{_infodir}/dir
380%__gzip -9nf %{buildroot}%{_infodir}/*info* ||:
381
382## man
383## man t1* files are provided by t1utils
384for i in t1ascii t1asm t1binary t1disasm t1mac t1unmac; do
385    %__rm %{buildroot}%{_mandir}/man*/\${i}.* ||:
386done
387
388## man some files are provided by psutils
389for i in epsffit extractres fixdlsrps fixfmps fixmacps fixpsditps fixpspps fixscribeps fixtpps fixwfwps fixwpps fixwwps getafm includeres psbook psmerge psnup psresize psselect pstops; do
390    %__rm %{buildroot}%{_mandir}/man*/\${i}.* ||:
391done
392
[1968]393## fix perl path
[1975]394for i in source/metapost/expressg/expressg.dtx \\
395         doc/metapost/expressg/n2mpsprl.prl \\
[1968]396         doc/latex/songbook/contrib/crd2sb/crd2sb; do
[1975]397    [ -f %{build_texmf}-dist/\${i} ] && \\
[1968]398        %__sed -i -e "s|^#!/usr/local/bin/perl|#!%{__perl}|" %{build_texmf}-dist/\${i}
399done
400
[1476]401## remove asymptote directries, which provides asymptote package
402find %{buildroot} -regex ".*asymptote.*" | xargs %__rm -rf
403# find %{buildroot} -name "Makefile" | xargs %__rm -f
404
405# ## remove xindy
406# find %{buildroot} -regex ".*xindy.*" | xargs %__rm -rf
407
408# ## remove tex4ht
409# find %{buildroot} -regex ".*tex4ht.*" | xargs %__rm -rf
410
[1968]411## remove arch dependent binaries
412%__rm -f %{build_texmf}-dist/source/latex/splitindex/splitindex-{OpenBSD,Linux}-i386
413
[1476]414## remove unpackaging files
415find %{buildroot} | %__grep -e "\\.\(la\|a\)\$" | xargs %__rm -f
416find %{buildroot} | %__grep -e "\\.\(diff\|patch\)\$" | xargs %__rm -f
417
418## Files list
419find %{buildroot} -type f -or -type l | \\
420    %__sed -e "s|%{buildroot}||g" > filelist.full
421
422find %{buildroot}%{texmf}-dist -type d | \\
423    %__sed -e "s|^%{buildroot}|%dir |" \\
424           -e "s|\$|/|"             >> filelist.full
425
426EOF
427
428## subpackage: %{name}-doc
429if [ $with_docpkg -eq 1 ]; then
430    cat<<EOF
431## subpackages
432grep "/texmf-dist/doc/" filelist.full > filelist.doc
433cat filelist.doc filelist.full | sort | uniq -u > filelist.tmp
434%__mv -f filelist.tmp filelist.full
435
436EOF
437fi
438
439cat<<EOF
440%clean
441%__rm -rf %{buildroot}
442
443%post
444%{exec_texhash}
[1496]445
446EOF
447
448## Running updmap
449if [ $with_maplist -eq 1 ]; then
450    cat<<EOF
[1498]451[ -f %{texmf}/web2c/updmap.cfg ] || exit 0
452
[1496]453$(echo "$MAPLIST" | while read maptype map; do \
454    cat<<EOT
[1499]455    %{exec_updmap} --listmaps 2>/dev/null | egrep -q "^#! ${maptype} ${map}" && \\
456        echo -n "    " && \\
457        echo -n "Running updmap: enable ${map} ... " && \\
[1915]458        %{exec_updmap} --nomkmap --enable ${maptype} ${map} >/dev/null 2>&1 && \\
[1499]459        echo "done."
[1496]460EOT
461done)
[1915]462echo -n "    " && \\
463    echo -n "Running updmap: recreate map files ... " && \\
464    %{exec_updmap} >/dev/null 2>&1 && \\
465    echo "done."
[1496]466
467EOF
[1476]468fi
469
[1496]470## Running fmtutil
471if [ $with_inilist -eq 1 ]; then
472    cat<<EOF
473echo -n "    "
474echo -n "Running fmtutil ... " && %{exec_fmtutil} && echo "done."
475
476EOF
[1476]477fi
478
[1496]479cat<<EOF
[1476]480exit 0
481
482
483%postun
484if [ "\$1" = 0 ]; then
485    %{exec_texhash}
[1496]486
487EOF
488
489## Running updmap
490if [ $with_maplist -eq 1 ]; then
491    cat<<EOF
[1498]492    [ -f %{texmf}/web2c/updmap.cfg ] || exit 0
493
[1496]494$(echo "$MAPLIST" | while read maptype map; do \
495    cat<<EOT
[1499]496    %{exec_updmap} --listmaps 2>/dev/null | egrep -q "^${maptype} ${map}" && \\
497        echo -n "    " && \\
498        echo -n "Running updmap: disable ${map} ... " && \\
[1915]499        %{exec_updmap} --nomkmap --disable ${map} >/dev/null 2>&1 && \\
[1496]500        echo "done."
501EOT
502done)
[1915]503echo -n "    " && \\
504    echo -n "Running updmap: recreate map files ... " && \\
505    %{exec_updmap} >/dev/null 2>&1 && \\
506    echo "done."
[1496]507
508EOF
[1476]509fi
510
[1496]511cat<<EOF
512fi
513
[1476]514exit 0
515
516%files -f filelist.full
517%defattr(-,root,root)
518
519EOF
520## subpackage: %{name}-doc
521if [ $with_docpkg -eq 1 ]; then
522    cat<<EOF
523%files -f filelist.doc doc
524%defattr(-,root,root)
525
526EOF
527fi
528
529cat<<EOF
530%changelog
531* $(LANG=C date +%a) $(LANG=C date +%b) $(date +%d) $(date +%Y) ${RPM_GPG_NAME} ${VERSION}-${RELEASE}
532- generated by $(basename $0) ${VERSION}-${RELEASE}: $(basename $0) $(echo $*)
[1968]533- removed arch dependent binaries (texlive-collection-latexextra)
534- fixed perl path
[1915]535- improved updmap process in %%post and %%postun
536
537* Sat Aug 07 2010 Munehiro Yamamoto <munepi@vinelinux.org> 2009-1
538- generated by tlpdb2rpmspec 2009-1: tlpdb2rpmspec $(echo $*)
[1476]539EOF
540
541    return 0
542}
543
[1521]544## mkrpmcollection [--minimal-collections|--standard-collections|--full-collections]
545mkrpmcollection(){
546    local category=$(echo $1 | sed -e "s/--\([a-z]*\)-collections/\1/")
547    local category_pkglist=
548    local i=
549
550    case $category in
551        minimal|standard)
552            category_pkglist=$(grep -e "${category}," $CATEGORYLIST | sed -e "s/${category},//g" | sed -e "s/,$//g")
553            ;;
554        full)
555            category_pkglist=$(Usage | egrep "^collection-")
556            ;;
557        *)
558            echo "E: unknown category: $category"
559            return 1
560            ;;
561    esac
562
563    for i in ${category_pkglist}; do
564        mkrpmspec $i > texlive-${i}-vl.spec
[1918]565        if [ $? -eq 1 ]; then
566            echo "texlive-${i}-vl.spec: "
567            cat texlive-${i}-vl.spec
568            rm -f texlive-${i}-vl.spec
569            continue
570        fi
[1521]571        rpmbuild -ba texlive-${i}-vl.spec || return 1
572    done
573
574    return 0
575}
576
[1476]577setup-tlpdb2rpmspec(){
578    ## load your .vtlpkg.conf
579    if [ -f ${HOME}/.vtlpkg.conf ]; then
580        . ${HOME}/.vtlpkg.conf
581    else
582        echo "E: ${HOME}/.vtlpkg.conf: No such file"
583        return 1
584    fi
585
586    [ -z "$RPM_VENDOR" ] && \
587        echo "E: \$RPM_VENDOR is empty" && exit 1
588    [ -z "$RPM_DISTRIBUTION" ] && \
589        echo "E: \$RPM_DISTRIBUTION is empty" && exit 1
590    [ -z "$RPM_GPG_NAME" ] && \
591        echo "E: \$RPM_GPG_NAME is empty" && exit 1
592    [ -z "$RPM_PACKAGER" ] && \
593        echo "E: \$RPM_PACKAGER is empty" && exit 1
594
595    ## setup configurations
596    VERSION=@@VTLPKG_VERSION@@
597    RELEASE=@@VTLPKG_RELEASE@@
598
599    ## set a tlpdb file for TeX Live, which is a package database file.
600    TLPDB=@@VTLPKG_TLPDB@@
601    TLPDB_MAXLINE=$(wc -l $TLPDB | cut -d" " -f 1)
602
[1521]603    ## category of collection-*
604    CATEGORYLIST=@@VTLPKG_CATEGORYLIST@@
605
[1476]606    ## set some booleans
607    with_option=0
608}
609
610##############################################################################
611
612setup-tlpdb2rpmspec || exit 1
613
614check-parameter $* || exit 1
615
616case $1 in
617    --name|--category|--revision|--depend|--shortdesc|--longdesc|--execute|--catalogue-ctan|--catalogue-date|--catalogue-license|--catalogue-version|--filelist)
618        tlpkg4a $1 $2 || exit 1
619        ;;
[1521]620    --minimal-collections|--standard-collections|--full-collections)
621        mkrpmcollection $1 || exit 1
[1476]622        ;;
623    *)
624        mkrpmspec $1 || exit 1
625        ;;
626esac
627
628exit
629
630### end of file
Note: See TracBrowser for help on using the repository browser.