racket/racket/collects/compiler/depend.rkt
Matthew Flatt 8bed64f44f add virtual-machine identifier to bytecode and ".dep" files
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.
2018-10-21 17:33:24 -06:00

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)))))