src/Tools/Setup/isabelle/setup/Build_Scala.java
author wenzelm
Fri, 02 Jul 2021 14:08:45 +0200
changeset 73922 3556303bd385
parent 73921 1f31ed84c467
child 73930 17c09d1b3588
permissions -rw-r--r--
create jar in pure Java;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/Setup/isabelle/setup/Build_Scala.java
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
     3
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
     4
Build Isabelle/Scala modules.
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
     5
*/
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
     6
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
     7
package isabelle.setup;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
     8
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
     9
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    10
import java.io.BufferedOutputStream;
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    11
import java.io.File;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    12
import java.io.IOException;
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    13
import java.io.OutputStream;
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    14
import java.math.BigInteger;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    15
import java.nio.file.Files;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    16
import java.nio.file.Path;
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
    17
import java.nio.file.StandardCopyOption;
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    18
import java.security.MessageDigest;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    19
import java.security.NoSuchAlgorithmException;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    20
import java.util.Comparator;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    21
import java.util.HashMap;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    22
import java.util.LinkedList;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    23
import java.util.List;
73919
429c1ffb5a36 proper treatment of leading zero;
wenzelm
parents: 73918
diff changeset
    24
import java.util.Locale;
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    25
import java.util.Map;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    26
import java.util.Properties;
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    27
import java.util.jar.Attributes;
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    28
import java.util.jar.JarEntry;
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    29
import java.util.jar.JarOutputStream;
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    30
import java.util.jar.Manifest;
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    31
import java.util.stream.Stream;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    32
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    33
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    34
public class Build_Scala
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    35
{
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    36
    /** component directory context **/
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    37
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    38
    public static class Context
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    39
    {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    40
        private final Path component_dir;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    41
        private Properties props;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    42
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    43
        public Context(Path dir) throws IOException
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    44
        {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    45
            component_dir = dir;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    46
            props = new Properties();
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    47
            Path path = component_dir.resolve("etc/scala.props");
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    48
            if (Files.exists(path)) { props.load(Files.newBufferedReader(path)); }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    49
        }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    50
73917
b5d52a4d6fd9 tuned whitespace;
wenzelm
parents: 73916
diff changeset
    51
        @Override public String toString() { return component_dir.toString(); }
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    52
73917
b5d52a4d6fd9 tuned whitespace;
wenzelm
parents: 73916
diff changeset
    53
        public String component_name() { return component_dir.toFile().getName(); }
b5d52a4d6fd9 tuned whitespace;
wenzelm
parents: 73916
diff changeset
    54
        public String name() { return props.getProperty("name", component_name()); }
b5d52a4d6fd9 tuned whitespace;
wenzelm
parents: 73916
diff changeset
    55
        public String description() { return props.getProperty("description", name()); }
73915
wenzelm
parents: 73914
diff changeset
    56
73917
b5d52a4d6fd9 tuned whitespace;
wenzelm
parents: 73916
diff changeset
    57
        public String lib_name() { return props.getProperty("lib", "lib") + "/" + name(); }
b5d52a4d6fd9 tuned whitespace;
wenzelm
parents: 73916
diff changeset
    58
        public String jar_name() { return lib_name() + ".jar"; }
b5d52a4d6fd9 tuned whitespace;
wenzelm
parents: 73916
diff changeset
    59
        public String shasum_name() { return lib_name() + ".shasum"; }
73915
wenzelm
parents: 73914
diff changeset
    60
73917
b5d52a4d6fd9 tuned whitespace;
wenzelm
parents: 73916
diff changeset
    61
        public String main() { return props.getProperty("main", ""); }
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    62
73917
b5d52a4d6fd9 tuned whitespace;
wenzelm
parents: 73916
diff changeset
    63
        public String[] sources() { return props.getProperty("sources", "").split("\\s+"); }
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
    64
        public String[] resources() { return props.getProperty("resources", "").split("\\s+"); }
73917
b5d52a4d6fd9 tuned whitespace;
wenzelm
parents: 73916
diff changeset
    65
        public String[] services() { return props.getProperty("services", "").split("\\s+"); }
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    66
73917
b5d52a4d6fd9 tuned whitespace;
wenzelm
parents: 73916
diff changeset
    67
        public Path path(String file) { return component_dir.resolve(file); }
b5d52a4d6fd9 tuned whitespace;
wenzelm
parents: 73916
diff changeset
    68
        public boolean exists(String file) { return Files.exists(path(file)); }
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    69
73921
1f31ed84c467 tuned signature;
wenzelm
parents: 73920
diff changeset
    70
        public String item_name(String s)
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
    71
        {
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
    72
            int i = s.indexOf(':');
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
    73
            return i > 0 ? s.substring(0, i) : s;
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
    74
        }
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
    75
73921
1f31ed84c467 tuned signature;
wenzelm
parents: 73920
diff changeset
    76
        public String item_target(String s)
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
    77
        {
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
    78
            int i = s.indexOf(':');
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
    79
            return i > 0 ? s.substring(i + 1) : s;
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
    80
        }
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
    81
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    82
        public String shasum(String file)
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    83
            throws IOException, NoSuchAlgorithmException
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    84
        {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    85
            if (exists(file)) {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    86
                MessageDigest sha = MessageDigest.getInstance("SHA");
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    87
                sha.update(Files.readAllBytes(path(file)));
73919
429c1ffb5a36 proper treatment of leading zero;
wenzelm
parents: 73918
diff changeset
    88
                String digest = String.format(Locale.ROOT, "%040x", new BigInteger(1, sha.digest()));
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    89
                return digest + " *" + file + "\n";
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    90
            }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    91
            else { return ""; }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    92
        }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    93
    }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    94
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    95
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    96
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    97
    /** create jar **/
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    98
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    99
    public static void create_jar(Path dir, String main, Path jar)
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   100
        throws IOException
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   101
    {
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   102
        Files.deleteIfExists(jar);
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   103
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   104
        Manifest manifest = new Manifest();
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   105
        Attributes attributes = manifest.getMainAttributes();
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   106
        attributes.put(Attributes.Name.MANIFEST_VERSION, "1.0");
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   107
        attributes.put(new Attributes.Name("Created-By"),
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   108
            System.getProperty("java.version") + " (" + System.getProperty("java.vendor") + ")");
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   109
        if (!main.isEmpty()) { attributes.put(Attributes.Name.MAIN_CLASS, main); }
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   110
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   111
        try (JarOutputStream out =
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   112
            new JarOutputStream(new BufferedOutputStream(Files.newOutputStream(jar)), manifest))
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   113
        {
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   114
            for (Path path : Files.walk(dir).sorted().toArray(Path[]::new)) {
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   115
                boolean is_dir = Files.isDirectory(path);
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   116
                boolean is_file = Files.isRegularFile(path);
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   117
                if (is_dir || is_file) {
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   118
                    String name = Environment.slashes(dir.relativize(path).toString());
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   119
                    JarEntry entry = new JarEntry(is_dir ? name + "/" : name);
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   120
                    entry.setTime(path.toFile().lastModified());
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   121
                    out.putNextEntry(entry);
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   122
                    if (is_file) { out.write(Files.readAllBytes(path)); }
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   123
                    out.closeEntry();
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   124
                }
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   125
            }
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   126
        }
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   127
    }
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   128
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   129
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   130
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   131
    /** build scala **/
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   132
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   133
    public static void build_scala(Context context, boolean fresh)
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   134
        throws IOException, InterruptedException, NoSuchAlgorithmException
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   135
    {
73915
wenzelm
parents: 73914
diff changeset
   136
        String jar_name = context.jar_name();
wenzelm
parents: 73914
diff changeset
   137
        String shasum_name = context.shasum_name();
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   138
73916
c6631069357b tuned signature;
wenzelm
parents: 73915
diff changeset
   139
        String[] sources = context.sources();
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   140
        String[] resources = context.resources();
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   141
73916
c6631069357b tuned signature;
wenzelm
parents: 73915
diff changeset
   142
        if (sources.length == 0) {
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   143
            Files.deleteIfExists(context.path(jar_name));
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   144
            Files.deleteIfExists(context.path(shasum_name));
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   145
        }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   146
        else {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   147
            String shasum_old =
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   148
                context.exists(shasum_name) ? Files.readString(context.path(shasum_name)) : "";
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   149
            String shasum_sources;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   150
            {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   151
                StringBuilder _shasum = new StringBuilder();
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   152
                for (String s : resources) {
73921
1f31ed84c467 tuned signature;
wenzelm
parents: 73920
diff changeset
   153
                    _shasum.append(context.shasum(context.item_name(s)));
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   154
                }
73920
3b340b44451c clarified order;
wenzelm
parents: 73919
diff changeset
   155
                for (String s : sources) { _shasum.append(context.shasum(s)); }
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   156
                shasum_sources = _shasum.toString();
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   157
            }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   158
            if (fresh || !shasum_old.equals(context.shasum(jar_name) + shasum_sources)) {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   159
                System.out.println("### Building " + context.description() + " ...");
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   160
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   161
                String java_home = Environment.getenv("JAVA_HOME");
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   162
                String scala_home = Environment.getenv("SCALA_HOME");
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   163
                String scalac_options = Environment.getenv("ISABELLE_SCALAC_OPTIONS");
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   164
                String isabelle_class_path = Environment.getenv("ISABELLE_CLASSPATH");
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   165
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   166
                if (java_home.isEmpty()) {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   167
                    throw new RuntimeException("Unknown JAVA_HOME -- Java unavailable");
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   168
                }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   169
                if (scala_home.isEmpty()) {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   170
                    throw new RuntimeException("Unknown SCALA_HOME -- Scala unavailable");
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   171
                }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   172
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   173
                Path build_dir = Files.createTempDirectory("isabelle");
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   174
                try {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   175
                    /* classpath */
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   176
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   177
                    List<String> classpath = new LinkedList<String>();
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   178
                    for (String s : isabelle_class_path.split(":", -1)) {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   179
                        classpath.add(Environment.platform_path(s));
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   180
                    }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   181
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   182
                    Map<String,String> env = new HashMap<String,String>(Environment.settings());
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   183
                    env.put("CLASSPATH", String.join(File.pathSeparator, classpath));
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   184
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   185
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   186
                    /* compile sources */
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   187
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   188
                    List<String> cmd = new LinkedList<String>();
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   189
                    Environment.Exec_Result res;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   190
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   191
                    cmd.add(Environment.platform_path(scala_home + "/bin/scalac"));
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   192
                    for (String s : scalac_options.split("\\s+")) { cmd.add(s); }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   193
                    cmd.add("-d");
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   194
                    cmd.add(build_dir.toString());
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   195
                    for (String s : sources) { cmd.add(context.path(s).toString()); }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   196
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   197
                    res = Environment.exec_process(cmd, build_dir.toFile(), env, false);
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   198
                    if (!res.ok()) throw new RuntimeException(res.err());
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   199
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   200
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   201
                    /* copy resources */
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   202
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   203
                    for (String s : context.resources()) {
73921
1f31ed84c467 tuned signature;
wenzelm
parents: 73920
diff changeset
   204
                        String name = context.item_name(s);
1f31ed84c467 tuned signature;
wenzelm
parents: 73920
diff changeset
   205
                        String target = context.item_target(s);
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   206
                        Path file_name = Path.of(name).normalize().getFileName();
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   207
                        Path target_path = Path.of(target).normalize();
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   208
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   209
                        Path target_dir;
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   210
                        Path target_file;
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   211
                        {
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   212
                            if (target.endsWith("/") || target.endsWith("/.")) {
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   213
                                target_dir = build_dir.resolve(target_path);
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   214
                                target_file = target_dir.resolve(file_name);
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   215
                            }
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   216
                            else {
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   217
                                target_file = build_dir.resolve(target_path);
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   218
                                target_dir = target_file.getParent();
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   219
                            }
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   220
                        }
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   221
                        Files.createDirectories(target_dir);
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   222
                        Files.copy(context.path(name), target_file,
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   223
                            StandardCopyOption.COPY_ATTRIBUTES);
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   224
                    }
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   225
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   226
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   227
                    /* packaging */
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   228
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   229
                    create_jar(build_dir, context.main(), context.path(jar_name));
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   230
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   231
                    String shasum = context.shasum(jar_name) + shasum_sources;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   232
                    Files.writeString(context.path(shasum_name), shasum);
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   233
                }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   234
                finally {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   235
                    try (Stream<Path> walk = Files.walk(build_dir)) {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   236
                        walk.sorted(Comparator.reverseOrder())
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   237
                            .map(Path::toFile)
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   238
                            .forEach(File::delete);
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   239
                    }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   240
                }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   241
            }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   242
        }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   243
    }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   244
}