| author | immler | 
| Thu, 27 Dec 2018 21:00:50 +0100 | |
| changeset 69510 | 0f31dd2e540d | 
| parent 69425 | 94f6ca69d983 | 
| child 69789 | 2c3e5e58d93f | 
| permissions | -rw-r--r-- | 
| 65071 | 1  | 
/* Title: Pure/Admin/build_cygwin.scala  | 
2  | 
Author: Makarius  | 
|
3  | 
||
4  | 
Produce pre-canned Cygwin distribution for Isabelle.  | 
|
5  | 
*/  | 
|
6  | 
||
7  | 
package isabelle  | 
|
8  | 
||
9  | 
||
10  | 
object Build_Cygwin  | 
|
11  | 
{
 | 
|
| 
68374
 
8740e1241555
updated to current Cygwin, after 2.10.0-1 from 02-Feb-2018;
 
wenzelm 
parents: 
66727 
diff
changeset
 | 
12  | 
val default_mirror: String = "https://isabelle.sketis.net/cygwin_2018"  | 
| 65071 | 13  | 
|
14  | 
val packages: List[String] =  | 
|
15  | 
    List("curl", "nano", "perl", "perl-libwww-perl", "rlwrap", "unzip")
 | 
|
16  | 
||
17  | 
def build_cygwin(progress: Progress,  | 
|
18  | 
mirror: String = default_mirror,  | 
|
19  | 
more_packages: List[String] = Nil)  | 
|
20  | 
  {
 | 
|
21  | 
require(Platform.is_windows)  | 
|
22  | 
||
23  | 
    Isabelle_System.with_tmp_dir("cygwin")(tmp_dir =>
 | 
|
24  | 
      {
 | 
|
25  | 
        val cygwin = tmp_dir + Path.explode("cygwin")
 | 
|
26  | 
        val cygwin_etc = cygwin + Path.explode("etc")
 | 
|
27  | 
        val cygwin_isabelle = cygwin + Path.explode("isabelle")
 | 
|
28  | 
Isabelle_System.mkdirs(cygwin_isabelle)  | 
|
29  | 
||
| 66727 | 30  | 
val cygwin_exe_name = mirror + "/setup-x86_64.exe"  | 
| 65071 | 31  | 
        val cygwin_exe = cygwin_isabelle + Path.explode("cygwin.exe")
 | 
32  | 
Bytes.write(cygwin_exe,  | 
|
33  | 
          try { Bytes.read(Url(cygwin_exe_name)) }
 | 
|
34  | 
          catch { case ERROR(_) => error("Failed to download " + quote(cygwin_exe_name)) })
 | 
|
35  | 
||
| 
68374
 
8740e1241555
updated to current Cygwin, after 2.10.0-1 from 02-Feb-2018;
 
wenzelm 
parents: 
66727 
diff
changeset
 | 
36  | 
        File.write(cygwin_isabelle + Path.explode("cygwin_mirror"), mirror)
 | 
| 
 
8740e1241555
updated to current Cygwin, after 2.10.0-1 from 02-Feb-2018;
 
wenzelm 
parents: 
66727 
diff
changeset
 | 
37  | 
|
| 
69405
 
22428643351f
more direct File.executable operation: avoid external process (on Unix);
 
wenzelm 
parents: 
69277 
diff
changeset
 | 
38  | 
File.executable(cygwin_exe)  | 
| 
 
22428643351f
more direct File.executable operation: avoid external process (on Unix);
 
wenzelm 
parents: 
69277 
diff
changeset
 | 
39  | 
Isabelle_System.bash(File.bash_path(cygwin_exe) + " -h </dev/null >/dev/null").check  | 
| 65071 | 40  | 
|
41  | 
val res =  | 
|
42  | 
progress.bash(  | 
|
43  | 
File.bash_path(cygwin_exe) + " --site " + Bash.string(mirror) + " --no-verify" +  | 
|
44  | 
" --local-package-dir 'C:\\temp'" +  | 
|
45  | 
" --root " + Bash.string(File.platform_path(cygwin)) +  | 
|
46  | 
              " --packages " + quote((packages ::: more_packages).mkString(",")) +
 | 
|
47  | 
" --no-shortcuts --no-startmenu --no-desktop --quiet-mode",  | 
|
48  | 
echo = true)  | 
|
49  | 
        if (!res.ok || !cygwin_etc.is_dir) error("Failed")
 | 
|
50  | 
||
51  | 
        for (name <- List("hosts", "protocols", "services", "networks", "passwd", "group"))
 | 
|
52  | 
(cygwin_etc + Path.explode(name)).file.delete  | 
|
53  | 
||
54  | 
        (cygwin + Path.explode("Cygwin.bat")).file.delete
 | 
|
55  | 
||
56  | 
        val archive = "cygwin-" + Date.Format("uuuuMMdd")(Date.now()) + ".tar.gz"
 | 
|
| 69425 | 57  | 
        Isabelle_System.gnutar("-czf " + Bash.string(archive) + " cygwin", dir = tmp_dir).check
 | 
| 65071 | 58  | 
})  | 
59  | 
}  | 
|
60  | 
||
61  | 
||
62  | 
/* Isabelle tool wrapper */  | 
|
63  | 
||
64  | 
val isabelle_tool =  | 
|
65  | 
    Isabelle_Tool("build_cygwin", "produce pre-canned Cygwin distribution for Isabelle", args =>
 | 
|
66  | 
    {
 | 
|
67  | 
var mirror = default_mirror  | 
|
68  | 
var more_packages: List[String] = Nil  | 
|
69  | 
||
70  | 
val getopts =  | 
|
71  | 
        Getopts("""
 | 
|
72  | 
Usage: isabelle build_cygwin [OPTIONS]  | 
|
73  | 
||
74  | 
Options are:  | 
|
75  | 
-R MIRROR Cygwin mirror site (default """ + quote(default_mirror) + """)  | 
|
76  | 
-p NAME additional Cygwin package  | 
|
77  | 
||
78  | 
Produce pre-canned Cygwin distribution for Isabelle: this requires  | 
|
79  | 
Windows administrator mode.  | 
|
80  | 
""",  | 
|
81  | 
"R:" -> (arg => mirror = arg),  | 
|
82  | 
"p:" -> (arg => more_packages ::= arg))  | 
|
83  | 
||
84  | 
val more_args = getopts(args)  | 
|
85  | 
if (more_args.nonEmpty) getopts.usage()  | 
|
86  | 
||
87  | 
build_cygwin(new Console_Progress(), mirror = mirror, more_packages = more_packages)  | 
|
| 
69277
 
258bef08b31e
support for user-defined Isabelle/Scala command-line tools;
 
wenzelm 
parents: 
68374 
diff
changeset
 | 
88  | 
})  | 
| 65071 | 89  | 
}  |