raco setup: add --error-out and --error-in

The `--error-out` and `--error-in` flags are meant to work together to
chain a sequence of `raco setup` steps where one of them might fail,
but other steps should proceed. The last step in that sequence should
use only `--error-in`, so that it exits with failure if any of the
steps failed.

The `both` target of the toplevel makefile uses `--error-out` and
`--error-in` to let a Racket CS build proceed as long as the
traditional Racket build made it to the last `raco setup` step, which
means that it survives package-build errors.
This commit is contained in:
Matthew Flatt 2019-03-06 09:43:18 -07:00
parent fe6d243a71
commit 875e3b290d
5 changed files with 54 additions and 7 deletions

View File

@ -41,6 +41,9 @@ WIN32_RUN_RACO = $(WIN32_RUN_RACKET) -N raco -l- raco
DEFAULT_SRC_CATALOG = https://pkgs.racket-lang.org
# Options passed along to any `raco setup` run:
PLT_SETUP_OPTIONS =
# Belongs in the "Configuration options" section, but here
# to accomodate nmake:
SRC_CATALOG = $(DEFAULT_SRC_CATALOG)
@ -66,6 +69,10 @@ INSTALL_PKGS_ARGS = $(JOB_OPTIONS) --no-setup --pkgs \
$(REQUIRED_PKGS) $(PKGS)
ALL_PLT_SETUP_OPTIONS = $(JOB_OPTIONS) $(PLT_SETUP_OPTIONS)
# Allow `--error-out`, etc., for final setup setp, so `make both` can
# continue from errors at that level
IN_PLACE_SETUP_OPTIONS =
plain-in-place:
$(MAKE) plain-minimal-in-place
$(MAKE) in-place-setup
@ -85,7 +92,7 @@ plain-minimal-in-place-after-base:
$(RUN_RACO) setup --only-foreign-libs $(ALL_PLT_SETUP_OPTIONS)
in-place-setup:
$(RUN_RACO) setup $(ALL_PLT_SETUP_OPTIONS)
$(RUN_RACO) setup $(ALL_PLT_SETUP_OPTIONS) $(IN_PLACE_SETUP_OPTIONS)
win32-in-place:
$(MAKE) win32-base
@ -103,7 +110,7 @@ win32-minimal-in-place-after-base:
win32-in-place-after-base:
$(MAKE) win32-minimal-in-place-after-base PKGS="$(PKGS)" SRC_CATALOG="$(SRC_CATALOG)" WIN32_PLAIN_RACKET="$(WIN32_PLAIN_RACKET)"
$(WIN32_RUN_RACO) setup $(ALL_PLT_SETUP_OPTIONS)
$(WIN32_RUN_RACO) setup $(ALL_PLT_SETUP_OPTIONS) $(IN_PLACE_SETUP_OPTIONS)
# Rebuild without consulting catalogs or package sources:
@ -121,7 +128,7 @@ plain-as-is:
win32-as-is:
$(MAKE) win32-base
$(WIN32_RUN_RACO) setup $(ALL_PLT_SETUP_OPTIONS)
$(WIN32_RUN_RACO) setup $(ALL_PLT_SETUP_OPTIONS) $(IN_PLACE_SETUP_OPTIONS)
# ------------------------------------------------------------
# Unix-style build (Unix and Mac OS, only)
@ -458,8 +465,8 @@ racket/src/build/cross/cs/c/Makefile: racket/src/cs/c/configure racket/src/cs/c/
# ... but update packages and builds docs only once
both:
$(MAKE) in-place
$(MAKE) also-cs
$(MAKE) in-place IN_PLACE_SETUP_OPTIONS="--error-out build/step"
$(MAKE) also-cs IN_PLACE_SETUP_OPTIONS="--error-in build/step"
also-cs:
$(MAKE) cs CS_SETUP_TARGET=in-place-setup PLT_SETUP_OPTIONS="-D $(PLT_SETUP_OPTIONS)"

View File

@ -273,6 +273,19 @@ flags:
@item{@DFlag{fail-fast} --- attempt to break as soon as any error is
discovered.}
@item{@DFlag{error-out} @nonterm{file} --- handle survivable errors
by writing @nonterm{file} and exiting as successful, which
facilitates chaining multiple @exec{raco setup} invocations in
combination with @DFlag{error-in}. If there are no errors and
@nonterm{file} already exists, it is deleted.}
@item{@DFlag{error-in} @nonterm{file} --- treat the existence of
@nonterm{file} as a ``errors were reported by a previous process''
error. Typically, @nonterm{file} is created by previous @exec{raco
setup} run using @DFlag{error-out}. A file for @DFlag{error-in} is
detected before creating a file via @DFlag{error-out}, so the same
file can be used to chain a sequence of @exec{raco setup} steps.}
@item{@DFlag{pause} or @Flag{p} --- pause for user input if any
errors are reported (so that a user has time to inspect output that
might otherwise disappear when the @exec{raco setup} process ends).}
@ -337,7 +350,8 @@ update a compiled file's timestamp if the file is not recompiled.
#:changed "6.1.1" @elem{Added the @DFlag{force-user-docs} flag.}
#:changed "6.1.1.6" @elem{Added the @DFlag{only-foreign-libs} flag.}
#:changed "6.6.0.3" @elem{Added support for @envvar{PLT_COMPILED_FILE_CHECK}.}
#:changed "7.0.0.19" @elem{Added @DFlag{places} and @DFlag{processes}.}]
#:changed "7.0.0.19" @elem{Added @DFlag{places} and @DFlag{processes}.}
#:changed "7.2.0.7" @elem{Added @DFlag{error-in} and @DFlag{error-out}.}]
@; ------------------------------------------------------------------------

View File

@ -88,6 +88,8 @@
(define-flag-param force-unpacks #f)
(define-flag-param doc-pdf-dest #f)
(define-flag-param fail-fast #f)
(define-flag-param next-error-out-file #f)
(define-flag-param previous-error-in-file #f)
(define specific-collections (make-parameter null))
(define specific-packages (make-parameter null))

View File

@ -147,6 +147,10 @@
(add-flags `((compile-mode ,mode)))]
[("--fail-fast") "Trigger a break on the first error"
(add-flags '((fail-fast #t)))]
[("--error-out") file "On continuable error, create <file> and exit as success"
(add-flags `((next-error-out-file ,file)))]
[("--error-in") file "Check <file> for report of previous errors"
(add-flags `((previous-error-in-file ,file)))]
[("-p" "--pause") "Pause at the end if there are any errors"
(add-flags '((pause-on-errors #t)))]
#:help-labels

View File

@ -206,9 +206,29 @@
(when (pause-on-errors)
(eprintf "INSTALLATION FAILED.\nPress Enter to continue...\n")
(read-line))
(exit 1))
(set! exit-code 1))
(manage-prevous-and-next)
(exit exit-code))
(define (manage-prevous-and-next)
(define prev (previous-error-in-file))
(when (and prev (file-exists? prev))
(setup-printf #f "--- previous errors ---")
(setup-printf #f "errors were~a reported by a previous process"
(if (zero? exit-code) "" " also"))
(set! exit-code 1))
(define next (next-error-out-file))
(when next
(cond
[(zero? exit-code)
(delete-directory/files next #:must-exist? #f)]
[else
(call-with-output-file*
next
#:exists 'truncate/replace
(lambda (o) (fprintf o "Errors reported\n")))
(set! exit-code 0)])))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Archive Unpacking ;;
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;