/collects/drracket/drracket.rkt
http://github.com/gmarceau/PLT · Racket · 151 lines · 133 code · 12 blank · 6 comment · 19 complexity · 6ac9be85a1d69ebec3aeb389cd2326be MD5 · raw file
- #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)