8 |
8 |
9 |
9 |
10 object Build_Vampire |
10 object Build_Vampire |
11 { |
11 { |
12 val default_repository = "https://github.com/vprover/vampire.git" |
12 val default_repository = "https://github.com/vprover/vampire.git" |
13 val default_version1 = "4.5.1" |
13 val default_version = "4.5.1" |
14 val default_version2 = "df87588848db" |
|
15 val default_jobs = 1 |
14 val default_jobs = 1 |
16 |
15 |
17 def make_component_name(version: String): String = "vampire-" + version |
16 def make_component_name(version: String): String = |
|
17 "vampire-" + Library.try_unprefix("v", version).getOrElse(version) |
18 |
18 |
19 |
19 |
20 /* build Vampire */ |
20 /* build Vampire */ |
21 |
21 |
22 def build_vampire( |
22 def build_vampire( |
23 repository: String = default_repository, |
23 repository: String = default_repository, |
24 version1: String = default_version1, |
24 version: String = default_version, |
25 version2: String = default_version2, |
|
26 jobs: Int = default_jobs, |
25 jobs: Int = default_jobs, |
27 component_name: String = "", |
26 component_name: String = "", |
28 verbose: Boolean = false, |
27 verbose: Boolean = false, |
29 progress: Progress = new Progress, |
28 progress: Progress = new Progress, |
30 target_dir: Path = Path.current): Unit = |
29 target_dir: Path = Path.current): Unit = |
55 val source_dir = tmp_dir + Path.explode("vampire") |
54 val source_dir = tmp_dir + Path.explode("vampire") |
56 |
55 |
57 Isabelle_System.copy_file(source_dir + Path.explode("LICENCE"), component_dir) |
56 Isabelle_System.copy_file(source_dir + Path.explode("LICENCE"), component_dir) |
58 |
57 |
59 |
58 |
60 /* build versions */ |
59 /* build */ |
61 |
60 |
62 for { (rev, exe) <- List(version1 -> "vampire", version2 -> "vampire_polymorphic") } { |
61 progress.echo("Building vampire") |
63 progress.echo("Building " + exe + " (rev " + rev + ")") |
62 progress.bash("git checkout --quiet --detach " + Bash.string(version), |
64 progress.bash("git checkout --quiet --detach " + Bash.string(rev), |
63 cwd = source_dir.file, echo = verbose).check |
65 cwd = source_dir.file, echo = verbose).check |
|
66 |
64 |
67 val build_dir = source_dir + Path.explode("build") |
65 val build_dir = source_dir + Path.explode("build") |
68 Isabelle_System.rm_tree(build_dir) |
66 Isabelle_System.rm_tree(build_dir) |
69 Isabelle_System.make_directory(build_dir) |
67 Isabelle_System.make_directory(build_dir) |
70 |
68 |
71 val cmake_opts = if (Platform.is_linux) "-DBUILD_SHARED_LIBS=0 " else "" |
69 val cmake_opts = if (Platform.is_linux) "-DBUILD_SHARED_LIBS=0 " else "" |
72 val cmake_out = |
70 val cmake_out = |
73 progress.bash("cmake " + cmake_opts + """-G "Unix Makefiles" ..""", |
71 progress.bash("cmake " + cmake_opts + """-G "Unix Makefiles" ..""", |
74 cwd = build_dir.file, echo = verbose).check.out |
72 cwd = build_dir.file, echo = verbose).check.out |
75 |
73 |
76 val Pattern = """-- Setting binary name to '?([^\s']*)'?""".r |
74 val Pattern = """-- Setting binary name to '?([^\s']*)'?""".r |
77 val binary = |
75 val binary = |
78 split_lines(cmake_out).collectFirst({ case Pattern(name) => name }) |
76 split_lines(cmake_out).collectFirst({ case Pattern(name) => name }) |
79 .getOrElse(error("Failed to determine binary name from cmake output:\n" + cmake_out)) |
77 .getOrElse(error("Failed to determine binary name from cmake output:\n" + cmake_out)) |
80 |
78 |
81 progress.bash("make -j" + jobs, cwd = build_dir.file, echo = verbose).check |
79 progress.bash("make -j" + jobs, cwd = build_dir.file, echo = verbose).check |
82 |
80 |
83 Isabelle_System.copy_file(build_dir + Path.basic("bin") + Path.basic(binary).platform_exe, |
81 Isabelle_System.copy_file(build_dir + Path.basic("bin") + Path.basic(binary).platform_exe, |
84 platform_dir + Path.basic(exe).platform_exe) |
82 platform_dir + Path.basic("vampire").platform_exe) |
85 } |
|
86 |
83 |
87 |
84 |
88 /* settings */ |
85 /* settings */ |
89 |
86 |
90 val etc_dir = Isabelle_System.make_directory(component_dir + Path.basic("etc")) |
87 val etc_dir = Isabelle_System.make_directory(component_dir + Path.basic("etc")) |
92 """# -*- shell-script -*- :mode=shellscript: |
89 """# -*- shell-script -*- :mode=shellscript: |
93 |
90 |
94 VAMPIRE_HOME="$COMPONENT/$ISABELLE_PLATFORM64" |
91 VAMPIRE_HOME="$COMPONENT/$ISABELLE_PLATFORM64" |
95 |
92 |
96 ISABELLE_VAMPIRE="$VAMPIRE_HOME/vampire" |
93 ISABELLE_VAMPIRE="$VAMPIRE_HOME/vampire" |
97 ISABELLE_VAMPIRE_POLYMORPHIC="$VAMPIRE_HOME/vampire_polymorphic" |
|
98 """) |
94 """) |
99 |
95 |
100 |
96 |
101 /* README */ |
97 /* README */ |
102 |
98 |
103 File.write(component_dir + Path.basic("README"), |
99 File.write(component_dir + Path.basic("README"), |
104 "This Isabelle component provides two versions of Vampire from\n" + repository + """ |
100 "This Isabelle component provides Vampire " + version + """ |
|
101 using original sources from https://github.com/vprover/vampire |
105 |
102 |
106 * vampire: standard version (regular stable release) |
103 The executable has been built like this: |
107 * vampire_polymorphic: special version for polymorphic FOL and HOL |
|
108 (intermediate repository version) |
|
109 |
104 |
110 The executables have been built like this: |
105 git checkout REV |
111 |
|
112 git checkout COMMIT |
|
113 cmake . |
106 cmake . |
114 make |
107 make |
115 |
108 |
116 The precise commit id is revealed by executing "vampire --version". |
109 The precise commit id is revealed by executing "vampire --version". |
117 |
110 |
128 Isabelle_Tool("build_vampire", "build prover component from repository", Scala_Project.here, |
121 Isabelle_Tool("build_vampire", "build prover component from repository", Scala_Project.here, |
129 args => |
122 args => |
130 { |
123 { |
131 var target_dir = Path.current |
124 var target_dir = Path.current |
132 var repository = default_repository |
125 var repository = default_repository |
133 var version1 = default_version1 |
126 var version = default_version |
134 var version2 = default_version2 |
|
135 var jobs = default_jobs |
127 var jobs = default_jobs |
136 var component_name = "" |
128 var component_name = "" |
137 var verbose = false |
129 var verbose = false |
138 |
130 |
139 val getopts = Getopts(""" |
131 val getopts = Getopts(""" |
140 Usage: isabelle build_vampire [OPTIONS] |
132 Usage: isabelle build_vampire [OPTIONS] |
141 |
133 |
142 Options are: |
134 Options are: |
143 -D DIR target directory (default ".") |
135 -D DIR target directory (default ".") |
144 -U URL repository (default: """" + default_repository + """") |
136 -U URL repository (default: """" + default_repository + """") |
145 -V REV1 standard version (default: """" + default_version1 + """") |
137 -V REV version tag (default: """" + default_version + """") |
146 -W REV2 polymorphic version (default: """" + default_version2 + """") |
|
147 -j NUMBER parallel jobs for make (default: """ + default_jobs + """) |
138 -j NUMBER parallel jobs for make (default: """ + default_jobs + """) |
148 -n NAME component name (default: """" + make_component_name("REV1") + """") |
139 -n NAME component name (default: """" + make_component_name("REV") + """") |
149 -v verbose |
140 -v verbose |
150 |
141 |
151 Build prover component from official download. |
142 Build prover component from official download. |
152 """, |
143 """, |
153 "D:" -> (arg => target_dir = Path.explode(arg)), |
144 "D:" -> (arg => target_dir = Path.explode(arg)), |
154 "U:" -> (arg => repository = arg), |
145 "U:" -> (arg => repository = arg), |
155 "V:" -> (arg => version1 = arg), |
146 "V:" -> (arg => version = arg), |
156 "W:" -> (arg => version2 = arg), |
|
157 "j:" -> (arg => jobs = Value.Nat.parse(arg)), |
147 "j:" -> (arg => jobs = Value.Nat.parse(arg)), |
158 "n:" -> (arg => component_name = arg), |
148 "n:" -> (arg => component_name = arg), |
159 "v" -> (_ => verbose = true)) |
149 "v" -> (_ => verbose = true)) |
160 |
150 |
161 val more_args = getopts(args) |
151 val more_args = getopts(args) |
162 if (more_args.nonEmpty) getopts.usage() |
152 if (more_args.nonEmpty) getopts.usage() |
163 |
153 |
164 val progress = new Console_Progress() |
154 val progress = new Console_Progress() |
165 |
155 |
166 build_vampire(repository = repository, version1 = version1, version2 = version2, |
156 build_vampire(repository = repository, version = version, component_name = component_name, |
167 component_name = component_name, jobs = jobs, verbose = verbose, progress = progress, |
157 jobs = jobs, verbose = verbose, progress = progress, target_dir = target_dir) |
168 target_dir = target_dir) |
|
169 }) |
158 }) |
170 } |
159 } |