152 lines
6.5 KiB
Racket
152 lines
6.5 KiB
Racket
#lang racket/base
|
|
(require racket/gui/base "private/key.rkt")
|
|
|
|
(define debugging? (getenv "PLTDRDEBUG"))
|
|
(define profiling? (getenv "PLTDRPROFILE"))
|
|
|
|
(define first-parallel? (getenv "PLTDRPAR"))
|
|
|
|
(define install-cm? (and (not debugging?)
|
|
(getenv "PLTDRCM")))
|
|
|
|
(define cm-trace? (or (equal? (getenv "PLTDRCM") "trace")
|
|
(equal? (getenv "PLTDRDEBUG") "trace")
|
|
(equal? (getenv "PLTDRPAR") "trace")))
|
|
|
|
;; the flush is only here to ensure that the output is
|
|
;; appears when running in cygwin under windows.
|
|
(define (flprintf fmt . args)
|
|
(apply printf fmt args)
|
|
(flush-output))
|
|
|
|
(define (run-trace-thread)
|
|
(let ([evt (make-log-receiver (current-logger) 'info)])
|
|
(void
|
|
(thread
|
|
(λ ()
|
|
(let loop ()
|
|
(define vec (sync evt))
|
|
(define str (vector-ref vec 1))
|
|
(when (regexp-match #rx"^cm: *compil(ing|ed)" str)
|
|
(display str)
|
|
(newline))
|
|
(loop)))))))
|
|
|
|
(cond
|
|
[debugging?
|
|
(flprintf "PLTDRDEBUG: loading CM to load/create errortrace zos\n")
|
|
(let-values ([(zo-compile
|
|
make-compilation-manager-load/use-compiled-handler)
|
|
(parameterize ([current-namespace (make-base-empty-namespace)]
|
|
[use-compiled-file-paths '()])
|
|
(values
|
|
(dynamic-require 'errortrace/zo-compile 'zo-compile)
|
|
(dynamic-require 'compiler/cm 'make-compilation-manager-load/use-compiled-handler)))])
|
|
(flprintf "PLTDRDEBUG: installing CM to load/create errortrace zos\n")
|
|
(current-compile zo-compile)
|
|
(use-compiled-file-paths (list (build-path "compiled" "errortrace")))
|
|
(current-load/use-compiled (make-compilation-manager-load/use-compiled-handler))
|
|
(error-display-handler (dynamic-require 'errortrace/errortrace-lib
|
|
'errortrace-error-display-handler))
|
|
(when cm-trace?
|
|
(flprintf "PLTDRDEBUG: enabling CM tracing\n")
|
|
(run-trace-thread)))]
|
|
[install-cm?
|
|
(flprintf "PLTDRCM: loading compilation manager\n")
|
|
(let ([make-compilation-manager-load/use-compiled-handler
|
|
(parameterize ([current-namespace (make-base-empty-namespace)])
|
|
(dynamic-require 'compiler/cm 'make-compilation-manager-load/use-compiled-handler))])
|
|
(flprintf "PLTDRCM: installing compilation manager\n")
|
|
(current-load/use-compiled (make-compilation-manager-load/use-compiled-handler))
|
|
(when cm-trace?
|
|
(flprintf "PLTDRCM: enabling CM tracing\n")
|
|
(run-trace-thread)))]
|
|
[first-parallel?
|
|
(flprintf "PLTDRPAR: loading compilation manager\n")
|
|
(define tools? (not (getenv "PLTNOTOOLS")))
|
|
(define (files-in-coll coll)
|
|
(define dir (collection-path coll))
|
|
(map (λ (x) (build-path dir x))
|
|
(filter
|
|
(λ (x) (regexp-match #rx"rkt$" (path->string x)))
|
|
(directory-list dir))))
|
|
(define (randomize lst)
|
|
(define vec (make-vector (length lst) #f))
|
|
(let loop ([i 0]
|
|
[lst lst])
|
|
(cond
|
|
[(= i (vector-length vec)) (void)]
|
|
[else
|
|
(define index (random (- (vector-length vec) i)))
|
|
(define ele (list-ref lst index))
|
|
(vector-set! vec i ele)
|
|
(loop (+ i 1) (remq ele lst))]))
|
|
(vector->list vec))
|
|
|
|
(define (tool-files id)
|
|
(apply
|
|
append
|
|
(map
|
|
(λ (x)
|
|
(define proc (get-info/full x))
|
|
(if proc
|
|
(map (λ (dirs)
|
|
(apply build-path
|
|
x
|
|
(if (list? dirs)
|
|
dirs
|
|
(list dirs))))
|
|
(proc id (λ () '())))
|
|
'()))
|
|
(find-relevant-directories (list id)))))
|
|
|
|
(define make-compilation-manager-load/use-compiled-handler
|
|
(parameterize ([current-namespace (make-base-empty-namespace)])
|
|
(dynamic-require 'compiler/cm 'make-compilation-manager-load/use-compiled-handler)))
|
|
(when cm-trace?
|
|
(flprintf "PLTDRPAR: enabling CM tracing\n")
|
|
(run-trace-thread))
|
|
(flprintf "PLTDRPAR: loading setup/parallel-build\n")
|
|
(define-values (parallel-compile-files get-info/full find-relevant-directories)
|
|
(parameterize ([current-load/use-compiled (make-compilation-manager-load/use-compiled-handler)])
|
|
(values (dynamic-require 'setup/parallel-build 'parallel-compile-files)
|
|
(and tools? (dynamic-require 'setup/getinfo 'get-info/full))
|
|
(and tools? (dynamic-require 'setup/getinfo 'find-relevant-directories)))))
|
|
(if tools?
|
|
(flprintf "PLTDRPAR: parallel compile of framework, drracket, and tools\n")
|
|
(flprintf "PLTDRPAR: parallel compile of framework and drracket\n"))
|
|
|
|
(parallel-compile-files (randomize (append (files-in-coll "drracket")
|
|
(files-in-coll "framework")
|
|
(if tools?
|
|
(append (tool-files 'drracket-tools)
|
|
(tool-files 'tools))
|
|
'())))
|
|
#:handler
|
|
(λ (handler-type path msg out err)
|
|
(case handler-type
|
|
[(done)
|
|
(when cm-trace?
|
|
(printf "PLTDRPAR: made ~a\n" path))]
|
|
[else
|
|
(printf "~a\n" msg)
|
|
(printf "stdout from compiling ~a:\n~a\n" path out)
|
|
(flush-output)
|
|
(fprintf (current-error-port) "stderr from compiling ~a:\n~a\n" path err)])))
|
|
(flprintf "PLTDRPAR: installing compilation manager\n")
|
|
(current-load/use-compiled (make-compilation-manager-load/use-compiled-handler))])
|
|
|
|
(when profiling?
|
|
(flprintf "PLTDRPROFILE: installing profiler\n")
|
|
;; NOTE that this might not always work.
|
|
;; it creates a new custodian and installs it, but the
|
|
;; original eventspace was created on the original custodian
|
|
;; and this code does not create a new eventspace.
|
|
(let ([orig-cust (current-custodian)]
|
|
[orig-eventspace (current-eventspace)]
|
|
[new-cust (make-custodian)])
|
|
(current-custodian new-cust)
|
|
((dynamic-require 'drracket/private/profile-drs 'start-profile) orig-cust)))
|
|
|
|
(dynamic-require 'drracket/private/drracket-normal #f)
|