summaryrefslogtreecommitdiff
path: root/build-aux/make-info-dir
blob: 2bac1f89392a6c67c982ff3b6328a002613a264b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/bin/sh

### make-info-dir - create info/dir, for systems without install-info

## Copyright (C) 2013 Free Software Foundation, Inc.

## Author: Glenn Morris <rgm@gnu.org>

## This file is part of GNU Emacs.

## GNU Emacs is free software: you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.

## GNU Emacs is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.

## You should have received a copy of the GNU General Public License
## along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.

### Commentary:

## Generate info/dir, for systems without install-info.
## Expects to be called from top-level Emacs source directory.

## It only handles the case where info/dir is missing from the
## installation directory.  It does not handle info/dir being present
## but missing some entries.

### Code:

if test $# -ne 1; then
    echo "Specify destination file"
    exit 1
fi

outfile=$1

echo "Creating $outfile..."

if test -f "$outfile"; then
    echo "$outfile already present"
    exit 1
fi

## Header contains non-printing characters, so this is more
## reliable than using echo.
basefile=build-aux/dir_top

if test ! -f "$basefile"; then
    echo "$basefile not found"
    exit 1
fi


cp $basefile $outfile


## FIXME inefficient looping.
## What we should do is loop once over files, collecting topic and
## direntry information for each.  Then loop over topics and write
## out the results.  But that seems to require associative arrays,
## and I do not know how to do that with portable sh.
## Could use Emacs instead of sh, but till now info generation does
## not require Emacs to have been built.
for topic in "Texinfo documentation system" "Emacs" "Emacs lisp" \
    "Emacs editing modes" "Emacs network features" "Emacs misc features" \
    "Emacs lisp libraries"; do

    cat - <<EOF >> $outfile

$topic
EOF
    ## Bit faster than doc/*/*.texi.
    for file in doc/emacs/emacs.texi doc/lispintro/emacs-lisp-intro.texi \
        doc/lispref/elisp.texi doc/misc/*.texi; do

        ## FIXME do not ignore w32 if OS is w32.
        case $file in
            *-xtra.texi|*efaq-w32.texi|*doclicense.texi) continue ;;
        esac

        dircat=`sed -n -e 's/@value{emacsname}/Emacs/' -e 's/^@dircategory //p' $file`

        ## TODO warn about unknown topics.
        ## (check-info in top-level Makefile does that.)
        test "$dircat" = "$topic" || continue


        sed -n -e 's/@value{emacsname}/Emacs/' \
            -e 's/@acronym{\([A-Z]*\)}/\1/' \
            -e '/^@direntry/,/^@end direntry/ s/^\([^@]\)/\1/p' \
            $file >> $outfile

    done
done

echo "Created $outfile"

exit 0

### make-info-dir ends here