langtools/src/share/classes/com/sun/tools/sjavac/Main.java
author ohrstrom
Fri, 08 Aug 2014 20:47:24 +0200
changeset 26087 93e7681752f6
parent 25299 b4a7dcd657f5
child 26088 f479ca655ba1
permissions -rw-r--r--
8054461: Add @file support to sjavac Summary: Add @file support to sjavac commandline. Reviewed-by: jjg, alundblad
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     1
/*
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
     2
 * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     4
 *
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    10
 *
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    15
 * accompanied this code).
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    16
 *
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    20
 *
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    23
 * questions.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    24
 */
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    25
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    26
package com.sun.tools.sjavac;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    27
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    28
import java.io.IOException;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    29
import java.io.PrintStream;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    30
import java.util.*;
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
    31
import java.nio.file.Path;
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
    32
import java.nio.file.Files;
16560
c6c7f0c26568 8010361: fix some langtools findbugs issues
jjg
parents: 16338
diff changeset
    33
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
    34
import com.sun.tools.sjavac.options.Options;
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
    35
import com.sun.tools.sjavac.options.SourceLocation;
25299
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
    36
import com.sun.tools.sjavac.server.JavacService;
16560
c6c7f0c26568 8010361: fix some langtools findbugs issues
jjg
parents: 16338
diff changeset
    37
import com.sun.tools.sjavac.server.JavacServer;
25299
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
    38
import com.sun.tools.sjavac.server.JavacServiceClient;
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    39
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    40
/**
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    41
 * The main class of the smart javac wrapper tool.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    42
 *
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    43
 * <p><b>This is NOT part of any supported API.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    44
 * If you write code that depends on this, you do so at your own
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    45
 * risk.  This code and its internal interfaces are subject to change
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    46
 * or deletion without notice.</b></p>
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    47
 */
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    48
public class Main {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    49
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    50
    /*  This is a smart javac wrapper primarily used when building the OpenJDK,
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    51
        though other projects are welcome to use it too. But please be aware
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    52
        that it is not an official api and will change in the future.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    53
        (We really mean it!)
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    54
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    55
        Goals:
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    56
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    57
        ** Create a state file, containing information about the build, so
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    58
           that incremental builds only rebuild what is necessary. Also the
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    59
           state file can be used by make/ant to detect when to trigger
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    60
           a call to the smart javac wrapper.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    61
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    62
           This file is called bin/javac_state (assuming that you specified "-d bin")
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    63
           Thus the simplest makefile is:
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    64
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    65
           SJAVAC=java -cp .../tools.jar com.sun.tools.sjavac.Main
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    66
           SRCS=$(shell find src -name "*.java")
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    67
           bin/javac_state : $(SRCS)
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    68
                  $(SJAVAC) src -d bin
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    69
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    70
           This makefile will run very fast and detect properly when Java code needs to
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    71
           be recompiled. The smart javac wrapper will then use the information in java_state
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    72
           to do an efficient incremental compile.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    73
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    74
           Previously it was near enough impossible to write an efficient makefile for Java
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    75
           with support for incremental builds and dependency tracking.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    76
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    77
        ** Separate java sources to be compiled from java
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    78
           sources used >only< for linking. The options:
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    79
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    80
           "dir" points to root dir with sources to be compiled
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    81
           "-sourcepath dir" points to root dir with sources used only for linking
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    82
           "-classpath dir" points to dir with classes used only for linking (as before)
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    83
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    84
        ** Use all cores for compilation by default.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    85
           "-j 4" limit the number of cores to 4.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    86
           For the moment, the sjavac server additionally limits the number of cores to three.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    87
           This will improve in the future when more sharing is performed between concurrent JavaCompilers.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    88
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    89
        ** Basic translation support from other sources to java, and then compilation of the generated java.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    90
           This functionality might be moved into annotation processors instead.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    91
           Again this is driven by the OpenJDK sources where properties and a few other types of files
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    92
           are converted into Java sources regularily. The javac_state embraces copy and tr, and perform
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    93
           incremental recompiles and copying for these as well. META-INF will be a special copy rule
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    94
           that will copy any files found below any META-INF dir in src to the bin/META-INF dir.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    95
           "-copy .gif"
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    96
           "-copy META-INF"
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    97
           "-tr .prop=com.sun.tools.javac.smart.CompileProperties
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    98
           "-tr .propp=com.sun.tools.javac.smart.CompileProperties,java.util.ListResourceBundle
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    99
           "-tr .proppp=com.sun.tools.javac.smart.CompileProperties,sun.util.resources.LocaleNamesBundle
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   100
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   101
        ** Control which classes in the src,sourcepath and classpath that javac is allowed to see.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   102
           Again, this is necessary to deal with the source code structure of the OpenJDK which is
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   103
           intricate (read messy).
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   104
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   105
           "-i tools.*" to include the tools package and all its subpackages in the build.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   106
           "-x tools.net.aviancarrier.*" to exclude the aviancarrier package and all its sources and subpackages.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   107
           "-x tools.net.drums" to exclude the drums package only, keep its subpackages.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   108
           "-xf tools/net/Bar.java" // Do not compile this file...
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   109
           "-xf *Bor.java" // Do not compile Bor.java wherever it is found, BUT do compile ABor.java!
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   110
           "-if tools/net/Bor.java" // Only compile this file...odd, but sometimes used.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   111
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   112
        ** The smart javac wrapper is driven by the modification time on the source files and compared
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   113
           to the modification times written into the javac_state file.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   114
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   115
           It does not compare the modification time of the source with the modification time of the artifact.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   116
           However it will detect if the modification time of an artifact has changed compared to the java_state,
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   117
           and this will trigger a delete of the artifact and a subsequent recompile of the source.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   118
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   119
           The smart javac wrapper is not a generic makefile/ant system. Its purpose is to compile java source
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   120
           as the final step before the output dir is finalized and immediately jared, or jmodded. The output
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   121
           dir should be considered opaque. Do not write into the outputdir yourself!
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   122
           Any artifacts found in the outputdir that javac_state does not know of, will be deleted!
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   123
           This can however be prevented, using the switch --permit-unidentified-artifacts
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   124
           This switch is necessary when build the OpenJDK because its makefiles still write directly to
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   125
           the output classes dirs.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   126
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   127
           Any makefile/ant rules that want to put contents into the outputdir should put the content
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   128
           in one of several source roots. Static content that is under version control, can be put in the same source
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   129
           code tree as the Java sources. Dynamic content that is generated by make/ant on the fly, should
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   130
           be put in a separate gensrc_stuff root. The smart javac wrapper call will then take the arguments:
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   131
           "gensrc_stuff src -d bin"
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   132
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   133
        The command line:
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   134
        java -cp tools.jar com.sun.tools.sjavac.Main \
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   135
             -i "com.bar.*" -x "com.bar.foo.*" \
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   136
             first_root \
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   137
             -i "com.bar.foo.*" \
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   138
             second_root \
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   139
             -x "org.net.*" \
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   140
             -sourcepath link_root_sources \
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   141
             -classpath link_root_classes \
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   142
             -d bin
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   143
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   144
        Will compile all sources for package com.bar and its subpackages, found below first_root,
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   145
        except the package com.bar.foo (and its subpackages), for which the sources are picked
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   146
        from second_root instead. It will link against classes in link_root_classes and against
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   147
        sources in link_root_sources, but will not see (try to link against) sources matching org.net.*
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   148
        but will link against org.net* classes (if they exist) in link_root_classes.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   149
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   150
        (If you want a set of complex filter rules to be applied to several source directories, without
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   151
         having to repeat the the filter rules for each root. You can use the explicit -src option. For example:
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   152
         sjavac -x "com.foo.*" -src root1:root2:root3  )
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   153
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   154
        The resulting classes are written into bin.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   155
    */
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   156
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   157
    private JavacState javac_state;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   158
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   159
    public static void main(String... args)  {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   160
        if (args.length > 0 && args[0].startsWith("--startserver:")) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   161
            if (args.length>1) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   162
                Log.error("When spawning a background server, only a single --startserver argument is allowed.");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   163
                return;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   164
            }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   165
            // Spawn a background server.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   166
            int rc = JavacServer.startServer(args[0], System.err);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   167
            System.exit(rc);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   168
        }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   169
        Main main = new Main();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   170
        int rc = main.go(args, System.out, System.err);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   171
        // Remove the portfile, but only if this background=false was used.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   172
        JavacServer.cleanup(args);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   173
        System.exit(rc);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   174
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   175
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   176
    private void printHelp() {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   177
        System.out.println("Usage: sjavac <options>\n"+
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   178
                           "where required options are:\n"+
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   179
                           "dir                        Compile all sources in dir recursively\n"+
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   180
                           "-d dir                     Store generated classes here and the javac_state file\n"+
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   181
                           "--server:portfile=/tmp/abc Use a background sjavac server\n\n"+
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   182
                           "All other arguments as javac, except -implicit:none which is forced by default.\n"+
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   183
                           "No java source files can be supplied on the command line, nor can an @file be supplied.\n\n"+
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   184
                           "Warning!\n"+
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   185
                           "This tool might disappear at any time, and its command line options might change at any time!");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   186
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   187
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   188
    public int go(String[] args, PrintStream out, PrintStream err) {
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   189
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   190
        Log.initializeLog(out, err);
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   191
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   192
        Options options;
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   193
        try {
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   194
            options = Options.parseArgs(args);
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   195
        } catch (IllegalArgumentException e) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   196
            Log.error(e.getMessage());
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   197
            return -1;
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   198
        }
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   199
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   200
        Log.setLogLevel(options.getLogLevel());
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   201
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   202
        if (!validateOptions(options))
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   203
            return -1;
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   204
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   205
        if (!createIfMissing(options.getDestDir()))
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   206
            return -1;
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   207
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   208
        Path gensrc = options.getGenSrcDir();
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   209
        if (gensrc != null && !createIfMissing(gensrc))
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   210
            return -1;
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   211
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   212
        Path hdrdir = options.getHeaderDir();
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   213
        if (hdrdir != null && !createIfMissing(hdrdir))
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   214
            return -1;
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   215
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   216
        // Load the prev build state database.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   217
        javac_state = JavacState.load(options, out, err);
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   218
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   219
        // Setup the suffix rules from the command line.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   220
        Map<String, Transformer> suffixRules = new HashMap<>();
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   221
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   222
        // Handling of .java-compilation
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   223
        suffixRules.putAll(javac_state.getJavaSuffixRule());
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   224
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   225
        // Handling of -copy and -tr
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   226
        suffixRules.putAll(options.getTranslationRules());
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   227
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   228
        // All found modules are put here.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   229
        Map<String,Module> modules = new HashMap<>();
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   230
        // We start out in the legacy empty no-name module.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   231
        // As soon as we stumble on a module-info.java file we change to that module.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   232
        Module current_module = new Module("", "");
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   233
        modules.put("", current_module);
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   234
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   235
        // Find all sources, use the suffix rules to know which files are sources.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   236
        Map<String,Source> sources = new HashMap<>();
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   237
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   238
        // Find the files, this will automatically populate the found modules
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   239
        // with found packages where the sources are found!
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   240
        findSourceFiles(options.getSources(),
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   241
                        suffixRules.keySet(),
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   242
                        sources,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   243
                        modules,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   244
                        current_module,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   245
                        options.isDefaultPackagePermitted(),
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   246
                        false);
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   247
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   248
        if (sources.isEmpty()) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   249
            Log.error("Found nothing to compile!");
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   250
            return -1;
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   251
        }
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   252
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   253
        // Create a map of all source files that are available for linking. Both -src and
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   254
        // -sourcepath point to such files. It is possible to specify multiple
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   255
        // -sourcepath options to enable different filtering rules. If the
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   256
        // filters are the same for multiple sourcepaths, they may be concatenated
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   257
        // using :(;). Before sending the list of sourcepaths to javac, they are
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   258
        // all concatenated. The list created here is used by the SmartFileWrapper to
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   259
        // make sure only the correct sources are actually available.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   260
        // We might find more modules here as well.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   261
        Map<String,Source> sources_to_link_to = new HashMap<>();
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   262
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   263
        List<SourceLocation> sourceResolutionLocations = new ArrayList<>();
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   264
        sourceResolutionLocations.addAll(options.getSources());
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   265
        sourceResolutionLocations.addAll(options.getSourceSearchPaths());
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   266
        findSourceFiles(sourceResolutionLocations,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   267
                        Collections.singleton(".java"),
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   268
                        sources_to_link_to,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   269
                        modules,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   270
                        current_module,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   271
                        options.isDefaultPackagePermitted(),
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   272
                        true);
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   273
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   274
        // Find all class files allowable for linking.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   275
        // And pickup knowledge of all modules found here.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   276
        // This cannot currently filter classes inside jar files.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   277
//      Map<String,Source> classes_to_link_to = new HashMap<String,Source>();
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   278
//      findFiles(args, "-classpath", Util.set(".class"), classes_to_link_to, modules, current_module, true);
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   279
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   280
        // Find all module sources allowable for linking.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   281
//      Map<String,Source> modules_to_link_to = new HashMap<String,Source>();
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   282
//      findFiles(args, "-modulepath", Util.set(".class"), modules_to_link_to, modules, current_module, true);
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   283
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   284
        // Add the set of sources to the build database.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   285
        javac_state.now().flattenPackagesSourcesAndArtifacts(modules);
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   286
        javac_state.now().checkInternalState("checking sources", false, sources);
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   287
        javac_state.now().checkInternalState("checking linked sources", true, sources_to_link_to);
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   288
        javac_state.setVisibleSources(sources_to_link_to);
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   289
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   290
        // If there is any change in the source files, taint packages
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   291
        // and mark the database in need of saving.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   292
        javac_state.checkSourceStatus(false);
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   293
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   294
        // Find all existing artifacts. Their timestamp will match the last modified timestamps stored
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   295
        // in javac_state, simply because loading of the JavacState will clean out all artifacts
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   296
        // that do not match the javac_state database.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   297
        javac_state.findAllArtifacts();
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   298
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   299
        // Remove unidentified artifacts from the bin, gensrc and header dirs.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   300
        // (Unless we allow them to be there.)
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   301
        // I.e. artifacts that are not known according to the build database (javac_state).
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   302
        // For examples, files that have been manually copied into these dirs.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   303
        // Artifacts with bad timestamps (ie the on disk timestamp does not match the timestamp
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   304
        // in javac_state) have already been removed when the javac_state was loaded.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   305
        if (!options.isUnidentifiedArtifactPermitted()) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   306
            javac_state.removeUnidentifiedArtifacts();
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   307
        }
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   308
        // Go through all sources and taint all packages that miss artifacts.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   309
        javac_state.taintPackagesThatMissArtifacts();
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   310
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   311
        // Now clean out all known artifacts belonging to tainted packages.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   312
        javac_state.deleteClassArtifactsInTaintedPackages();
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   313
        // Copy files, for example property files, images files, xml files etc etc.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   314
        javac_state.performCopying(Util.pathToFile(options.getDestDir()), suffixRules);
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   315
        // Translate files, for example compile properties or compile idls.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   316
        javac_state.performTranslation(Util.pathToFile(gensrc), suffixRules);
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   317
        // Add any potentially generated java sources to the tobe compiled list.
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   318
        // (Generated sources must always have a package.)
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   319
        Map<String,Source> generated_sources = new HashMap<>();
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   320
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   321
        try {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   322
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   323
            Source.scanRoot(Util.pathToFile(options.getGenSrcDir()), Util.set(".java"), null, null, null, null,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   324
                    generated_sources, modules, current_module, false, true, false);
20241
1e178dbe29c1 8024609: sjavac assertion fails during call to BuildState.collectArtifacts
ohrstrom
parents: 19500
diff changeset
   325
            javac_state.now().flattenPackagesSourcesAndArtifacts(modules);
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   326
            // Recheck the the source files and their timestamps again.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   327
            javac_state.checkSourceStatus(true);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   328
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   329
            // Now do a safety check that the list of source files is identical
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   330
            // to the list Make believes we are compiling. If we do not get this
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   331
            // right, then incremental builds will fail with subtility.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   332
            // If any difference is detected, then we will fail hard here.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   333
            // This is an important safety net.
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   334
            javac_state.compareWithMakefileList(Util.pathToFile(options.getSourceReferenceList()));
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   335
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   336
            // Do the compilations, repeatedly until no tainted packages exist.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   337
            boolean again;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   338
            // Collect the name of all compiled packages.
22163
3651128c74eb 8030244: Update langtools to use Diamond
briangoetz
parents: 22159
diff changeset
   339
            Set<String> recently_compiled = new HashSet<>();
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   340
            boolean[] rc = new boolean[1];
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   341
            do {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   342
                // Clean out artifacts in tainted packages.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   343
                javac_state.deleteClassArtifactsInTaintedPackages();
25299
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
   344
                // Create a JavacService to delegate the actual compilation to.
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
   345
                // Currently sjavac always connects to a server through a socket
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
   346
                // regardless if sjavac runs as a background service or not.
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
   347
                // This will most likely change in the future.
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
   348
                JavacService javacService = new JavacServiceClient(options.getServerConf());
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
   349
                again = javac_state.performJavaCompilations(javacService, options, recently_compiled, rc);
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   350
                if (!rc[0]) break;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   351
            } while (again);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   352
            // Only update the state if the compile went well.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   353
            if (rc[0]) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   354
                javac_state.save();
20241
1e178dbe29c1 8024609: sjavac assertion fails during call to BuildState.collectArtifacts
ohrstrom
parents: 19500
diff changeset
   355
                // Reflatten only the artifacts.
1e178dbe29c1 8024609: sjavac assertion fails during call to BuildState.collectArtifacts
ohrstrom
parents: 19500
diff changeset
   356
                javac_state.now().flattenArtifacts(modules);
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   357
                // Remove artifacts that were generated during the last compile, but not this one.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   358
                javac_state.removeSuperfluousArtifacts(recently_compiled);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   359
            }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   360
            return rc[0] ? 0 : -1;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   361
        } catch (ProblemException e) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   362
            Log.error(e.getMessage());
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   363
            return -1;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   364
        } catch (Exception e) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   365
            e.printStackTrace(err);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   366
            return -1;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   367
        }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   368
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   369
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   370
    private static boolean validateOptions(Options options) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   371
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   372
        String err = null;
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   373
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   374
        if (options.getDestDir() == null) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   375
            err = "Please specify output directory.";
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   376
        } else if (options.isJavaFilesAmongJavacArgs()) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   377
            err = "Sjavac does not handle explicit compilation of single .java files.";
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   378
        } else if (options.getServerConf() == null) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   379
            err = "No server configuration provided.";
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   380
        } else if (!options.getImplicitPolicy().equals("none")) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   381
            err = "The only allowed setting for sjavac is -implicit:none";
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   382
        } else if (options.getSources().isEmpty()) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   383
            err = "You have to specify -src.";
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   384
        } else if (options.getTranslationRules().size() > 1
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   385
                && options.getGenSrcDir() == null) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   386
            err = "You have translators but no gensrc dir (-s) specified!";
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   387
        }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   388
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   389
        if (err != null)
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   390
            Log.error(err);
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   391
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   392
        return err == null;
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   393
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   394
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   395
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   396
    private static boolean createIfMissing(Path dir) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   397
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   398
        if (Files.isDirectory(dir))
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   399
            return true;
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   400
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   401
        if (Files.exists(dir)) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   402
            Log.error(dir + " is not a directory.");
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   403
            return false;
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   404
        }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   405
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   406
        try {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   407
            Files.createDirectories(dir);
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   408
        } catch (IOException e) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   409
            Log.error("Could not create directory: " + e.getMessage());
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   410
            return false;
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   411
        }
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   412
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   413
        return true;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   414
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   415
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   416
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   417
    /** Find source files in the given source locations. */
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   418
    public static void findSourceFiles(List<SourceLocation> sourceLocations,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   419
                                       Set<String> sourceTypes,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   420
                                       Map<String,Source> foundFiles,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   421
                                       Map<String, Module> foundModules,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   422
                                       Module currentModule,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   423
                                       boolean permitSourcesInDefaultPackage,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   424
                                       boolean inLinksrc) {
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   425
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   426
        for (SourceLocation source : sourceLocations) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   427
            source.findSourceFiles(sourceTypes,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   428
                                   foundFiles,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   429
                                   foundModules,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   430
                                   currentModule,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   431
                                   permitSourcesInDefaultPackage,
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   432
                                   inLinksrc);
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   433
        }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   434
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   435
}