src/Tools/Setup/isabelle/setup/Build.java
author wenzelm
Thu, 15 Jul 2021 16:35:45 +0200
changeset 73987 fc363a3b690a
parent 73985 eb7112f467a8
child 74018 9d6c9a55f450
permissions -rw-r--r--
build.props for isabelle.jar, including isabelle.jedit; build minimal Isabelle/jEdit plugins on the spot; regular "jedit" component: discontinued special "jedit_build"; Isabelle/Scala services via jars, instead of settings;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
73944
3cee9d20308e clarified modules;
wenzelm
parents: 73931
diff changeset
     1
/*  Title:      Tools/Setup/isabelle/setup/Build.java
73914
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
73954
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
     4
Build Isabelle/Scala/Java modules.
73914
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;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    13
import java.math.BigInteger;
73946
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
    14
import java.nio.charset.StandardCharsets;
73914
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;
73930
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
    20
import java.util.ArrayList;
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    21
import java.util.Comparator;
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.Properties;
73967
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
    26
import java.util.TreeMap;
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;
73946
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
    29
import java.util.jar.JarFile;
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    30
import java.util.jar.JarOutputStream;
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    31
import java.util.jar.Manifest;
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    32
import java.util.stream.Stream;
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    33
73954
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
    34
import javax.tools.JavaCompiler;
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
    35
import javax.tools.JavaFileObject;
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
    36
import javax.tools.StandardJavaFileManager;
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
    37
import javax.tools.ToolProvider;
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
    38
73930
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
    39
import scala.tools.nsc.MainClass;
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
    40
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    41
73944
3cee9d20308e clarified modules;
wenzelm
parents: 73931
diff changeset
    42
public class Build
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    43
{
73951
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    44
    /** context **/
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    45
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    46
    public static String BUILD_PROPS = "build.props";
73961
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    47
    public static String COMPONENT_BUILD_PROPS = "etc/build.props";
73951
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    48
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    49
    public static Context directory_context(Path dir)
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    50
        throws IOException
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    51
    {
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    52
        Properties props = new Properties();
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    53
        props.load(Files.newBufferedReader(dir.resolve(BUILD_PROPS)));
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    54
        return new Context(dir, props);
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    55
    }
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    56
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    57
    public static Context component_context(Path dir)
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    58
        throws IOException
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    59
    {
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    60
        Properties props = new Properties();
73961
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    61
        Path build_props = dir.resolve(COMPONENT_BUILD_PROPS);
73951
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    62
        if (Files.exists(build_props)) { props.load(Files.newBufferedReader(build_props)); }
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    63
        return new Context(dir, props);
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    64
    }
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
    65
73961
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    66
    public static List<Context> component_contexts()
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    67
        throws IOException, InterruptedException
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    68
    {
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    69
        List<Context> result = new LinkedList<Context>();
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    70
        for (String p : Environment.getenv("ISABELLE_COMPONENTS").split(":", -1)) {
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    71
            if (!p.isEmpty()) {
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    72
                Path dir = Path.of(Environment.platform_path(p));
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    73
                if (Files.exists(dir.resolve(COMPONENT_BUILD_PROPS))) {
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    74
                    result.add(component_context(dir));
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    75
                }
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    76
            }
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    77
        }
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    78
        return List.copyOf(result);
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    79
    }
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
    80
73967
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
    81
    private static String sha_digest(MessageDigest sha, String name)
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
    82
    {
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
    83
        String digest = String.format(Locale.ROOT, "%040x", new BigInteger(1, sha.digest()));
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
    84
        return digest + " " + name + "\n";
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
    85
    }
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
    86
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    87
    public static class Context
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    88
    {
73951
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    89
        private final Path _dir;
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    90
        private final Properties _props;
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    91
73951
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    92
        public Context(Path dir, Properties props)
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    93
        {
73951
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    94
            _dir = dir;
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    95
            _props = props;
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    96
        }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    97
73951
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
    98
        @Override public String toString() { return _dir.toString(); }
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
    99
73951
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
   100
        public String name() { return _props.getProperty("name", _dir.toFile().getName()); }
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
   101
        public String description() { return _props.getProperty("description", name()); }
73915
wenzelm
parents: 73914
diff changeset
   102
73951
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
   103
        public String lib_name() { return _props.getProperty("lib", "lib") + "/" + name(); }
73917
b5d52a4d6fd9 tuned whitespace;
wenzelm
parents: 73916
diff changeset
   104
        public String jar_name() { return lib_name() + ".jar"; }
73915
wenzelm
parents: 73914
diff changeset
   105
73954
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   106
        public String scalac_options() { return _props.getProperty("scalac_options", ""); }
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   107
        public String javac_options() { return _props.getProperty("javac_options", ""); }
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   108
73951
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
   109
        public String main() { return _props.getProperty("main", ""); }
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   110
73931
4a708e150908 more robust treatment of empty string;
wenzelm
parents: 73930
diff changeset
   111
        private List<String> get_list(String name)
4a708e150908 more robust treatment of empty string;
wenzelm
parents: 73930
diff changeset
   112
        {
4a708e150908 more robust treatment of empty string;
wenzelm
parents: 73930
diff changeset
   113
            List<String> list = new LinkedList<String>();
73951
f209845d3a5d clarified signature;
wenzelm
parents: 73950
diff changeset
   114
            for (String s : _props.getProperty(name, "").split("\\s+")) {
73931
4a708e150908 more robust treatment of empty string;
wenzelm
parents: 73930
diff changeset
   115
                if (!s.isEmpty()) { list.add(s); }
4a708e150908 more robust treatment of empty string;
wenzelm
parents: 73930
diff changeset
   116
            }
4a708e150908 more robust treatment of empty string;
wenzelm
parents: 73930
diff changeset
   117
            return List.copyOf(list);
4a708e150908 more robust treatment of empty string;
wenzelm
parents: 73930
diff changeset
   118
        }
73948
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   119
        public List<String> requirements() { return get_list("requirements"); }
73931
4a708e150908 more robust treatment of empty string;
wenzelm
parents: 73930
diff changeset
   120
        public List<String> sources() { return get_list("sources"); }
4a708e150908 more robust treatment of empty string;
wenzelm
parents: 73930
diff changeset
   121
        public List<String> resources() { return get_list("resources"); }
4a708e150908 more robust treatment of empty string;
wenzelm
parents: 73930
diff changeset
   122
        public List<String> services() { return get_list("services"); }
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   123
73965
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   124
        public boolean is_vacuous()
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   125
        {
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   126
            return sources().isEmpty() && resources().isEmpty() && services().isEmpty();
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   127
        }
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   128
73957
110a027a5473 expand file paths, e.g. to allow $ISABELLE_HOME, $ISABELLE_HOME_USER;
wenzelm
parents: 73955
diff changeset
   129
        public Path path(String file)
110a027a5473 expand file paths, e.g. to allow $ISABELLE_HOME, $ISABELLE_HOME_USER;
wenzelm
parents: 73955
diff changeset
   130
            throws IOException, InterruptedException
110a027a5473 expand file paths, e.g. to allow $ISABELLE_HOME, $ISABELLE_HOME_USER;
wenzelm
parents: 73955
diff changeset
   131
        {
110a027a5473 expand file paths, e.g. to allow $ISABELLE_HOME, $ISABELLE_HOME_USER;
wenzelm
parents: 73955
diff changeset
   132
            return _dir.resolve(Environment.expand_platform_path(file));
110a027a5473 expand file paths, e.g. to allow $ISABELLE_HOME, $ISABELLE_HOME_USER;
wenzelm
parents: 73955
diff changeset
   133
        }
110a027a5473 expand file paths, e.g. to allow $ISABELLE_HOME, $ISABELLE_HOME_USER;
wenzelm
parents: 73955
diff changeset
   134
        public boolean exists(String file)
110a027a5473 expand file paths, e.g. to allow $ISABELLE_HOME, $ISABELLE_HOME_USER;
wenzelm
parents: 73955
diff changeset
   135
            throws IOException, InterruptedException
110a027a5473 expand file paths, e.g. to allow $ISABELLE_HOME, $ISABELLE_HOME_USER;
wenzelm
parents: 73955
diff changeset
   136
        {
110a027a5473 expand file paths, e.g. to allow $ISABELLE_HOME, $ISABELLE_HOME_USER;
wenzelm
parents: 73955
diff changeset
   137
            return Files.exists(path(file));
110a027a5473 expand file paths, e.g. to allow $ISABELLE_HOME, $ISABELLE_HOME_USER;
wenzelm
parents: 73955
diff changeset
   138
        }
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   139
73921
1f31ed84c467 tuned signature;
wenzelm
parents: 73920
diff changeset
   140
        public String item_name(String s)
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   141
        {
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   142
            int i = s.indexOf(':');
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   143
            return i > 0 ? s.substring(0, i) : s;
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   144
        }
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   145
73921
1f31ed84c467 tuned signature;
wenzelm
parents: 73920
diff changeset
   146
        public String item_target(String s)
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   147
        {
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   148
            int i = s.indexOf(':');
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   149
            return i > 0 ? s.substring(i + 1) : s;
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   150
        }
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   151
73948
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   152
        public String shasum(String name, List<Path> paths)
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   153
            throws IOException, NoSuchAlgorithmException
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   154
        {
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   155
            MessageDigest sha = MessageDigest.getInstance("SHA");
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   156
            for (Path file : paths) {
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   157
                if (Files.exists(file)) {
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   158
                    sha.update(Files.readAllBytes(file));
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   159
                }
73966
472bdccfba62 even more strict shasum (amending c9771e1b3223);
wenzelm
parents: 73965
diff changeset
   160
                else {
472bdccfba62 even more strict shasum (amending c9771e1b3223);
wenzelm
parents: 73965
diff changeset
   161
                    throw new RuntimeException(
472bdccfba62 even more strict shasum (amending c9771e1b3223);
wenzelm
parents: 73965
diff changeset
   162
                        "Missing input file " + Environment.quote(file.toString()));
472bdccfba62 even more strict shasum (amending c9771e1b3223);
wenzelm
parents: 73965
diff changeset
   163
                }
73948
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   164
            }
73967
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
   165
            return sha_digest(sha, name);
73948
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   166
        }
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   167
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   168
        public String shasum(String file)
73957
110a027a5473 expand file paths, e.g. to allow $ISABELLE_HOME, $ISABELLE_HOME_USER;
wenzelm
parents: 73955
diff changeset
   169
            throws IOException, NoSuchAlgorithmException, InterruptedException
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   170
        {
73966
472bdccfba62 even more strict shasum (amending c9771e1b3223);
wenzelm
parents: 73965
diff changeset
   171
            return shasum(file, List.of(path(file)));
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   172
        }
73967
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
   173
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
   174
        public String shasum_props()
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
   175
            throws NoSuchAlgorithmException
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
   176
        {
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
   177
            TreeMap<String,Object> sorted = new TreeMap<String,Object>();
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
   178
            for (Object x : _props.entrySet()) {
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
   179
                sorted.put(x.toString(), _props.get(x));
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
   180
            }
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
   181
            MessageDigest sha = MessageDigest.getInstance("SHA");
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
   182
            sha.update(sorted.toString().getBytes(StandardCharsets.UTF_8));
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
   183
            return sha_digest(sha, "<props>");
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
   184
        }
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   185
    }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   186
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   187
73930
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   188
    /** compile sources **/
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   189
73954
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   190
    private static void add_options(List<String> options_list, String options)
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   191
    {
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   192
        if (options != null) {
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   193
            for (String s : options.split("\\s+")) {
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   194
                if (!s.isEmpty()) { options_list.add(s); }
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   195
            }
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   196
        }
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   197
    }
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   198
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   199
    public static void compile_scala_sources(
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   200
        Path target_dir, String more_options, List<Path> deps, List<Path> sources)
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   201
        throws IOException, InterruptedException
73930
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   202
    {
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   203
        ArrayList<String> args = new ArrayList<String>();
73954
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   204
        add_options(args, Environment.getenv("ISABELLE_SCALAC_OPTIONS"));
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   205
        add_options(args, more_options);
73930
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   206
        args.add("-d");
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   207
        args.add(target_dir.toString());
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   208
        args.add("-bootclasspath");
73960
027f837d18ee clarified signature;
wenzelm
parents: 73957
diff changeset
   209
        args.add(Environment.join_platform_paths(deps));
73930
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   210
        args.add("--");
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   211
73955
2b9ae1aa9257 skip scalac for Java build;
wenzelm
parents: 73954
diff changeset
   212
        boolean scala_sources = false;
2b9ae1aa9257 skip scalac for Java build;
wenzelm
parents: 73954
diff changeset
   213
        for (Path p : sources) {
2b9ae1aa9257 skip scalac for Java build;
wenzelm
parents: 73954
diff changeset
   214
            args.add(p.toString());
2b9ae1aa9257 skip scalac for Java build;
wenzelm
parents: 73954
diff changeset
   215
            if (p.toString().endsWith(".scala")) { scala_sources = true; }
2b9ae1aa9257 skip scalac for Java build;
wenzelm
parents: 73954
diff changeset
   216
        }
2b9ae1aa9257 skip scalac for Java build;
wenzelm
parents: 73954
diff changeset
   217
        if (scala_sources) {
2b9ae1aa9257 skip scalac for Java build;
wenzelm
parents: 73954
diff changeset
   218
            MainClass main = new MainClass();
2b9ae1aa9257 skip scalac for Java build;
wenzelm
parents: 73954
diff changeset
   219
            boolean ok = main.process(args.toArray(String[]::new));
2b9ae1aa9257 skip scalac for Java build;
wenzelm
parents: 73954
diff changeset
   220
            if (!ok) throw new RuntimeException("Failed to compile Scala sources");
2b9ae1aa9257 skip scalac for Java build;
wenzelm
parents: 73954
diff changeset
   221
        }
73954
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   222
    }
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   223
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   224
    public static void compile_java_sources(
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   225
        Path target_dir, String more_options, List<Path> deps, List<Path> sources)
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   226
        throws IOException, InterruptedException
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   227
    {
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   228
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   229
        StandardJavaFileManager file_manager =
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   230
            compiler.getStandardFileManager(null, Locale.ROOT, StandardCharsets.UTF_8);
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   231
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   232
        List<String> options = new LinkedList<String>();
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   233
        add_options(options, Environment.getenv("ISABELLE_JAVAC_OPTIONS"));
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   234
        add_options(options, more_options);
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   235
        options.add("-d");
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   236
        options.add(target_dir.toString());
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   237
        options.add("-classpath");
73960
027f837d18ee clarified signature;
wenzelm
parents: 73957
diff changeset
   238
        options.add(Environment.join_platform_paths(deps));
73954
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   239
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   240
        List<JavaFileObject> java_sources = new LinkedList<JavaFileObject>();
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   241
        for (Path p : sources) {
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   242
            if (p.toString().endsWith(".java")) {
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   243
                for (JavaFileObject o : file_manager.getJavaFileObjectsFromPaths(List.of(p))) {
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   244
                    java_sources.add(o);
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   245
                }
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   246
            }
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   247
        }
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   248
        if (!java_sources.isEmpty()) {
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   249
            boolean ok = compiler.getTask(null, file_manager, null, options, null, java_sources).call();
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   250
            if (!ok) throw new RuntimeException("Failed to compile Java sources");
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   251
        }
73930
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   252
    }
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   253
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   254
73946
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   255
    /** shasum for jar content **/
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   256
73965
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   257
    private static String SHASUM = "META-INF/isabelle/shasum";
73946
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   258
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   259
    public static String get_shasum(Path jar_path)
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   260
        throws IOException
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   261
    {
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   262
        if (Files.exists(jar_path)) {
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   263
            try (JarFile jar_file = new JarFile(jar_path.toFile()))
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   264
            {
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   265
                JarEntry entry = jar_file.getJarEntry(SHASUM);
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   266
                if (entry != null) {
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   267
                    byte[] bytes = jar_file.getInputStream(entry).readAllBytes();
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   268
                    return new String(bytes, StandardCharsets.UTF_8);
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   269
                }
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   270
                else { return ""; }
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   271
            }
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   272
        }
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   273
        else { return ""; }
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   274
    }
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   275
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   276
    public static void create_shasum(Path dir, String shasum)
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   277
        throws IOException
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   278
    {
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   279
        Path path = dir.resolve(SHASUM);
73948
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   280
        Files.createDirectories(path.getParent());
73946
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   281
        Files.writeString(path, shasum);
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   282
    }
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   283
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   284
73965
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   285
    /** services **/
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   286
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   287
    private static String SERVICES = "META-INF/isabelle/services";
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   288
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   289
    public static List<String> get_services(Path jar_path)
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   290
        throws IOException
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   291
    {
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   292
        if (Files.exists(jar_path)) {
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   293
            try (JarFile jar_file = new JarFile(jar_path.toFile()))
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   294
            {
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   295
                JarEntry entry = jar_file.getJarEntry(SERVICES);
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   296
                if (entry != null) {
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   297
                    byte[] bytes = jar_file.getInputStream(entry).readAllBytes();
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   298
                    return Library.split_lines(new String(bytes, StandardCharsets.UTF_8));
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   299
                }
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   300
                else { return List.of(); }
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   301
            }
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   302
        }
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   303
        else { return List.of(); }
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   304
    }
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   305
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   306
    public static void create_services(Path dir, List<String> services)
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   307
        throws IOException
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   308
    {
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   309
        if (!services.isEmpty()) {
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   310
            Path path = dir.resolve(SERVICES);
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   311
            Files.createDirectories(path.getParent());
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   312
            Files.writeString(path, Library.cat_lines(services));
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   313
        }
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   314
    }
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   315
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   316
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   317
    /** create jar **/
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   318
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   319
    public static void create_jar(Path dir, String main, Path jar)
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   320
        throws IOException
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   321
    {
73949
714c267bb6fa more robust;
wenzelm
parents: 73948
diff changeset
   322
        Files.createDirectories(dir.resolve(jar).getParent());
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   323
        Files.deleteIfExists(jar);
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   324
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   325
        Manifest manifest = new Manifest();
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   326
        Attributes attributes = manifest.getMainAttributes();
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   327
        attributes.put(Attributes.Name.MANIFEST_VERSION, "1.0");
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   328
        attributes.put(new Attributes.Name("Created-By"),
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   329
            System.getProperty("java.version") + " (" + System.getProperty("java.vendor") + ")");
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   330
        if (!main.isEmpty()) { attributes.put(Attributes.Name.MAIN_CLASS, main); }
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   331
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   332
        try (JarOutputStream out =
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   333
            new JarOutputStream(new BufferedOutputStream(Files.newOutputStream(jar)), manifest))
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   334
        {
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   335
            for (Path path : Files.walk(dir).sorted().toArray(Path[]::new)) {
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   336
                boolean is_dir = Files.isDirectory(path);
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   337
                boolean is_file = Files.isRegularFile(path);
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   338
                if (is_dir || is_file) {
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   339
                    String name = Environment.slashes(dir.relativize(path).toString());
73950
cc49da3003aa more robust;
wenzelm
parents: 73949
diff changeset
   340
                    if (!name.isEmpty()) {
cc49da3003aa more robust;
wenzelm
parents: 73949
diff changeset
   341
                        JarEntry entry = new JarEntry(is_dir ? name + "/" : name);
cc49da3003aa more robust;
wenzelm
parents: 73949
diff changeset
   342
                        entry.setTime(path.toFile().lastModified());
cc49da3003aa more robust;
wenzelm
parents: 73949
diff changeset
   343
                        out.putNextEntry(entry);
cc49da3003aa more robust;
wenzelm
parents: 73949
diff changeset
   344
                        if (is_file) { out.write(Files.readAllBytes(path)); }
cc49da3003aa more robust;
wenzelm
parents: 73949
diff changeset
   345
                        out.closeEntry();
cc49da3003aa more robust;
wenzelm
parents: 73949
diff changeset
   346
                    }
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   347
                }
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   348
            }
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   349
        }
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   350
    }
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   351
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   352
73961
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   353
    /** classpath **/
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   354
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   355
    public static List<Path> classpath()
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   356
        throws IOException, InterruptedException
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   357
    {
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   358
        List<Path> result = new LinkedList<Path>();
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   359
        for (Context context : component_contexts()) {
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   360
            result.add(context.path(context.jar_name()));
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   361
        }
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   362
        return List.copyOf(result);
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   363
    }
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   364
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   365
    public static List<String> services()
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   366
        throws IOException, InterruptedException
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   367
    {
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   368
        List<String> result = new LinkedList<String>();
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   369
        for (Context context : component_contexts()) {
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   370
            for (String s : context.services()) {
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   371
                result.add(s);
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   372
            }
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   373
        }
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   374
        return List.copyOf(result);
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   375
    }
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   376
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   377
73954
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   378
    /** build **/
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   379
73954
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   380
    public static void build(Context context, boolean fresh)
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   381
        throws IOException, InterruptedException, NoSuchAlgorithmException
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   382
    {
73915
wenzelm
parents: 73914
diff changeset
   383
        String jar_name = context.jar_name();
73930
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   384
        Path jar_path = context.path(jar_name);
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   385
73948
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   386
        List<String> requirements = context.requirements();
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   387
        List<String> resources = context.resources();
73931
4a708e150908 more robust treatment of empty string;
wenzelm
parents: 73930
diff changeset
   388
        List<String> sources = context.sources();
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   389
73965
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   390
        if (context.is_vacuous()) { Files.deleteIfExists(jar_path); }
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   391
        else {
73946
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   392
            String shasum_old = get_shasum(jar_path);
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   393
            String shasum;
73948
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   394
            List<Path> compiler_deps = new LinkedList<Path>();
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   395
            {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   396
                StringBuilder _shasum = new StringBuilder();
73967
90652c0ef969 shasum for project meta-info;
wenzelm
parents: 73966
diff changeset
   397
                _shasum.append(context.shasum_props());
73948
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   398
                for (String s : requirements) {
73952
74ab1fb470a3 clarified syntax: similar to URL;
wenzelm
parents: 73951
diff changeset
   399
                    if (s.startsWith("env:")) {
73948
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   400
                        List<Path> paths = new LinkedList<Path>();
73952
74ab1fb470a3 clarified syntax: similar to URL;
wenzelm
parents: 73951
diff changeset
   401
                        for (String p : Environment.getenv(s.substring(4)).split(":", -1)) {
73948
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   402
                            if (!p.isEmpty()) {
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   403
                                Path path = Path.of(Environment.platform_path(p));
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   404
                                compiler_deps.add(path);
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   405
                                paths.add(path);
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   406
                            }
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   407
                        }
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   408
                        _shasum.append(context.shasum(s, paths));
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   409
                    }
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   410
                    else {
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   411
                        compiler_deps.add(context.path(s));
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   412
                        _shasum.append(context.shasum(s));
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   413
                    }
731ab64bae97 more compiler_deps via "requirements", notably jar list from settings;
wenzelm
parents: 73946
diff changeset
   414
                }
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   415
                for (String s : resources) {
73921
1f31ed84c467 tuned signature;
wenzelm
parents: 73920
diff changeset
   416
                    _shasum.append(context.shasum(context.item_name(s)));
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   417
                }
73920
3b340b44451c clarified order;
wenzelm
parents: 73919
diff changeset
   418
                for (String s : sources) { _shasum.append(context.shasum(s)); }
73946
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   419
                shasum = _shasum.toString();
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   420
            }
73946
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   421
            if (fresh || !shasum_old.equals(shasum)) {
73985
eb7112f467a8 more portable: avoid Windows CRLF in classpath output;
wenzelm
parents: 73967
diff changeset
   422
                System.out.print(
eb7112f467a8 more portable: avoid Windows CRLF in classpath output;
wenzelm
parents: 73967
diff changeset
   423
                    "### Building " + context.description() + " (" + jar_path + ") ...\n");
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   424
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   425
                String isabelle_class_path = Environment.getenv("ISABELLE_CLASSPATH");
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   426
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   427
                Path build_dir = Files.createTempDirectory("isabelle");
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   428
                try {
73930
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   429
                    /* compile sources */
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   430
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   431
                    for (String s : isabelle_class_path.split(":", -1)) {
73931
4a708e150908 more robust treatment of empty string;
wenzelm
parents: 73930
diff changeset
   432
                        if (!s.isEmpty()) {
4a708e150908 more robust treatment of empty string;
wenzelm
parents: 73930
diff changeset
   433
                          compiler_deps.add(Path.of(Environment.platform_path(s)));
4a708e150908 more robust treatment of empty string;
wenzelm
parents: 73930
diff changeset
   434
                        }
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   435
                    }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   436
73930
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   437
                    List<Path> compiler_sources = new LinkedList<Path>();
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   438
                    for (String s : sources) { compiler_sources.add(context.path(s)); }
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   439
73954
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   440
                    compile_scala_sources(
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   441
                        build_dir, context.scalac_options(), compiler_deps, compiler_sources);
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   442
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   443
                    compiler_deps.add(build_dir);
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   444
                    compile_java_sources(
a3a64aab815a support mixed Scala/Java build;
wenzelm
parents: 73952
diff changeset
   445
                        build_dir, context.javac_options(), compiler_deps, compiler_sources);
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   446
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   447
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   448
                    /* copy resources */
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   449
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   450
                    for (String s : context.resources()) {
73921
1f31ed84c467 tuned signature;
wenzelm
parents: 73920
diff changeset
   451
                        String name = context.item_name(s);
1f31ed84c467 tuned signature;
wenzelm
parents: 73920
diff changeset
   452
                        String target = context.item_target(s);
73918
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   453
                        Path file_name = Path.of(name).normalize().getFileName();
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   454
                        Path target_path = Path.of(target).normalize();
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   455
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   456
                        Path target_dir;
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   457
                        Path target_file;
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   458
                        {
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   459
                            if (target.endsWith("/") || target.endsWith("/.")) {
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   460
                                target_dir = build_dir.resolve(target_path);
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   461
                                target_file = target_dir.resolve(file_name);
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   462
                            }
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   463
                            else {
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   464
                                target_file = build_dir.resolve(target_path);
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   465
                                target_dir = target_file.getParent();
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   466
                            }
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   467
                        }
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   468
                        Files.createDirectories(target_dir);
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   469
                        Files.copy(context.path(name), target_file,
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   470
                            StandardCopyOption.COPY_ATTRIBUTES);
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   471
                    }
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   472
07781cae0f71 support for jar resources;
wenzelm
parents: 73917
diff changeset
   473
73922
3556303bd385 create jar in pure Java;
wenzelm
parents: 73921
diff changeset
   474
                    /* packaging */
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   475
73946
4d4c806cb7c8 clarified shasum: sources / resources within jar;
wenzelm
parents: 73944
diff changeset
   476
                    create_shasum(build_dir, shasum);
73965
f6862d5f4e7f clarified Isabelle meta-info within jar;
wenzelm
parents: 73964
diff changeset
   477
                    create_services(build_dir, context.services());
73930
17c09d1b3588 invoke Scala compiler from Java, without external process;
wenzelm
parents: 73922
diff changeset
   478
                    create_jar(build_dir, context.main(), jar_path);
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   479
                }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   480
                finally {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   481
                    try (Stream<Path> walk = Files.walk(build_dir)) {
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   482
                        walk.sorted(Comparator.reverseOrder())
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   483
                            .map(Path::toFile)
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   484
                            .forEach(File::delete);
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   485
                    }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   486
                }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   487
            }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   488
        }
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   489
    }
73961
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   490
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   491
    public static void build_components(boolean fresh)
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   492
        throws IOException, InterruptedException, NoSuchAlgorithmException
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   493
    {
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   494
        for (Context context : component_contexts()) {
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   495
            build(context, fresh);
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   496
        }
f090787bb4c4 operations for all components;
wenzelm
parents: 73960
diff changeset
   497
    }
73914
4be1047576e6 support for Isabelle/Scala in pure Java;
wenzelm
parents:
diff changeset
   498
}