diff --git a/Admin/bash_process/bash_process.c b/Admin/bash_process/bash_process.c deleted file mode 100644 --- a/Admin/bash_process/bash_process.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Author: Makarius - -Bash process with separate process group id. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static void fail(const char *msg) -{ - fprintf(stderr, "%s\n", msg); - fflush(stderr); - exit(2); -} - -static time_t now() -{ - struct timeval tv; - if (gettimeofday(&tv, NULL) == 0) { - return tv.tv_sec * 1000 + tv.tv_usec / 1000; - } - else { - return time(NULL) * 1000; - } -} - - -int main(int argc, char *argv[]) -{ - /* args */ - - if (argc < 2) { - fprintf(stderr, "Bad arguments: missing TIMING_FILE\n"); - fflush(stderr); - exit(1); - } - char *timing_name = argv[1]; - - - /* potential fork */ - - time_t time_start = now(); - - if (strlen(timing_name) > 0 || setsid() == -1) { - pid_t pid = fork(); - - if (pid == -1) fail("Cannot set session id (failed to fork)"); - else if (pid != 0) { - int status; - - // ingore SIGINT - struct sigaction sa; - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = SIG_IGN; - sigaction(SIGINT, &sa, 0); - - if (waitpid(pid, &status, 0) == -1) { - fail("Cannot join forked process"); - } - - /* report timing */ - - if (strlen(timing_name) > 0) { - long long timing_elapsed = now() - time_start; - - struct rusage ru; - getrusage(RUSAGE_CHILDREN, &ru); - - long long timing_cpu = - ru.ru_utime.tv_sec * 1000 + ru.ru_utime.tv_usec / 1000 + - ru.ru_stime.tv_sec * 1000 + ru.ru_stime.tv_usec / 1000; - - FILE *timing_file = fopen(timing_name, "w"); - if (timing_file == NULL) fail("Cannot open timing file"); - fprintf(timing_file, "%lld %lld", timing_elapsed, timing_cpu); - fclose(timing_file); - } - - if (WIFEXITED(status)) { - exit(WEXITSTATUS(status)); - } - else if (WIFSIGNALED(status)) { - exit(128 + WTERMSIG(status)); - } - else { - fail("Unknown status of forked process"); - } - } - else if (setsid() == -1) fail("Cannot set session id (after fork)"); - } - - - /* report pid */ - - fprintf(stdout, "%d\n", getpid()); - fflush(stdout); - - - /* shift command line */ - - int i; - for (i = 2; i < argc; i++) { - argv[i - 2] = argv[i]; - } - argv[argc - 2] = NULL; - argv[argc - 1] = NULL; - - - /* exec */ - - execvp("bash", argv); - fail("Cannot exec process"); -} diff --git a/Admin/bash_process/build b/Admin/bash_process/build deleted file mode 100755 --- a/Admin/bash_process/build +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env bash -# -# Multi-platform build script - -unset CDPATH -THIS="$(cd "$(dirname "$0")"; pwd)" -PRG="$(basename "$0")" - - -# diagnostics - -function usage() -{ - echo - echo "Usage: $PRG PLATFORM" - echo - exit 1 -} - -function fail() -{ - echo "$1" >&2 - exit 2 -} - - -# command line args - -[ "$#" -eq 0 ] && usage -PLATFORM="$1"; shift - -[ "$#" -eq 0 ] || usage - - -# main - -PLATFORM_DIR="platform_${PLATFORM}" - -case "$PLATFORM" in - arm64-linux | arm64-darwin) - mkdir -p "$PLATFORM_DIR" - cc -Wall bash_process.c -o "$PLATFORM_DIR/bash_process" - ;; - x86_64-linux | x86_64-darwin) - mkdir -p "$PLATFORM_DIR" - cc -Wall -m64 bash_process.c -o "$PLATFORM_DIR/bash_process" - ;; - x86_64-cygwin) - mkdir -p "$PLATFORM_DIR" - cc -Wall bash_process.c -o "$PLATFORM_DIR/bash_process.exe" - ;; - *) - fail "Bad target platform: \"$PLATFORM\"" - ;; -esac diff --git a/Admin/bash_process/etc/settings b/Admin/bash_process/etc/settings deleted file mode 100644 --- a/Admin/bash_process/etc/settings +++ /dev/null @@ -1,4 +0,0 @@ -# -*- shell-script -*- :mode=shellscript: - -ISABELLE_BASH_PROCESS_HOME="$COMPONENT" -ISABELLE_BASH_PROCESS="$ISABELLE_BASH_PROCESS_HOME/platform_${ISABELLE_APPLE_PLATFORM64:-$ISABELLE_PLATFORM64}/bash_process" diff --git a/etc/build.props b/etc/build.props --- a/etc/build.props +++ b/etc/build.props @@ -1,349 +1,350 @@ title = Isabelle/Scala module = $ISABELLE_HOME/lib/classes/isabelle.jar main = isabelle.jedit.JEdit_Main resources = \ lib/services/java.nio.charset.spi.CharsetProvider:META-INF/services/ \ lib/logo/isabelle_transparent-32.gif:isabelle/ \ lib/logo/isabelle_transparent.gif:isabelle/ sources = \ src/HOL/SPARK/Tools/spark.scala \ src/HOL/Tools/ATP/system_on_tptp.scala \ src/HOL/Tools/Mirabelle/mirabelle.scala \ src/HOL/Tools/Nitpick/kodkod.scala \ src/Pure/Admin/afp.scala \ src/Pure/Admin/build_doc.scala \ src/Pure/Admin/build_history.scala \ src/Pure/Admin/build_log.scala \ src/Pure/Admin/build_release.scala \ src/Pure/Admin/build_status.scala \ src/Pure/Admin/check_sources.scala \ src/Pure/Admin/ci_build.scala \ + src/Pure/Admin/component_bash_process.scala \ src/Pure/Admin/component_csdp.scala \ src/Pure/Admin/component_cvc5.scala \ src/Pure/Admin/component_cygwin.scala \ src/Pure/Admin/component_e.scala \ src/Pure/Admin/component_easychair.scala \ src/Pure/Admin/component_eptcs.scala \ src/Pure/Admin/component_foiltex.scala \ src/Pure/Admin/component_fonts.scala \ src/Pure/Admin/component_go.scala \ src/Pure/Admin/component_hugo.scala \ src/Pure/Admin/component_javamail.scala \ src/Pure/Admin/component_jdk.scala \ src/Pure/Admin/component_jedit.scala \ src/Pure/Admin/component_jsoup.scala \ src/Pure/Admin/component_lipics.scala \ src/Pure/Admin/component_llncs.scala \ src/Pure/Admin/component_minisat.scala \ src/Pure/Admin/component_mlton.scala \ src/Pure/Admin/component_pdfjs.scala \ src/Pure/Admin/component_polyml.scala \ src/Pure/Admin/component_postgresql.scala \ src/Pure/Admin/component_prismjs.scala \ src/Pure/Admin/component_rsync.scala \ src/Pure/Admin/component_scala.scala \ src/Pure/Admin/component_spass.scala \ src/Pure/Admin/component_sqlite.scala \ src/Pure/Admin/component_stack.scala \ src/Pure/Admin/component_windows_app.scala \ src/Pure/Admin/component_vampire.scala \ src/Pure/Admin/component_verit.scala \ src/Pure/Admin/component_zipperposition.scala \ src/Pure/Admin/component_zstd.scala \ src/Pure/Admin/isabelle_cronjob.scala \ src/Pure/Build/browser_info.scala \ src/Pure/Build/build.scala \ src/Pure/Build/build_benchmark.scala \ src/Pure/Build/build_cluster.scala \ src/Pure/Build/build_job.scala \ src/Pure/Build/build_process.scala \ src/Pure/Build/build_schedule.scala \ src/Pure/Build/database_progress.scala \ src/Pure/Build/export.scala \ src/Pure/Build/export_theory.scala \ src/Pure/Build/file_format.scala \ src/Pure/Build/resources.scala \ src/Pure/Build/sessions.scala \ src/Pure/Build/store.scala \ src/Pure/Concurrent/consumer_thread.scala \ src/Pure/Concurrent/counter.scala \ src/Pure/Concurrent/delay.scala \ src/Pure/Concurrent/event_timer.scala \ src/Pure/Concurrent/future.scala \ src/Pure/Concurrent/isabelle_thread.scala \ src/Pure/Concurrent/mailbox.scala \ src/Pure/Concurrent/multithreading.scala \ src/Pure/Concurrent/par_list.scala \ src/Pure/Concurrent/synchronized.scala \ src/Pure/GUI/color_value.scala \ src/Pure/GUI/desktop_app.scala \ src/Pure/GUI/gui.scala \ src/Pure/GUI/gui_thread.scala \ src/Pure/GUI/popup.scala \ src/Pure/GUI/wrap_panel.scala \ src/Pure/General/antiquote.scala \ src/Pure/General/base64.scala \ src/Pure/General/bibtex.scala \ src/Pure/General/bytes.scala \ src/Pure/General/cache.scala \ src/Pure/General/codepoint.scala \ src/Pure/General/comment.scala \ src/Pure/General/completion.scala \ src/Pure/General/compress.scala \ src/Pure/General/csv.scala \ src/Pure/General/date.scala \ src/Pure/General/exn.scala \ src/Pure/General/file.scala \ src/Pure/General/file_watcher.scala \ src/Pure/General/graph.scala \ src/Pure/General/graph_display.scala \ src/Pure/General/graphics_file.scala \ src/Pure/General/html.scala \ src/Pure/General/http.scala \ src/Pure/General/js.scala \ src/Pure/General/json.scala \ src/Pure/General/json_api.scala \ src/Pure/General/latex.scala \ src/Pure/General/linear_set.scala \ src/Pure/General/logger.scala \ src/Pure/General/long_name.scala \ src/Pure/General/mail.scala \ src/Pure/General/mailman.scala \ src/Pure/General/mercurial.scala \ src/Pure/General/multi_map.scala \ src/Pure/General/output.scala \ src/Pure/General/path.scala \ src/Pure/General/position.scala \ src/Pure/General/pretty.scala \ src/Pure/General/properties.scala \ src/Pure/General/rdf.scala \ src/Pure/General/rsync.scala \ src/Pure/General/scan.scala \ src/Pure/General/sha1.scala \ src/Pure/General/space.scala \ src/Pure/General/sql.scala \ src/Pure/General/ssh.scala \ src/Pure/General/symbol.scala \ src/Pure/General/time.scala \ src/Pure/General/timing.scala \ src/Pure/General/toml.scala \ src/Pure/General/untyped.scala \ src/Pure/General/url.scala \ src/Pure/General/utf8.scala \ src/Pure/General/uuid.scala \ src/Pure/General/value.scala \ src/Pure/General/word.scala \ src/Pure/General/zstd.scala \ src/Pure/Isar/document_structure.scala \ src/Pure/Isar/keyword.scala \ src/Pure/Isar/line_structure.scala \ src/Pure/Isar/outer_syntax.scala \ src/Pure/Isar/parse.scala \ src/Pure/Isar/token.scala \ src/Pure/ML/ml_console.scala \ src/Pure/ML/ml_heap.scala \ src/Pure/ML/ml_lex.scala \ src/Pure/ML/ml_process.scala \ src/Pure/ML/ml_profiling.scala \ src/Pure/ML/ml_statistics.scala \ src/Pure/ML/ml_syntax.scala \ src/Pure/PIDE/byte_message.scala \ src/Pure/PIDE/command.scala \ src/Pure/PIDE/command_span.scala \ src/Pure/PIDE/document.scala \ src/Pure/PIDE/document_editor.scala \ src/Pure/PIDE/document_id.scala \ src/Pure/PIDE/document_info.scala \ src/Pure/PIDE/document_status.scala \ src/Pure/PIDE/editor.scala \ src/Pure/PIDE/headless.scala \ src/Pure/PIDE/line.scala \ src/Pure/PIDE/markup.scala \ src/Pure/PIDE/markup_tree.scala \ src/Pure/PIDE/protocol.scala \ src/Pure/PIDE/protocol_handlers.scala \ src/Pure/PIDE/protocol_message.scala \ src/Pure/PIDE/prover.scala \ src/Pure/PIDE/query_operation.scala \ src/Pure/PIDE/rendering.scala \ src/Pure/PIDE/session.scala \ src/Pure/PIDE/text.scala \ src/Pure/PIDE/xml.scala \ src/Pure/PIDE/yxml.scala \ src/Pure/ROOT.scala \ src/Pure/System/bash.scala \ src/Pure/System/classpath.scala \ src/Pure/System/command_line.scala \ src/Pure/System/components.scala \ src/Pure/System/executable.scala \ src/Pure/System/getopts.scala \ src/Pure/System/host.scala \ src/Pure/System/isabelle_charset.scala \ src/Pure/System/isabelle_fonts.scala \ src/Pure/System/isabelle_platform.scala \ src/Pure/System/isabelle_process.scala \ src/Pure/System/isabelle_system.scala \ src/Pure/System/isabelle_tool.scala \ src/Pure/System/java_statistics.scala \ src/Pure/System/linux.scala \ src/Pure/System/mingw.scala \ src/Pure/System/nodejs.scala \ src/Pure/System/options.scala \ src/Pure/System/other_isabelle.scala \ src/Pure/System/platform.scala \ src/Pure/System/posix_interrupt.scala \ src/Pure/System/process_result.scala \ src/Pure/System/program_progress.scala \ src/Pure/System/progress.scala \ src/Pure/System/registry.scala \ src/Pure/System/scala.scala \ src/Pure/System/system_channel.scala \ src/Pure/System/tty_loop.scala \ src/Pure/Thy/document_build.scala \ src/Pure/Thy/thy_element.scala \ src/Pure/Thy/thy_header.scala \ src/Pure/Thy/thy_syntax.scala \ src/Pure/Tools/check_keywords.scala \ src/Pure/Tools/debugger.scala \ src/Pure/Tools/doc.scala \ src/Pure/Tools/docker_build.scala \ src/Pure/Tools/dotnet_setup.scala \ src/Pure/Tools/dump.scala \ src/Pure/Tools/flarum.scala \ src/Pure/Tools/fontforge.scala \ src/Pure/Tools/java_monitor.scala \ src/Pure/Tools/logo.scala \ src/Pure/Tools/mkroot.scala \ src/Pure/Tools/phabricator.scala \ src/Pure/Tools/print_operation.scala \ src/Pure/Tools/prismjs.scala \ src/Pure/Tools/profiling.scala \ src/Pure/Tools/profiling_report.scala \ src/Pure/Tools/scala_build.scala \ src/Pure/Tools/scala_project.scala \ src/Pure/Tools/server.scala \ src/Pure/Tools/server_commands.scala \ src/Pure/Tools/simplifier_trace.scala \ src/Pure/Tools/spell_checker.scala \ src/Pure/Tools/sync.scala \ src/Pure/Tools/task_statistics.scala \ src/Pure/Tools/update.scala \ src/Pure/Tools/update_cartouches.scala \ src/Pure/Tools/update_comments.scala \ src/Pure/Tools/update_header.scala \ src/Pure/Tools/update_then.scala \ src/Pure/Tools/update_theorems.scala \ src/Pure/library.scala \ src/Pure/pure_thy.scala \ src/Pure/term.scala \ src/Pure/term_xml.scala \ src/Pure/thm_name.scala \ src/Tools/Graphview/graph_file.scala \ src/Tools/Graphview/graph_panel.scala \ src/Tools/Graphview/graphview.scala \ src/Tools/Graphview/layout.scala \ src/Tools/Graphview/main_panel.scala \ src/Tools/Graphview/metrics.scala \ src/Tools/Graphview/model.scala \ src/Tools/Graphview/mutator.scala \ src/Tools/Graphview/mutator_dialog.scala \ src/Tools/Graphview/mutator_event.scala \ src/Tools/Graphview/popups.scala \ src/Tools/Graphview/shapes.scala \ src/Tools/Graphview/tree_panel.scala \ src/Tools/VSCode/src/channel.scala \ src/Tools/VSCode/src/component_vscode_extension.scala \ src/Tools/VSCode/src/component_vscodium.scala \ src/Tools/VSCode/src/dynamic_output.scala \ src/Tools/VSCode/src/language_server.scala \ src/Tools/VSCode/src/lsp.scala \ src/Tools/VSCode/src/preview_panel.scala \ src/Tools/VSCode/src/state_panel.scala \ src/Tools/VSCode/src/vscode_main.scala \ src/Tools/VSCode/src/vscode_model.scala \ src/Tools/VSCode/src/vscode_rendering.scala \ src/Tools/VSCode/src/vscode_resources.scala \ src/Tools/VSCode/src/vscode_spell_checker.scala \ src/Tools/jEdit/src/active.scala \ src/Tools/jEdit/src/base_plugin.scala \ src/Tools/jEdit/src/completion_popup.scala \ src/Tools/jEdit/src/context_menu.scala \ src/Tools/jEdit/src/debugger_dockable.scala \ src/Tools/jEdit/src/dockable.scala \ src/Tools/jEdit/src/document_dockable.scala \ src/Tools/jEdit/src/document_model.scala \ src/Tools/jEdit/src/document_view.scala \ src/Tools/jEdit/src/documentation_dockable.scala \ src/Tools/jEdit/src/fold_handling.scala \ src/Tools/jEdit/src/font_info.scala \ src/Tools/jEdit/src/graphview_dockable.scala \ src/Tools/jEdit/src/info_dockable.scala \ src/Tools/jEdit/src/isabelle.scala \ src/Tools/jEdit/src/isabelle_encoding.scala \ src/Tools/jEdit/src/isabelle_export.scala \ src/Tools/jEdit/src/isabelle_session.scala \ src/Tools/jEdit/src/isabelle_vfs.scala \ src/Tools/jEdit/src/jedit_bibtex.scala \ src/Tools/jEdit/src/jedit_editor.scala \ src/Tools/jEdit/src/jedit_jar.scala \ src/Tools/jEdit/src/jedit_lib.scala \ src/Tools/jEdit/src/jedit_main.scala \ src/Tools/jEdit/src/jedit_options.scala \ src/Tools/jEdit/src/jedit_plugins.scala \ src/Tools/jEdit/src/jedit_rendering.scala \ src/Tools/jEdit/src/jedit_resources.scala \ src/Tools/jEdit/src/jedit_sessions.scala \ src/Tools/jEdit/src/jedit_spell_checker.scala \ src/Tools/jEdit/src/keymap_merge.scala \ src/Tools/jEdit/src/main_plugin.scala \ src/Tools/jEdit/src/monitor_dockable.scala \ src/Tools/jEdit/src/output_dockable.scala \ src/Tools/jEdit/src/pide_docking_framework.scala \ src/Tools/jEdit/src/pretty_text_area.scala \ src/Tools/jEdit/src/pretty_tooltip.scala \ src/Tools/jEdit/src/process_indicator.scala \ src/Tools/jEdit/src/protocol_dockable.scala \ src/Tools/jEdit/src/query_dockable.scala \ src/Tools/jEdit/src/raw_output_dockable.scala \ src/Tools/jEdit/src/rich_text_area.scala \ src/Tools/jEdit/src/session_build.scala \ src/Tools/jEdit/src/simplifier_trace_dockable.scala \ src/Tools/jEdit/src/simplifier_trace_window.scala \ src/Tools/jEdit/src/sledgehammer_dockable.scala \ src/Tools/jEdit/src/state_dockable.scala \ src/Tools/jEdit/src/status_widget.scala \ src/Tools/jEdit/src/symbols_dockable.scala \ src/Tools/jEdit/src/syntax_style.scala \ src/Tools/jEdit/src/syslog_dockable.scala \ src/Tools/jEdit/src/text_overview.scala \ src/Tools/jEdit/src/text_structure.scala \ src/Tools/jEdit/src/theories_dockable.scala \ src/Tools/jEdit/src/theories_status.scala \ src/Tools/jEdit/src/timing_dockable.scala \ src/Tools/jEdit/src/token_markup.scala services = \ isabelle.Bash$Handler \ isabelle.Bibtex$File_Format \ isabelle.Build$Engine$Default \ isabelle.Build_Schedule$Build_Engine \ isabelle.Document_Build$Build_Engine \ isabelle.Document_Build$LIPIcs_LuaLaTeX_Engine \ isabelle.Document_Build$LIPIcs_PDFLaTeX_Engine \ isabelle.Document_Build$LuaLaTeX_Engine \ isabelle.Document_Build$PDFLaTeX_Engine \ isabelle.CI_Builds \ isabelle.ML_Statistics$Handler \ isabelle.Print_Operation$Handler \ isabelle.Scala$Handler \ isabelle.Scala_Functions \ isabelle.Server_Commands \ isabelle.Sessions$ROOTS_File_Format \ isabelle.Simplifier_Trace$Handler \ isabelle.Tools \ isabelle.jedit.JEdit_Plugin0 \ isabelle.jedit.JEdit_Plugin1 \ isabelle.jedit.JEdit_JAR$Scala_Functions \ isabelle.nitpick.Kodkod$Handler \ isabelle.nitpick.Scala_Functions \ isabelle.spark.SPARK$Load_Command1 \ isabelle.spark.SPARK$Load_Command2 diff --git a/src/Pure/Admin/component_bash_process.scala b/src/Pure/Admin/component_bash_process.scala new file mode 100644 --- /dev/null +++ b/src/Pure/Admin/component_bash_process.scala @@ -0,0 +1,226 @@ +/* Title: Pure/Admin/component_bash_process.scala + Author: Makarius + +Build bash_process component from C source. +*/ + +package isabelle + + +object Component_Bash_Process { + /* build bash_process */ + + def build_bash_process( + progress: Progress = new Progress, + target_dir: Path = Path.current, + ): Unit = { + Isabelle_System.require_command("cc") + + + /* component */ + + val component_date = Date.Format.alt_date(Date.now()) + val component_name = "bash_process-" + component_date + val component_dir = + Components.Directory(target_dir + Path.basic(component_name)).create(progress = progress) + + + /* platform */ + + val platform_name = + proper_string(Isabelle_System.getenv("ISABELLE_APPLE_PLATFORM64")) orElse + proper_string(Isabelle_System.getenv("ISABELLE_PLATFORM64")) getOrElse + error("Missing ISABELLE_PLATFORM64") + + val platform_dir = + Isabelle_System.make_directory(component_dir.path + Path.basic(platform_name)) + + + /* source */ + + val source_file = Path.explode("bash_process.c") + File.write(component_dir.path + source_file, +"""/* Author: Makarius + License: Isabelle BSD-3 + +Bash process with separate process group id. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void fail(const char *msg) +{ + fprintf(stderr, "%s\n", msg); + fflush(stderr); + exit(2); +} + +static time_t now() +{ + struct timeval tv; + if (gettimeofday(&tv, NULL) == 0) { + return tv.tv_sec * 1000 + tv.tv_usec / 1000; + } + else { + return time(NULL) * 1000; + } +} + + +int main(int argc, char *argv[]) +{ + /* args */ + + if (argc < 2) { + fprintf(stderr, "Bad arguments: missing TIMING_FILE\n"); + fflush(stderr); + exit(1); + } + char *timing_name = argv[1]; + + + /* potential fork */ + + time_t time_start = now(); + + if (strlen(timing_name) > 0 || setsid() == -1) { + pid_t pid = fork(); + + if (pid == -1) fail("Cannot set session id (failed to fork)"); + else if (pid != 0) { + int status; + + // ingore SIGINT + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = SIG_IGN; + sigaction(SIGINT, &sa, 0); + + if (waitpid(pid, &status, 0) == -1) { + fail("Cannot join forked process"); + } + + /* report timing */ + + if (strlen(timing_name) > 0) { + long long timing_elapsed = now() - time_start; + + struct rusage ru; + getrusage(RUSAGE_CHILDREN, &ru); + + long long timing_cpu = + ru.ru_utime.tv_sec * 1000 + ru.ru_utime.tv_usec / 1000 + + ru.ru_stime.tv_sec * 1000 + ru.ru_stime.tv_usec / 1000; + + FILE *timing_file = fopen(timing_name, "w"); + if (timing_file == NULL) fail("Cannot open timing file"); + fprintf(timing_file, "%lld %lld", timing_elapsed, timing_cpu); + fclose(timing_file); + } + + if (WIFEXITED(status)) { + exit(WEXITSTATUS(status)); + } + else if (WIFSIGNALED(status)) { + exit(128 + WTERMSIG(status)); + } + else { + fail("Unknown status of forked process"); + } + } + else if (setsid() == -1) fail("Cannot set session id (after fork)"); + } + + + /* report pid */ + + fprintf(stdout, "%d\n", getpid()); + fflush(stdout); + + + /* shift command line */ + + int i; + for (i = 2; i < argc; i++) { + argv[i - 2] = argv[i]; + } + argv[argc - 2] = NULL; + argv[argc - 1] = NULL; + + + /* exec */ + + execvp("bash", argv); + fail("Cannot exec process"); +} +""") + + + /* build */ + + progress.echo("Building bash_process for " + platform_name + " ...") + progress.bash("cc ../bash_process.c -o bash_process", cwd = platform_dir.file).check + + + /* settings */ + + component_dir.write_settings(""" +ISABELLE_BASH_PROCESS_HOME="$COMPONENT" +ISABELLE_BASH_PROCESS="$ISABELLE_BASH_PROCESS_HOME/${ISABELLE_APPLE_PLATFORM64:-$ISABELLE_PLATFORM64}/bash_process" +""") + + + /* platform.props */ + + File.write(component_dir.platform_props, + Platform.Family.list.map(family => family.toString + " = ").mkString("", "\n", "\n")) + + + /* README */ + + File.write(component_dir.README, +"""The bash_process executable has been built like this: + + cc -Wall bash_process.c -o bash_process + + + Makarius + """ + Date.Format.date(Date.now()) + "\n") +} + + + /* Isabelle tool wrapper */ + + val isabelle_tool = + Isabelle_Tool("component_bash_process", "build bash_process component from C source", + Scala_Project.here, + { args => + var target_dir = Path.current + + val getopts = Getopts(""" +Usage: isabelle component_bash_process [OPTIONS] + + Options are: + -D DIR target directory (default ".") + + Build prover component from official download. +""", + "D:" -> (arg => target_dir = Path.explode(arg))) + + val more_args = getopts(args) + if (more_args.nonEmpty) getopts.usage() + + val progress = new Console_Progress() + + build_bash_process(progress = progress, target_dir = target_dir) + }) +} diff --git a/src/Pure/System/isabelle_tool.scala b/src/Pure/System/isabelle_tool.scala --- a/src/Pure/System/isabelle_tool.scala +++ b/src/Pure/System/isabelle_tool.scala @@ -1,205 +1,206 @@ /* Title: Pure/System/isabelle_tool.scala Author: Makarius Isabelle system tools: external executables or internal Scala functions. */ package isabelle object Isabelle_Tool { /* external tools */ private def dirs(): List[Path] = Path.split(Isabelle_System.getenv_strict("ISABELLE_TOOLS")) private def is_external(dir: Path, name: String): Boolean = { val file = (dir + Path.explode(name)).file try { file.isFile && file.canRead && file.canExecute && !File.is_backup(name) } catch { case _: SecurityException => false } } private def find_external(name: String): Option[List[String] => Unit] = dirs().collectFirst( { case dir if is_external(dir, name) => { (args: List[String]) => val tool = dir + Path.explode(name) val result = Isabelle_System.bash(File.bash_path(tool) + " " + Bash.strings(args)) sys.exit(result.print_stdout.rc) } }) /* internal tools */ private lazy val internal_tools: List[Isabelle_Tool] = Isabelle_System.make_services(classOf[Isabelle_Scala_Tools]).flatMap(_.tools) private def find_internal(name: String): Option[List[String] => Unit] = internal_tools.collectFirst({ case tool if tool.name == name => args => Command_Line.tool { tool.body(args) } }) /* list tools */ abstract class Entry { def name: String def position: Properties.T def description: String def print: String = description match { case "" => name case descr => name + " - " + descr } } sealed case class External(name: String, path: Path) extends Entry { def position: Properties.T = Position.File(path.absolute.implode) def description: String = { val Pattern = """.*\bDESCRIPTION: *(.*)""".r split_lines(File.read(path)).collectFirst({ case Pattern(s) => s }) getOrElse "" } } def external_tools(): List[External] = { for { dir <- dirs() if dir.is_dir name <- File.read_dir(dir) if is_external(dir, name) } yield External(name, dir + Path.explode(name)) } def isabelle_tools(): List[Entry] = (external_tools() ::: internal_tools).sortBy(_.name) object Isabelle_Tools extends Scala.Fun_String("isabelle_tools") { val here = Scala_Project.here def apply(arg: String): String = if (arg.nonEmpty) error("Bad argument: " + quote(arg)) else { val result = isabelle_tools().map(entry => (entry.name, entry.position)) val body = { import XML.Encode._; list(pair(string, properties))(result) } YXML.string_of_body(body) } } /* command line entry point */ def exe(isabelle_home: Path): Path = isabelle_home + Path.explode("bin/isabelle") def main(args: Array[String]): Unit = { Command_Line.tool { args.toList match { case Nil | List("-?") => val tool_descriptions = isabelle_tools().map(_.print) Getopts(""" Usage: isabelle TOOL [ARGS ...] Start Isabelle TOOL with ARGS; pass "-?" for tool-specific help. Available tools:""" + tool_descriptions.mkString("\n ", "\n ", "\n")).usage() case tool_name :: tool_args => find_external(tool_name) orElse find_internal(tool_name) match { case Some(tool) => tool(tool_args) case None => error("Unknown Isabelle tool: " + quote(tool_name)) } } } } } sealed case class Isabelle_Tool( name: String, description: String, here: Scala_Project.Here, body: List[String] => Unit ) extends Isabelle_Tool.Entry { def position: Position.T = here.position } class Isabelle_Scala_Tools(val tools: Isabelle_Tool*) extends Isabelle_System.Service class Tools extends Isabelle_Scala_Tools( Build.isabelle_tool1, Build.isabelle_tool2, Build.isabelle_tool3, Build.isabelle_tool4, Build_Benchmark.isabelle_tool, Build_Schedule.isabelle_tool, CI_Build.isabelle_tool, Doc.isabelle_tool, Docker_Build.isabelle_tool, Document_Build.isabelle_tool, Dotnet_Setup.isabelle_tool, Dump.isabelle_tool, Export.isabelle_tool, Logo.isabelle_tool, ML_Process.isabelle_tool, Mercurial.isabelle_tool1, Mercurial.isabelle_tool2, Mkroot.isabelle_tool, Options.isabelle_tool, Phabricator.isabelle_tool1, Phabricator.isabelle_tool2, Phabricator.isabelle_tool3, Phabricator.isabelle_tool4, Profiling.isabelle_tool, Profiling_Report.isabelle_tool, Scala_Project.isabelle_tool, Server.isabelle_tool, Sessions.isabelle_tool, Sync.isabelle_tool, Update.isabelle_tool, Update_Cartouches.isabelle_tool, Update_Comments.isabelle_tool, Update_Header.isabelle_tool, Update_Then.isabelle_tool, Update_Theorems.isabelle_tool, isabelle.mirabelle.Mirabelle.isabelle_tool, isabelle.vscode.Language_Server.isabelle_tool, isabelle.vscode.VSCode_Main.isabelle_tool) class Admin_Tools extends Isabelle_Scala_Tools( Build_Doc.isabelle_tool, Build_Log.isabelle_tool, Build_Status.isabelle_tool, Check_Sources.isabelle_tool, + Component_Bash_Process.isabelle_tool, Component_CSDP.isabelle_tool, Component_CVC5.isabelle_tool, Component_Cygwin.isabelle_tool, Component_E.isabelle_tool, Component_EPTCS.isabelle_tool, Component_Easychair.isabelle_tool, Component_Foiltex.isabelle_tool, Component_Fonts.isabelle_tool, Component_Go.isabelle_tool, Component_Hugo.isabelle_tool, Component_Javamail.isabelle_tool, Component_JDK.isabelle_tool, Component_JEdit.isabelle_tool, Component_Jsoup.isabelle_tool, Component_LIPIcs.isabelle_tool, Component_LLNCS.isabelle_tool, Component_Minisat.isabelle_tool, Component_MLton.isabelle_tool, Component_PDFjs.isabelle_tool, Component_PolyML.isabelle_tool1, Component_PolyML.isabelle_tool2, Component_PostgreSQL.isabelle_tool, Component_Prismjs.isabelle_tool, Component_Rsync.isabelle_tool, Component_SPASS.isabelle_tool, Component_SQLite.isabelle_tool, Component_Scala.isabelle_tool, Component_Stack.isabelle_tool, Component_Vampire.isabelle_tool, Component_VeriT.isabelle_tool, Component_Windows_App.isabelle_tool, Component_Zipperposition.isabelle_tool, Component_Zstd.isabelle_tool, Components.isabelle_tool, isabelle.vscode.Component_VSCode.isabelle_tool, isabelle.vscode.Component_VSCodium.isabelle_tool1, isabelle.vscode.Component_VSCodium.isabelle_tool2)