~ubuntu-branches/ubuntu/utopic/scons/utopic-proposed

« back to all changes in this revision

Viewing changes to engine/SCons/Tool/javac.py

  • Committer: Bazaar Package Importer
  • Author(s): Mark Brown
  • Date: 2004-08-24 08:57:22 UTC
  • mfrom: (0.2.1 upstream) (1.1.1 warty)
  • Revision ID: james.westby@ubuntu.com-20040824085722-hfk4f0pjbyu0ebxv
Tags: 0.96.1-1
New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
"""SCons.Tool.javac
 
2
 
 
3
Tool-specific initialization for javac.
 
4
 
 
5
There normally shouldn't be any need to import this module directly.
 
6
It will usually be imported through the generic SCons.Tool.Tool()
 
7
selection method.
 
8
 
 
9
"""
 
10
 
 
11
#
 
12
# Copyright (c) 2001, 2002, 2003, 2004 The SCons Foundation
 
13
#
 
14
# Permission is hereby granted, free of charge, to any person obtaining
 
15
# a copy of this software and associated documentation files (the
 
16
# "Software"), to deal in the Software without restriction, including
 
17
# without limitation the rights to use, copy, modify, merge, publish,
 
18
# distribute, sublicense, and/or sell copies of the Software, and to
 
19
# permit persons to whom the Software is furnished to do so, subject to
 
20
# the following conditions:
 
21
#
 
22
# The above copyright notice and this permission notice shall be included
 
23
# in all copies or substantial portions of the Software.
 
24
#
 
25
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
 
26
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
 
27
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 
28
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 
29
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 
30
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 
31
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
32
#
 
33
 
 
34
__revision__ = "/home/scons/scons/branch.0/baseline/src/engine/SCons/Tool/javac.py 0.96.1.D001 2004/08/23 09:55:29 knight"
 
35
 
 
36
import os
 
37
import os.path
 
38
import string
 
39
 
 
40
import SCons.Builder
 
41
from SCons.Node.FS import _my_normcase
 
42
from SCons.Tool.JavaCommon import parse_java_file
 
43
import SCons.Util
 
44
 
 
45
def classname(path):
 
46
    """Turn a string (path name) into a Java class name."""
 
47
    return string.replace(os.path.normpath(path), os.sep, '.')
 
48
 
 
49
def emit_java_classes(target, source, env):
 
50
    """Create and return lists of source java files
 
51
    and their corresponding target class files.
 
52
    """
 
53
    java_suffix = env.get('JAVASUFFIX', '.java')
 
54
    class_suffix = env.get('JAVACLASSSUFFIX', '.class')
 
55
 
 
56
    slist = []
 
57
    js = _my_normcase(java_suffix)
 
58
    for sdir in source:
 
59
        def visit(arg, dirname, names, js=js, dirnode=sdir.rdir()):
 
60
            java_files = filter(lambda n, js=js:
 
61
                                _my_normcase(n[-len(js):]) == js,
 
62
                                names)
 
63
            mydir = dirnode.Dir(dirname)
 
64
            java_paths = map(lambda f, d=mydir: d.File(f), java_files)
 
65
            arg.extend(java_paths)
 
66
        os.path.walk(sdir.rdir().get_abspath(), visit, slist)
 
67
 
 
68
    tlist = []
 
69
    for f in slist:
 
70
        pkg_dir, classes = parse_java_file(f.get_abspath())
 
71
        if pkg_dir:
 
72
            for c in classes:
 
73
                t = target[0].Dir(pkg_dir).File(c+class_suffix)
 
74
                t.attributes.java_classdir = target[0]
 
75
                t.attributes.java_classname = classname(pkg_dir + os.sep + c)
 
76
                tlist.append(t)
 
77
        elif classes:
 
78
            for c in classes:
 
79
                t = target[0].File(c+class_suffix)
 
80
                t.attributes.java_classdir = target[0]
 
81
                t.attributes.java_classname = classname(c)
 
82
                tlist.append(t)
 
83
        else:
 
84
            # This is an odd end case:  no package and no classes.
 
85
            # Just do our best based on the source file name.
 
86
            base = str(f)[:-len(java_suffix)]
 
87
            t = target[0].File(base + class_suffix)
 
88
            t.attributes.java_classdir = target[0]
 
89
            t.attributes.java_classname = classname(base)
 
90
            tlist.append(t)
 
91
 
 
92
    return tlist, slist
 
93
 
 
94
JavaBuilder = SCons.Builder.Builder(action = '$JAVACCOM',
 
95
                    emitter = emit_java_classes,
 
96
                    target_factory = SCons.Node.FS.default_fs.Dir,
 
97
                    source_factory = SCons.Node.FS.default_fs.Dir)
 
98
 
 
99
def generate(env):
 
100
    """Add Builders and construction variables for javac to an Environment."""
 
101
    env['BUILDERS']['Java'] = JavaBuilder
 
102
 
 
103
    env['JAVAC']            = 'javac'
 
104
    env['JAVACFLAGS']       = SCons.Util.CLVar('')
 
105
    env['JAVACCOM']         = '$JAVAC $JAVACFLAGS -d ${TARGET.attributes.java_classdir} -sourcepath ${SOURCE.dir.rdir()} $SOURCES'
 
106
    env['JAVACLASSSUFFIX']  = '.class'
 
107
    env['JAVASUFFIX']       = '.java'
 
108
 
 
109
def exists(env):
 
110
    return env.Detect('javac')