| #! /bin/sh |
| # Wrapper around gettext for programs using the msgid convention. |
| # Copyright 1998, 2001, 2002, 2003, 2009 Free Software Foundation, Inc. |
| |
| # Written by Paul Eggert <eggert@twinsun.com>. |
| # Revised by Zack Weinberg <zackw@stanford.edu> for no-POTFILES operation. |
| |
| # This file is part of GCC. |
| |
| # GCC 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, or (at your option) |
| # any later version. |
| |
| # GCC 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 GCC; see the file COPYING3. If not see |
| # <http://www.gnu.org/licenses/>. |
| |
| # Always operate in the C locale. |
| LANG=C |
| LANGUAGE=C |
| LC_ALL=C |
| export LANG LANGUAGE LC_ALL |
| |
| # Set AWK if environment has not already set it. |
| AWK=${AWK-awk} |
| |
| # The arguments to this wrapper are: the program to execute, the |
| # name of the "package", and the path to the source directory. |
| |
| if [ $# -ne 3 ] |
| then echo "usage: $0 <xgettext> <package> <srcdir>" |
| exit 1 |
| fi |
| |
| xgettext=$1 |
| package=$2 |
| srcdir=$3 |
| |
| case `$xgettext --version | sed -e 1q | sed -e 's/^\([^0-9]*\)//'` in |
| 0.14.[5-9]* | 0.14.[1-9][0-9]* | 0.1[5-9]* | 0.[2-9][0-9]* | [1-9].*) : ;; |
| *) echo "$xgettext is too old. GNU xgettext 0.14.5 is required" |
| exit 1 ;; |
| esac |
| |
| nl=' |
| ' |
| |
| set -e |
| |
| # Create temporary directory for scratch files. |
| T=exg$$.d |
| mkdir $T |
| trap "rm -r $T" 0 |
| |
| pwd=`${PWDCMD-pwd}` |
| kopt=$pwd/$T/keyword-options |
| kopt2=$pwd/$T/keyword2-options |
| emsg=$pwd/$T/emsgids.c |
| posr=$pwd/$T/po-sources |
| pottmp1=$pwd/$T/tmp1.pot |
| pottmp2=$pwd/$T/tmp2.pot |
| pottmp=$pwd/$T/tmp.pot |
| |
| # Locate files to scan, and generate the list. All .c, .h, and .def files |
| # in $srcdir are examined, likewise $srcdir/config and $srcdir/config/* |
| # (directories). Also, all subdirectories of $srcdir that contain a |
| # config-lang.in. Exclusions come from $srcdir/po/EXCLUDE. |
| # |
| # Then generate keyword options for xgettext, by scanning for declarations |
| # of functions whose parameter names end in "msgid". |
| # |
| # Finally, generate a source file containing all %e strings from |
| # driver specs, so those can be translated too. |
| # |
| # All in one huge awk script. |
| |
| echo "scanning for keywords and %e strings..." >&2 |
| |
| ( cd $srcdir |
| lang_subdirs=`echo */config-lang.in */*/config-lang.in | sed -e 's|config-lang\.in||g'` |
| { for dir in "" config/ config/*/ $lang_subdirs |
| do for glob in '*.c' '*.h' '*.def' |
| do eval echo $dir$glob |
| done |
| done; |
| } | tr ' ' "$nl" | grep -v '\*' | |
| $AWK -v excl=po/EXCLUDES -v posr=$posr -v kopt=$kopt -v kopt2=$kopt2 -v emsg=$emsg ' |
| function keyword_option(line) { |
| paren_index = index(line, "(") |
| name = substr(line, 1, paren_index - 1) |
| sub(/[^0-9A-Z_a-z]*$/, "", name) |
| sub(/[ ]+PARAMS/, "", name) |
| sub(/[ ]+VPARAMS/, "", name) |
| sub(/.*[^0-9A-Z_a-z]/, "", name) |
| |
| args = substr(line, paren_index) |
| sub(/msgid[,\)].*/, "", args) |
| for (n = 1; sub(/^[^,]*,/, "", args); n++) { |
| continue |
| } |
| format="" |
| if (args ~ /g$/) |
| format="gcc-internal-format" |
| else if (args ~ /noc$/) |
| format="no-c-format" |
| else if (args ~ /c$/) |
| format="c-format" |
| |
| if (n == 1) { keyword = "--keyword=" name } |
| else { keyword = "--keyword=" name ":" n } |
| if (format) { |
| keyword=keyword "\n--flag=" name ":" n ":" format |
| } |
| |
| if (! keyword_seen[name]) { |
| if (format == "gcc-internal-format") |
| print keyword > kopt2 |
| else |
| print keyword > kopt |
| keyword_seen[name] = keyword |
| } else if (keyword_seen[name] != keyword) { |
| printf("%s used incompatibly as both %s and %s\n", |
| name, keyword_seen[name], keyword) |
| exit (1) |
| } |
| } |
| |
| function spec_error_string (line) { |
| while ((percent_index = index(line, "%e")) != 0) { |
| escape = substr(line, percent_index - 1, 1) |
| line = substr(line, percent_index + 2) |
| if (escape == "%") continue |
| |
| bracket_index = index(line, "}") |
| quote_index = index(line, "\"") |
| if (bracket_index == 0) return |
| if (quote_index != 0 && bracket_index > quote_index) return |
| |
| msgid = substr(line, 1, bracket_index - 1) |
| line = substr(line, bracket_index + 1) |
| |
| if (index(msgid, "%") != 0) continue |
| |
| printf("#line %d \"%s\"\n", lineno, file) > emsg |
| printf("_(\"%s\")\n", msgid) > emsg |
| |
| } |
| } |
| |
| BEGIN { |
| while ((getline < excl) > 0) { |
| if ($0 ~ /^#/ || $0 ~ /^[ ]*$/) |
| continue |
| excludes[$1] = 1 |
| } |
| } |
| |
| { if (!($0 in excludes)) { |
| print > posr |
| files[NR] = $0 |
| } |
| } |
| |
| END { |
| for (f in files) { |
| file = files[f] |
| lineno = 1 |
| while (getline < file) { |
| if (/^(#[ ]*define[ ]*)?[A-Za-z_].*\(.*msgid[,\)]/) { |
| keyword_option($0) |
| } else if (/%e/) { |
| spec_error_string($0) |
| } |
| lineno++ |
| } |
| } |
| print emsg > posr |
| }' |
| ) || exit |
| |
| echo "scanning option files..." >&2 |
| |
| ( cd $srcdir; find . -name '*.opt' -print | |
| $AWK '{ |
| file = $1 |
| lineno = 1 |
| field = 0 |
| while (getline < file) { |
| if (/^[ \t]*(;|$)/ || !/^[^ \t]/) { |
| field = 0 |
| } else { |
| if (field == 2) { |
| line = $0 |
| gsub(".*\t", "", line) |
| printf("#line %d \"%s\"\n", lineno, file) |
| printf("_(\"%s\")\n", line) |
| } |
| field++; |
| } |
| lineno++; |
| } |
| }') >> $emsg |
| |
| # Run the xgettext command, with temporary added as a file to scan. |
| echo "running xgettext..." >&2 |
| $xgettext --default-domain=$package --directory=$srcdir \ |
| --add-comments `cat $kopt` --files-from=$posr \ |
| --copyright-holder="Free Software Foundation, Inc." \ |
| --msgid-bugs-address="http://gcc.gnu.org/bugs.html" \ |
| --language=c -o $pottmp1 |
| $xgettext --default-domain=$package --directory=$srcdir \ |
| --add-comments --keyword= `cat $kopt2` --files-from=$posr \ |
| --copyright-holder="Free Software Foundation, Inc." \ |
| --msgid-bugs-address="http://gcc.gnu.org/bugs.html" \ |
| --language=GCC-source -o $pottmp2 |
| $xgettext --default-domain=$package \ |
| --add-comments $pottmp1 $pottmp2 \ |
| --copyright-holder="Free Software Foundation, Inc." \ |
| --msgid-bugs-address="http://gcc.gnu.org/bugs.html" \ |
| --language=PO -o $pottmp |
| # Remove local paths from .pot file. |
| sed "s:$srcdir/::g;s:$pwd/::g;" <$pottmp >po/$package.pot |