src/Pure/Admin/build_vampire.scala
author wenzelm
Wed, 06 Oct 2021 13:28:11 +0200
changeset 74464 c30906fbbe91
parent 74313 6b998ce1b8cb
child 74465 981e3b6b08a5
permissions -rw-r--r--
build just one vampire version;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Admin/build_vampire.scala
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
     3
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
     4
Build Isabelle Vampire component from repository.
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
     5
*/
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
     6
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
     7
package isabelle
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
     8
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
     9
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    10
object Build_Vampire
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    11
{
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    12
  val default_repository = "https://github.com/vprover/vampire.git"
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    13
  val default_version = "4.5.1"
72890
42d75bf8725c parallel jobs for make;
wenzelm
parents: 72889
diff changeset
    14
  val default_jobs = 1
72887
970bad477c13 clarified default name;
wenzelm
parents: 72886
diff changeset
    15
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    16
  def make_component_name(version: String): String =
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    17
    "vampire-" + Library.try_unprefix("v", version).getOrElse(version)
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    18
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    19
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    20
  /* build Vampire */
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    21
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    22
  def build_vampire(
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    23
    repository: String = default_repository,
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    24
    version: String = default_version,
72890
42d75bf8725c parallel jobs for make;
wenzelm
parents: 72889
diff changeset
    25
    jobs: Int = default_jobs,
72887
970bad477c13 clarified default name;
wenzelm
parents: 72886
diff changeset
    26
    component_name: String = "",
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    27
    verbose: Boolean = false,
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    28
    progress: Progress = new Progress,
73340
0ffcad1f6130 tuned --- fewer warnings;
wenzelm
parents: 73317
diff changeset
    29
    target_dir: Path = Path.current): Unit =
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    30
  {
73650
9ce115baaa4f clarified signature;
wenzelm
parents: 73340
diff changeset
    31
    Isabelle_System.require_command("git")
9ce115baaa4f clarified signature;
wenzelm
parents: 73340
diff changeset
    32
    Isabelle_System.require_command("cmake")
72938
bc88423eb0ad more checks;
wenzelm
parents: 72891
diff changeset
    33
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    34
    Isabelle_System.with_tmp_dir("build")(tmp_dir =>
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    35
    {
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    36
      /* component and platform */
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    37
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    38
      val component = proper_string(component_name) getOrElse make_component_name(version)
72887
970bad477c13 clarified default name;
wenzelm
parents: 72886
diff changeset
    39
      val component_dir = Isabelle_System.new_directory(target_dir + Path.basic(component))
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    40
      progress.echo("Component " + component_dir)
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    41
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    42
      val platform_name =
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    43
        proper_string(Isabelle_System.getenv("ISABELLE_PLATFORM64")) getOrElse
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    44
          error("No 64bit platform")
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    45
      val platform_dir = Isabelle_System.make_directory(component_dir + Path.basic(platform_name))
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    46
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    47
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    48
      /* clone repository */
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    49
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    50
      progress.echo("Cloning repository " + repository)
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    51
      progress.bash("git clone " + Bash.string(repository) + " vampire",
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    52
        cwd = tmp_dir.file, echo = verbose).check
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    53
72888
74d785882737 prefer cmake build for standard version: more portable;
wenzelm
parents: 72887
diff changeset
    54
      val source_dir = tmp_dir + Path.explode("vampire")
74d785882737 prefer cmake build for standard version: more portable;
wenzelm
parents: 72887
diff changeset
    55
73317
df49ca5da9d0 clarified modules: more like ML;
wenzelm
parents: 72938
diff changeset
    56
      Isabelle_System.copy_file(source_dir + Path.explode("LICENCE"), component_dir)
72888
74d785882737 prefer cmake build for standard version: more portable;
wenzelm
parents: 72887
diff changeset
    57
74d785882737 prefer cmake build for standard version: more portable;
wenzelm
parents: 72887
diff changeset
    58
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    59
      /* build */
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    60
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    61
      progress.echo("Building vampire")
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    62
      progress.bash("git checkout --quiet --detach " + Bash.string(version),
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    63
        cwd = source_dir.file, echo = verbose).check
72888
74d785882737 prefer cmake build for standard version: more portable;
wenzelm
parents: 72887
diff changeset
    64
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    65
      val build_dir = source_dir + Path.explode("build")
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    66
      Isabelle_System.rm_tree(build_dir)
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    67
      Isabelle_System.make_directory(build_dir)
72888
74d785882737 prefer cmake build for standard version: more portable;
wenzelm
parents: 72887
diff changeset
    68
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    69
      val cmake_opts = if (Platform.is_linux) "-DBUILD_SHARED_LIBS=0 " else ""
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    70
      val cmake_out =
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    71
        progress.bash("cmake " + cmake_opts + """-G "Unix Makefiles" ..""",
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    72
          cwd = build_dir.file, echo = verbose).check.out
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    73
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    74
      val Pattern = """-- Setting binary name to '?([^\s']*)'?""".r
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    75
      val binary =
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    76
        split_lines(cmake_out).collectFirst({ case Pattern(name) => name })
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    77
          .getOrElse(error("Failed to determine binary name from cmake output:\n" + cmake_out))
72888
74d785882737 prefer cmake build for standard version: more portable;
wenzelm
parents: 72887
diff changeset
    78
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    79
      progress.bash("make -j" + jobs, cwd = build_dir.file, echo = verbose).check
72888
74d785882737 prefer cmake build for standard version: more portable;
wenzelm
parents: 72887
diff changeset
    80
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    81
      Isabelle_System.copy_file(build_dir + Path.basic("bin") + Path.basic(binary).platform_exe,
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
    82
        platform_dir + Path.basic("vampire").platform_exe)
72888
74d785882737 prefer cmake build for standard version: more portable;
wenzelm
parents: 72887
diff changeset
    83
74d785882737 prefer cmake build for standard version: more portable;
wenzelm
parents: 72887
diff changeset
    84
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    85
      /* settings */
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    86
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    87
      val etc_dir = Isabelle_System.make_directory(component_dir + Path.basic("etc"))
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    88
      File.write(etc_dir + Path.basic("settings"),
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    89
        """# -*- shell-script -*- :mode=shellscript:
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    90
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    91
VAMPIRE_HOME="$COMPONENT/$ISABELLE_PLATFORM64"
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    92
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    93
ISABELLE_VAMPIRE="$VAMPIRE_HOME/vampire"
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    94
""")
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    95
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    96
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    97
      /* README */
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    98
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
    99
      File.write(component_dir + Path.basic("README"),
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
   100
        "This Isabelle component provides Vampire " + version + """
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
   101
using original sources from https://github.com/vprover/vampire
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   102
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
   103
The executable has been built like this:
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   104
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
   105
    git checkout REV
72889
5db643841f5d back to uniform build, using latest repository version for vampire_polymorphic;
wenzelm
parents: 72888
diff changeset
   106
    cmake .
5db643841f5d back to uniform build, using latest repository version for vampire_polymorphic;
wenzelm
parents: 72888
diff changeset
   107
    make
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   108
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   109
The precise commit id is revealed by executing "vampire --version".
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   110
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   111
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   112
        Makarius
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   113
        """ + Date.Format.date(Date.now()) + "\n")
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   114
    })
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   115
  }
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   116
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   117
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   118
  /* Isabelle tool wrapper */
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   119
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   120
  val isabelle_tool =
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   121
    Isabelle_Tool("build_vampire", "build prover component from repository", Scala_Project.here,
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   122
    args =>
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   123
    {
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   124
      var target_dir = Path.current
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   125
      var repository = default_repository
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
   126
      var version = default_version
72890
42d75bf8725c parallel jobs for make;
wenzelm
parents: 72889
diff changeset
   127
      var jobs = default_jobs
72887
970bad477c13 clarified default name;
wenzelm
parents: 72886
diff changeset
   128
      var component_name = ""
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   129
      var verbose = false
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   130
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   131
      val getopts = Getopts("""
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   132
Usage: isabelle build_vampire [OPTIONS]
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   133
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   134
  Options are:
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   135
    -D DIR       target directory (default ".")
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   136
    -U URL       repository (default: """" + default_repository + """")
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
   137
    -V REV       version tag (default: """" + default_version + """")
72890
42d75bf8725c parallel jobs for make;
wenzelm
parents: 72889
diff changeset
   138
    -j NUMBER    parallel jobs for make (default: """ + default_jobs + """)
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
   139
    -n NAME      component name (default: """" + make_component_name("REV") + """")
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   140
    -v           verbose
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   141
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   142
  Build prover component from official download.
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   143
""",
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   144
        "D:" -> (arg => target_dir = Path.explode(arg)),
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   145
        "U:" -> (arg => repository = arg),
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
   146
        "V:" -> (arg => version = arg),
72890
42d75bf8725c parallel jobs for make;
wenzelm
parents: 72889
diff changeset
   147
        "j:" -> (arg => jobs = Value.Nat.parse(arg)),
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   148
        "n:" -> (arg => component_name = arg),
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   149
        "v" -> (_ => verbose = true))
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   150
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   151
      val more_args = getopts(args)
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   152
      if (more_args.nonEmpty) getopts.usage()
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   153
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   154
      val progress = new Console_Progress()
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   155
74464
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
   156
      build_vampire(repository = repository, version = version, component_name = component_name,
c30906fbbe91 build just one vampire version;
wenzelm
parents: 74313
diff changeset
   157
        jobs = jobs, verbose = verbose, progress = progress, target_dir = target_dir)
72886
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   158
    })
ac64b753a65f build Isabelle Vampire component from repository;
wenzelm
parents:
diff changeset
   159
}