~vcs-imports/kupfer/master-new

« back to all changes in this revision

Viewing changes to waflib/Tools/intltool.py

  • Committer: Ulrik Sverdrup
  • Date: 2012-02-26 17:32:06 UTC
  • mto: This revision was merged to the branch mainline in revision 2918.
  • Revision ID: git-v1:684a1e79e28fa3d9e346bdf2c1659e7d2c6e7718
Add waf-light and waflib from waf-1.6.11

http://code.google.com/p/waf/
Acquired from: http://waf.googlecode.com/files/waf-1.6.11.tar.bz2

"""
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

3. The name of the author may not be used to endorse or promote products
   derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
"""

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
# encoding: utf-8
 
3
# Thomas Nagy, 2006-2010 (ita)
 
4
 
 
5
"""
 
6
Support for translation tools such as msgfmt and intltool
 
7
 
 
8
Usage::
 
9
 
 
10
        def configure(conf):
 
11
                conf.load('gnu_dirs intltool')
 
12
 
 
13
        def build(bld):
 
14
                # process the .po files into .gmo files, and install them in LOCALEDIR
 
15
                bld(features='intltool_po', appname='myapp', podir='po', install_path="${LOCALEDIR}")
 
16
 
 
17
                # process an input file, substituting the translations from the po dir
 
18
                bld(
 
19
                        features  = "intltool_in",
 
20
                        podir     = "../po",
 
21
                        flags     = ["-d", "-q", "-u", "-c"],
 
22
                        source    = 'kupfer.desktop.in',
 
23
                        install_path = "${DATADIR}/applications",
 
24
                )
 
25
 
 
26
Usage of the :py:mod:`waflib.Tools.gnu_dirs` is recommended, but not obligatory.
 
27
"""
 
28
 
 
29
import os, re
 
30
from waflib import Configure, TaskGen, Task, Utils, Runner, Options, Build, Logs
 
31
import waflib.Tools.ccroot
 
32
from waflib.TaskGen import feature, before_method
 
33
from waflib.Logs import error
 
34
 
 
35
@before_method('process_source')
 
36
@feature('intltool_in')
 
37
def apply_intltool_in_f(self):
 
38
        """
 
39
        Create tasks to translate files by intltool-merge::
 
40
 
 
41
                def build(bld):
 
42
                        bld(
 
43
                                features  = "intltool_in",
 
44
                                podir     = "../po",
 
45
                                flags     = ["-d", "-q", "-u", "-c"],
 
46
                                source    = 'kupfer.desktop.in',
 
47
                                install_path = "${DATADIR}/applications",
 
48
                        )
 
49
 
 
50
        :param podir: location of the .po files
 
51
        :type podir: string
 
52
        :param source: source files to process
 
53
        :type source: list of string
 
54
        :param flags: compilation flags ("-quc" by default)
 
55
        :type flags: list of string
 
56
        :param install_path: installation path
 
57
        :type install_path: string
 
58
        """
 
59
        try: self.meths.remove('process_source')
 
60
        except ValueError: pass
 
61
 
 
62
        if not self.env.LOCALEDIR:
 
63
                self.env.LOCALEDIR = self.env.PREFIX + '/share/locale'
 
64
 
 
65
        for i in self.to_list(self.source):
 
66
                node = self.path.find_resource(i)
 
67
 
 
68
                podir = getattr(self, 'podir', 'po')
 
69
                podirnode = self.path.find_dir(podir)
 
70
                if not podirnode:
 
71
                        error("could not find the podir %r" % podir)
 
72
                        continue
 
73
 
 
74
                cache = getattr(self, 'intlcache', '.intlcache')
 
75
                self.env['INTLCACHE'] = os.path.join(self.path.bldpath(), podir, cache)
 
76
                self.env['INTLPODIR'] = podirnode.bldpath()
 
77
                self.env['INTLFLAGS'] = getattr(self, 'flags', ['-q', '-u', '-c'])
 
78
 
 
79
                task = self.create_task('intltool', node, node.change_ext(''))
 
80
                inst = getattr(self, 'install_path', '${LOCALEDIR}')
 
81
                if inst:
 
82
                        self.bld.install_files(inst, task.outputs)
 
83
 
 
84
@feature('intltool_po')
 
85
def apply_intltool_po(self):
 
86
        """
 
87
        Create tasks to process po files::
 
88
 
 
89
                def build(bld):
 
90
                        bld(features='intltool_po', appname='myapp', podir='po', install_path="${LOCALEDIR}")
 
91
 
 
92
        The relevant task generator arguments are:
 
93
 
 
94
        :param podir: directory of the .po files
 
95
        :type podir: string
 
96
        :param appname: name of the application
 
97
        :type appname: string
 
98
        :param install_path: installation directory
 
99
        :type install_path: string
 
100
 
 
101
        The file LINGUAS must be present in the directory pointed by *podir* and list the translation files to process.
 
102
        """
 
103
        try: self.meths.remove('process_source')
 
104
        except ValueError: pass
 
105
 
 
106
        if not self.env.LOCALEDIR:
 
107
                self.env.LOCALEDIR = self.env.PREFIX + '/share/locale'
 
108
 
 
109
        appname = getattr(self, 'appname', 'set_your_app_name')
 
110
        podir = getattr(self, 'podir', '')
 
111
        inst = getattr(self, 'install_path', '${LOCALEDIR}')
 
112
 
 
113
        linguas = self.path.find_node(os.path.join(podir, 'LINGUAS'))
 
114
        if linguas:
 
115
                # scan LINGUAS file for locales to process
 
116
                file = open(linguas.abspath())
 
117
                langs = []
 
118
                for line in file.readlines():
 
119
                        # ignore lines containing comments
 
120
                        if not line.startswith('#'):
 
121
                                langs += line.split()
 
122
                file.close()
 
123
                re_linguas = re.compile('[-a-zA-Z_@.]+')
 
124
                for lang in langs:
 
125
                        # Make sure that we only process lines which contain locales
 
126
                        if re_linguas.match(lang):
 
127
                                node = self.path.find_resource(os.path.join(podir, re_linguas.match(lang).group() + '.po'))
 
128
                                task = self.create_task('po', node, node.change_ext('.mo'))
 
129
 
 
130
                                if inst:
 
131
                                        filename = task.outputs[0].name
 
132
                                        (langname, ext) = os.path.splitext(filename)
 
133
                                        inst_file = inst + os.sep + langname + os.sep + 'LC_MESSAGES' + os.sep + appname + '.mo'
 
134
                                        self.bld.install_as(inst_file, task.outputs[0], chmod=getattr(self, 'chmod', Utils.O644), env=task.env)
 
135
 
 
136
        else:
 
137
                Logs.pprint('RED', "Error no LINGUAS file found in po directory")
 
138
 
 
139
class po(Task.Task):
 
140
        """
 
141
        Compile .po files into .gmo files
 
142
        """
 
143
        run_str = '${MSGFMT} -o ${TGT} ${SRC}'
 
144
        color   = 'BLUE'
 
145
 
 
146
class intltool(Task.Task):
 
147
        """
 
148
        Let intltool-merge translate an input file
 
149
        """
 
150
        run_str = '${INTLTOOL} ${INTLFLAGS} ${INTLCACHE} ${INTLPODIR} ${SRC} ${TGT}'
 
151
        color   = 'BLUE'
 
152
 
 
153
def configure(conf):
 
154
        """
 
155
        Detect the program *msgfmt* and set *conf.env.MSGFMT*.
 
156
        Detect the program *intltool-merge* and set *conf.env.INTLTOOL*.
 
157
        It is possible to set INTLTOOL in the environment, but it must not have spaces in it::
 
158
 
 
159
                $ INTLTOOL="/path/to/the program/intltool" waf configure
 
160
 
 
161
        If a C/C++ compiler is present, execute a compilation test to find the header *locale.h*.
 
162
        """
 
163
        conf.find_program('msgfmt', var='MSGFMT')
 
164
        conf.find_perl_program('intltool-merge', var='INTLTOOL')
 
165
 
 
166
        prefix  = conf.env.PREFIX
 
167
        datadir = conf.env.DATADIR
 
168
        if not datadir:
 
169
                datadir = os.path.join(prefix,'share')
 
170
 
 
171
        conf.define('LOCALEDIR', os.path.join(datadir, 'locale').replace('\\', '\\\\'))
 
172
        conf.define('DATADIR', datadir.replace('\\', '\\\\'))
 
173
 
 
174
        if conf.env.CC or conf.env.CXX:
 
175
                conf.check(header_name='locale.h')
 
176