
So far, bytecode for traditional Racket has been kept separate from RacketCS bytecode by using a different "compiled" subdirectory for RacketCS. That makes sense for development work to allow the implementations to coexist, but it creates trouble for packaging and distributions, and it (hopefully) won't seem necessary in the long run. Treating the different virtual machines like different versions seems more generally in line with our current infrastructure.
39 lines
1.6 KiB
Racket
39 lines
1.6 KiB
Racket
#lang racket/base
|
|
(require compiler/compilation-path
|
|
compiler/private/dep
|
|
setup/collects)
|
|
|
|
(provide module-recorded-dependencies)
|
|
|
|
(define (module-recorded-dependencies path)
|
|
(define collection-cache (make-hash))
|
|
(define (module-dependencies path all-deps)
|
|
(define dep-path (path-add-extension (get-compilation-path path) #".dep"))
|
|
(define deps (with-handlers ([exn:fail:filesystem? (lambda (exn) #f)]
|
|
[exn:fail:read? (lambda (exn) #f)])
|
|
(call-with-input-file* dep-path read)))
|
|
(for/fold ([all-deps all-deps]) ([dep (in-list (if (and (list? deps)
|
|
(pair? deps)
|
|
(pair? (cdr deps))
|
|
(pair? (cddr deps)))
|
|
(cdddr deps)
|
|
'()))])
|
|
(define p (collects-relative*->path (dep->encoded-path dep) collection-cache))
|
|
(cond
|
|
[(hash-ref all-deps p #f) all-deps]
|
|
[else
|
|
(define new-deps (hash-set all-deps p #t))
|
|
(cond
|
|
[(external-dep? dep) new-deps]
|
|
[else (module-dependencies p new-deps)])])))
|
|
(hash-keys (module-dependencies (simplify-path path) #hash())))
|
|
|
|
(define (get-compilation-path path)
|
|
(define-values (dir name) (get-compilation-dir+name path))
|
|
(build-path dir name))
|
|
|
|
(define (collects-relative*->path p cache)
|
|
(if (bytes? p)
|
|
(bytes->path p)
|
|
(hash-ref! cache p (lambda () (collects-relative->path p)))))
|