diff --git a/pkgs/compiler-test/tests/compiler/embed/embed-me38.rkt b/pkgs/compiler-test/tests/compiler/embed/embed-me38.rkt new file mode 100644 index 0000000000..6aa285e184 --- /dev/null +++ b/pkgs/compiler-test/tests/compiler/embed/embed-me38.rkt @@ -0,0 +1,12 @@ +#lang racket/base +(require racket/runtime-path + (for-syntax racket/base)) + +(define-runtime-path license '(share "LICENSE-libscheme.txt")) + +(if (absolute-path? license) + "found license" + "not found") + + + diff --git a/pkgs/compiler-test/tests/compiler/embed/test.rkt b/pkgs/compiler-test/tests/compiler/embed/test.rkt index 41849a5287..1be57ca0db 100644 --- a/pkgs/compiler-test/tests/compiler/embed/test.rkt +++ b/pkgs/compiler-test/tests/compiler/embed/test.rkt @@ -272,7 +272,8 @@ (one-mz-test "embed-me31.rkt" "This is 31.\n" #f) (one-mz-test "embed-me34.rkt" "This is 34 in a second place.\n" #f) (one-mz-test "embed-me35.rkt" "'ok-35\n" #f) - (one-mz-test "embed-me36.rkt" "'ok-36\n" #f)) + (one-mz-test "embed-me36.rkt" "'ok-36\n" #f) + (one-mz-test "embed-me38.rkt" "\"found license\"\n" #f)) ;; Try unicode expr and cmdline: (prepare dest "unicode") diff --git a/pkgs/racket-doc/scribblings/reference/filesystem.scrbl b/pkgs/racket-doc/scribblings/reference/filesystem.scrbl index 2c229c6515..229d04a148 100644 --- a/pkgs/racket-doc/scribblings/reference/filesystem.scrbl +++ b/pkgs/racket-doc/scribblings/reference/filesystem.scrbl @@ -728,6 +728,14 @@ a platform-specific shared-library extension---as produced by @racket[(system-type 'so-suffix)]. A @racket[_vers] can be a string, or it can be a list of strings and @racket[#f]. +If @racket[expr] produces a list of the form @racket[(list 'share +_str)], the value bound to @racket[id] can be either @racket[_str] or +an absolute path; it is an absolute path when searching in the +directories reported by @racket[find-user-share-dir] and +@racket[find-share-dir] (in that order) locates the path. In this way, +files that are installed in Racket's @filepath{share} directory get +carried along in distributions. + If @racket[expr] produces a list of the form @racket[(list 'module _module-path _var-ref)] or @racket[(list 'so _str (list _str-or-false ...))], the value bound to @racket[id] is a @@ -798,7 +806,8 @@ In the latter two cases, the path is normally preserved in result of @racket[collection-file-path], then the path is record as relative to the corresponding module path. -@history[#:changed "6.0.1.6" @elem{Preserve relative paths only within a package.}] +@history[#:changed "6.0.1.6" @elem{Preserve relative paths only within a package.} + #:changed "7.5.0.7" @elem{Added support for @racket['share] in @racket[expr].}] Examples: diff --git a/racket/collects/compiler/embed.rkt b/racket/collects/compiler/embed.rkt index aa966a2531..e941aed251 100644 --- a/racket/collects/compiler/embed.rkt +++ b/racket/collects/compiler/embed.rkt @@ -13,6 +13,7 @@ setup/collects file/ico racket/private/so-search + racket/private/share-search setup/cross-system "private/winsubsys.rkt" "private/macfw.rkt" @@ -1306,6 +1307,7 @@ ;; record the whole DLL in the executable #f] [else path])] + [(share-spec? p) (share-find p)] [(and (list? p) (eq? 'lib (car p))) (let ([p (if (null? (cddr p)) diff --git a/racket/collects/racket/private/share-search.rkt b/racket/collects/racket/private/share-search.rkt new file mode 100644 index 0000000000..33780785a3 --- /dev/null +++ b/racket/collects/racket/private/share-search.rkt @@ -0,0 +1,21 @@ +#lang racket/base +(require setup/dirs) + +(provide share-spec? share-find) + +(define (share-spec? p) + (and (list? p) + (= 2 (length p)) + (eq? 'share (car p)) + (string? (cadr p)))) + +(define (share-find p) + (define f (cadr p)) + (define (search dir) + (and dir + (let ([p (build-path dir f)]) + (and (or (file-exists? p) + (directory-exists? p)) + p)))) + (or (search (find-user-share-dir)) + (search (find-share-dir)))) diff --git a/racket/collects/racket/runtime-path.rkt b/racket/collects/racket/runtime-path.rkt index 2e2d7dda94..45818dc462 100644 --- a/racket/collects/racket/runtime-path.rkt +++ b/racket/collects/racket/runtime-path.rkt @@ -4,6 +4,7 @@ (require racket/list "private/so-search.rkt" + "private/share-search.rkt" "private/this-expression-source-directory.rkt" (only-in "private/runtime-path-table.rkt" table) (for-syntax racket/base)) @@ -97,6 +98,8 @@ [(path? p) p] [(so-spec? p) (or (so-find p) (cadr p))] + [(share-spec? p) (or (share-find p) + (cadr p))] [(and (list? p) ((length p) . > . 1) (eq? 'lib (car p))