| author | wenzelm | 
| Wed, 21 Dec 2022 13:22:57 +0100 | |
| changeset 76727 | 6d95e8a636e2 | 
| parent 76548 | 0af64cc2eee9 | 
| permissions | -rw-r--r-- | 
| 76348 | 1  | 
/* Title: Pure/Admin/build_zstd.scala  | 
2  | 
Author: Makarius  | 
|
3  | 
||
4  | 
Build Isabelle zstd-jni component from official download.  | 
|
5  | 
*/  | 
|
6  | 
||
7  | 
package isabelle  | 
|
8  | 
||
9  | 
||
10  | 
object Build_Zstd {
 | 
|
11  | 
/* platforms */  | 
|
12  | 
||
| 76457 | 13  | 
  sealed case class Platform_Info(name: String, template: String, exe: Boolean = false) {
 | 
| 76348 | 14  | 
    def install(jar_dir: Path, component_dir: Path, version: String): Unit = {
 | 
15  | 
      val source = jar_dir + Path.explode(template.replace("{V}", version))
 | 
|
16  | 
val target = Isabelle_System.make_directory(component_dir + Path.basic(name))  | 
|
17  | 
Isabelle_System.copy_file(source, target)  | 
|
18  | 
if (exe) File.set_executable(target + source.base, true)  | 
|
19  | 
}  | 
|
20  | 
}  | 
|
21  | 
||
22  | 
private val platforms =  | 
|
23  | 
List(  | 
|
| 76457 | 24  | 
      Platform_Info("arm64-darwin", "darwin/aarch64/libzstd-jni-{V}.dylib"),
 | 
25  | 
      Platform_Info("x86_64-darwin", "darwin/x86_64/libzstd-jni-{V}.dylib"),
 | 
|
26  | 
      Platform_Info("arm64-linux", "linux/aarch64/libzstd-jni-{V}.so"),
 | 
|
27  | 
      Platform_Info("x86_64-linux", "linux/amd64/libzstd-jni-{V}.so"),
 | 
|
28  | 
      Platform_Info("x86_64-windows", "win/amd64/libzstd-jni-{V}.dll", exe = true))
 | 
|
| 76348 | 29  | 
|
30  | 
||
31  | 
/* build zstd */  | 
|
32  | 
||
33  | 
val license_url = "https://raw.githubusercontent.com/luben/zstd-jni/master/LICENSE"  | 
|
34  | 
val default_download_url = "https://repo1.maven.org/maven2/com/github/luben/zstd-jni"  | 
|
35  | 
val default_version = "1.5.2-5"  | 
|
36  | 
||
37  | 
def build_zstd(  | 
|
38  | 
target_dir: Path = Path.current,  | 
|
39  | 
download_url: String = default_download_url,  | 
|
40  | 
version: String = default_version,  | 
|
41  | 
progress: Progress = new Progress,  | 
|
42  | 
  ): Unit = {
 | 
|
43  | 
/* component */  | 
|
44  | 
||
45  | 
val component_name = "zstd-jni-" + version  | 
|
| 76518 | 46  | 
val component_dir =  | 
| 76547 | 47  | 
Components.Directory(target_dir + Path.basic(component_name)).create(progress = progress)  | 
| 76348 | 48  | 
|
| 76518 | 49  | 
File.write(component_dir.README,  | 
| 76348 | 50  | 
"This is " + component_name + " from\n" + download_url +  | 
51  | 
"\n\n Makarius\n " + Date.Format.date(Date.now()) + "\n")  | 
|
52  | 
||
| 76518 | 53  | 
Isabelle_System.download_file(license_url, component_dir.LICENSE, progress = progress)  | 
| 76348 | 54  | 
|
55  | 
||
56  | 
/* jar */  | 
|
57  | 
||
58  | 
val jar_name = component_name + ".jar"  | 
|
| 76518 | 59  | 
val jar = component_dir.path + Path.basic(jar_name)  | 
| 76348 | 60  | 
Isabelle_System.download_file(  | 
61  | 
download_url + "/" + version + "/" + jar_name, jar, progress = progress)  | 
|
62  | 
||
63  | 
    Isabelle_System.with_tmp_dir("build") { jar_dir =>
 | 
|
| 
76543
 
fef0195f8d8e
clarified signature: prefer Scala functions instead of shell scripts;
 
wenzelm 
parents: 
76518 
diff
changeset
 | 
64  | 
Isabelle_System.extract(jar, jar_dir)  | 
| 76518 | 65  | 
for (platform <- platforms) platform.install(jar_dir, component_dir.path, version)  | 
| 76348 | 66  | 
}  | 
67  | 
||
68  | 
||
69  | 
/* settings */  | 
|
70  | 
||
| 76548 | 71  | 
    component_dir.write_settings("""
 | 
| 76348 | 72  | 
ISABELLE_ZSTD_HOME="$COMPONENT"  | 
73  | 
||
74  | 
classpath "$ISABELLE_ZSTD_HOME/""" + jar_name + """"  | 
|
75  | 
""")  | 
|
76  | 
}  | 
|
77  | 
||
78  | 
||
79  | 
/* Isabelle tool wrapper */  | 
|
80  | 
||
81  | 
val isabelle_tool =  | 
|
82  | 
    Isabelle_Tool("build_zstd", "build Isabelle zstd-jni component from official download",
 | 
|
83  | 
Scala_Project.here,  | 
|
84  | 
      { args =>
 | 
|
85  | 
var target_dir = Path.current  | 
|
86  | 
var download_url = default_download_url  | 
|
87  | 
var version = default_version  | 
|
88  | 
||
89  | 
        val getopts = Getopts("""
 | 
|
90  | 
Usage: isabelle build_zstd [OPTIONS]  | 
|
91  | 
||
92  | 
Options are:  | 
|
93  | 
-D DIR target directory (default ".")  | 
|
94  | 
-U URL download URL (default: """ + quote(default_download_url) + """)  | 
|
95  | 
-V VERSION version (default: """ + quote(default_version) + """)  | 
|
96  | 
||
97  | 
Build zstd-jni component from the specified download base URL and VERSION,  | 
|
98  | 
see also https://github.com/luben/zstd-jni  | 
|
99  | 
""",  | 
|
100  | 
"D:" -> (arg => target_dir = Path.explode(arg)),  | 
|
101  | 
"U:" -> (arg => download_url = arg),  | 
|
102  | 
"V:" -> (arg => version = arg))  | 
|
103  | 
||
104  | 
val more_args = getopts(args)  | 
|
105  | 
if (more_args.nonEmpty) getopts.usage()  | 
|
106  | 
||
107  | 
val progress = new Console_Progress()  | 
|
108  | 
||
109  | 
build_zstd(target_dir = target_dir, download_url = download_url,  | 
|
110  | 
version = version, progress = progress)  | 
|
111  | 
})  | 
|
112  | 
}  |