add 'gui-bin-dir as a separate configuration option

Allow the directory for GUI executables to be specified as different
from console executables. The defaults for those two are different
on Mac OS, and configuring them differently might be useful to
address #1575.

Although there is probably no demand on Windows or Unix for splitting
the console and GUI bin directories, this patch tries to make things
work sensible there. On Windows, there's a corner case where a
launcher that starts GRacket (especially with `-z`) is intended to be
a console executable. The launcher creator can be told that via a
`subsystem` option, but a new `#:console?` argument was needed for
`make-gracket-launcher-path` lets the path selector know.
This commit is contained in:
Matthew Flatt 2017-01-28 15:19:46 -07:00
parent dc85374501
commit 572b96a6ef
7 changed files with 136 additions and 47 deletions

View File

@ -88,6 +88,16 @@ directory}:
@filepath{bin} sibling directory of the @tech{main collection
directory}.}
@item{@indexed-racket['gui-bin-dir] --- a path, string, or byte
string for the installation's directory containing GUI
executables. It defaults to a the @racket['bin-dir] value, if
configured, or otherwise defaults in a platform-specific way:
to the @filepath{bin} sibling directory of the @tech{main
collection directory} on Unix, and to the parent of the
@tech{main collection directory} on Windows and Mac OS.
@history[#:added "6.8.0.2"]}
@item{@indexed-racket['apps-dir] --- a path, string, or byte string
for the installation's directory for @filepath{.desktop} files.
It defaults to a @filepath{applications} subdirectory of the

View File

@ -6,7 +6,8 @@
launcher/launcher-sig
launcher/launcher-unit
compiler/embed
racket/gui/base))
racket/gui/base
setup/dirs))
@title[#:tag "launcher"]{Installation-Specific Launchers}
@ -267,7 +268,8 @@ arguments.}
@defproc[(gracket-program-launcher-path [name string?]
[#:user? user? any/c #f]
[#:tethered? tethered? any/c #f])
[#:tethered? tethered? any/c #f]
[#:console? console? any/c #f])
path?]{
Returns a pathname for an executable called something like @racket[name]
@ -299,17 +301,25 @@ suffix is automatically appended to @racket[name]. For Unix,
the Racket installation. For Mac OS, the @filepath{.app} suffix
is appended to @racket[name].
@history[#:changed "6.5.0.2" @elem{Added the @racket[#:tethered?] argument.}]}
If @racket[console?] is true, then the path is in the console
executable directory, such as the one reported by
@racket[(find-console-bin-dir)], instead of the GUI executable
directory, such as the one reported by @racket[(find-gui-bin-dir)].
@history[#:changed "6.5.0.2" @elem{Added the @racket[#:tethered?] argument.}
#:changed "6.8.0.2" @elem{Added the @racket[#:console?] argument.}]}
@defproc[(racket-program-launcher-path [name string?]
[#:user? user? any/c #f]
[#:tethered? tethered? any/c #f])
[#:tethered? tethered? any/c #f]
[#:console? console? any/c #f])
path?]{
Returns the same path as @racket[(gracket-program-launcher-path name #:user? user? #:tethered tethered?)].
Returns the same path as @racket[(gracket-program-launcher-path name #:user? user? #:tethered tethered? #:console? console?)].
@history[#:changed "6.5.0.2" @elem{Added the @racket[#:tethered?] argument.}]}
@history[#:changed "6.5.0.2" @elem{Added the @racket[#:tethered?] argument.}
#:changed "6.8.0.2" @elem{Added the @racket[#:console?] argument.}]}
@defproc[(gracket-launcher-is-directory?) boolean?]{

View File

@ -1232,9 +1232,13 @@ function for installing a single @filepath{.plt} file.
@section[#:tag "dirs"]{API for Finding Installation Directories}
@defmodule[setup/dirs]{
The @racketmodname[setup/dirs] library provides several procedures for locating
installation directories:}
@defmodule[setup/dirs]{ The @racketmodname[setup/dirs] library
provides several procedures for locating installation directories.
Many of these paths can be configured through the
@tech{configuration directory} (see @secref["config-file"]).}
@(define-syntax-rule (see-config id)
@elem{See also @racket['id] in @secref["config-file"].})
@defproc[(find-collects-dir) (or/c path? #f)]{
Returns a path to the installation's main @filepath{collects} directory, or
@ -1271,7 +1275,9 @@ function for installing a single @filepath{.plt} file.
@defproc[(find-links-file) path?]{
Returns a path to the installation's @tech[#:doc
reference-doc]{collection links file}. The file indicated by the
returned path may or may not exist.}
returned path may or may not exist.
@see-config[links-file]}
@defproc[(find-user-links-file [vers string? (get-installation-name)]) path?]{
Returns a path to the user's @tech[#:doc reference-doc]{collection
@ -1284,12 +1290,16 @@ function for installing a single @filepath{.plt} file.
order. (Normally, the result includes the result of
@racket[(find-links-file)], which is where new installation-wide
links are installed by @exec{raco link} or @racket[links].) The
files indicated by the returned paths may or may not exist.}
files indicated by the returned paths may or may not exist.
@see-config[links-search-files]}
@defproc[(find-pkgs-dir) path?]{
Returns a path to the directory containing packages with
installation scope; the directory indicated by the returned path may
or may not exist.}
or may not exist.
@see-config[pkgs-dir]}
@defproc[(find-user-pkgs-dir [vers string? (get-installation-name)]) path?]{
Returns a path to the directory containing packages with
@ -1301,11 +1311,15 @@ function for installing a single @filepath{.plt} file.
installation scope. (Normally, the result includes the result of
@racket[(find-pkgs-dir)], which is where new packages are installed
by @exec{raco pkg install}.) The directories indicated by the returned
paths may or may not exist.}
paths may or may not exist.
@see-config[pkgs-search-dirs]}
@defproc[(find-doc-dir) (or/c path? #f)]{
Returns a path to the installation's @filepath{doc} directory.
The result is @racket[#f] if no such directory is available.}
The result is @racket[#f] if no such directory is available.
@see-config[doc-dir]}
@defproc[(find-user-doc-dir) path?]{
Returns a path to a user-specific @filepath{doc} directory. The directory
@ -1317,12 +1331,16 @@ function for installing a single @filepath{.plt} file.
configured otherwise, the result includes any non-@racket[#f] result of
@racket[(find-doc-dir)] and @racket[(find-user-doc-dir)]---but the latter is
included only if the value of the @racket[use-user-specific-search-paths]
parameter is @racket[#t].}
parameter is @racket[#t].
@see-config[doc-search-dirs]}
@defproc[(find-lib-dir) (or/c path? #f)]{
Returns a path to the installation's @filepath{lib} directory, which contains
libraries and other build information. The result is @racket[#f] if no such
directory is available.}
directory is available.
@see-config[lib-dir]}
@defproc[(find-user-lib-dir) path?]{
Returns a path to a user-specific @filepath{lib} directory; the directory
@ -1336,6 +1354,8 @@ function for installing a single @filepath{.plt} file.
value of the @racket[use-user-specific-search-paths] parameter
is @racket[#t].
@see-config[lib-search-dirs]
@history[#:changed "6.1.1.4" @elem{Dropped @racket[(find-dll-dir)]
from the set of paths to
explicitly include in the
@ -1351,7 +1371,9 @@ function for installing a single @filepath{.plt} file.
@defproc[(find-share-dir) (or/c path? #f)]{ Returns a path to the
installation's @filepath{share} directory, which contains installed
packages and other platform-independent files. The result is
@racket[#f] if no such directory is available.}
@racket[#f] if no such directory is available.
@see-config[share-dir]}
@defproc[(find-user-share-dir) path?]{
Returns a path to a user-specific @filepath{share} directory; the directory
@ -1360,7 +1382,9 @@ function for installing a single @filepath{.plt} file.
@defproc[(find-include-dir) (or/c path? #f)]{
Returns a path to the installation's @filepath{include} directory, which
contains @filepath{.h} files for building Racket extensions and embedding
programs. The result is @racket[#f] if no such directory is available.}
programs. The result is @racket[#f] if no such directory is available.
@see-config[include-dir]}
@defproc[(find-user-include-dir) path?]{
Returns a path to a user-specific @filepath{include} directory; the
@ -1371,17 +1395,23 @@ function for installing a single @filepath{.plt} file.
configured otherwise, the result includes any non-@racket[#f] result of
@racket[(find-include-dir)] and @racket[(find-user-include-dir)]---but the
latter is included only if the value of the
@racket[use-user-specific-search-paths] parameter is @racket[#t].}
@racket[use-user-specific-search-paths] parameter is @racket[#t].
@see-config[include-search-dirs]}
@defproc[(find-console-bin-dir) (or/c path? #f)]{
Returns a path to the installation's executable directory, where the
stand-alone Racket executable resides. The result is @racket[#f] if no
such directory is available.}
such directory is available.
@see-config[bin-dir]}
@defproc[(find-gui-bin-dir) (or/c path? #f)]{
Returns a path to the installation's executable directory, where the
stand-alone GRacket executable resides. The result is @racket[#f] if no such
directory is available.}
directory is available.
@see-config[gui-bin-dir]}
@defproc[(find-user-console-bin-dir) path?]{
Returns a path to the user's executable directory; the directory
@ -1395,7 +1425,9 @@ function for installing a single @filepath{.plt} file.
@defproc[(find-apps-dir) (or/c path? #f)]{
Returns a path to the installation's directory @filepath{.desktop}
files (for Unix). The result is @racket[#f] if no such directory
exists.}
exists.
@see-config[apps-dir]}
@defproc[(find-user-apps-dir) path?]{
Returns a path to the user's directory for @filepath{.desktop} files
@ -1404,7 +1436,7 @@ function for installing a single @filepath{.plt} file.
@defproc[(find-man-dir) (or/c path? #f)]{
Returns a path to the installation's man-page directory. The result is
@racket[#f] if no such directory exists.}
@racket[#f] if no such directory exists. @see-config[man-dir]}
@defproc[(find-user-man-dir) path?]{
Returns a path to the user's man-page directory; the directory
@ -1412,7 +1444,9 @@ function for installing a single @filepath{.plt} file.
@defproc[(get-doc-search-url) string?]{
Returns a string that is used by the documentation system, augmented
with a version and search-key query, for remote documentation links.}
with a version and search-key query, for remote documentation links.
@see-config[doc-search-url]}
@defproc[(get-doc-open-url) (or/c string? #f)]{
Returns @racket[#f] or a string for a root URL to be used as an
@ -1421,6 +1455,8 @@ function for installing a single @filepath{.plt} file.
performs keyword searches for documentation via the specified URL
instead of from locally installed documentation.
@see-config[doc-open-url]
@history[#:added "6.0.1.6"]}
@defproc[(get-installation-name) string?]{ Returns the current
@ -1469,7 +1505,7 @@ function for installing a single @filepath{.plt} file.
@exec{raco setup} creates the executable copies, then further
package build and setup operations through the entry points will be
confined to the sandbox and not affect a user's default environment.
@history[#:added "6.5.0.2"]}

View File

@ -1486,9 +1486,8 @@
(mac-dest->executable dest mred?)
mred?)
(when mred?
;; adjust relative path (since GRacket is normally off by one):
(define rel (find-relative-path (find-gui-bin-dir)
(find-lib-dir)))
;; adjust relative path, since exe may change directory :
(define rel (find-relative-path* dest (find-lib-dir)))
(update-framework-path (format "@executable_path/../../../~a"
(path->directory-path rel))
(mac-dest->executable dest mred?)
@ -1508,8 +1507,8 @@
(if m
(if (cdr m)
(update-dll-dir dest (cdr m))
;; adjust relative path (since GRacket is off by one):
(update-dll-dir dest "lib"))
;; adjust relative path, since exe directory can change:
(update-dll-dir dest (find-relative-path* dest (find-dll-dir))))
;; Check whether we need an absolute path to DLLs:
(let ([dir (get-current-dll-dir dest)])
(when (relative-path? dir)
@ -1523,19 +1522,29 @@
(if osx?
(mac-dest->executable dest mred?)
dest))])
(define (gui-bin->config rel)
;; Find the path to config-dir relative to the executable
(define p (find-relative-path* dest (find-config-dir)))
(simplify-path
(if (eq? rel 'same)
p
(build-path rel p))
#f))
(if m
(if (cdr m)
(update-config-dir (dest->executable dest) (cdr m))
(when mred?
(cond
[osx?
;; adjust relative path (since GRacket is off by one):
;; adjust relative path (since GRacket is likely off by one):
(update-config-dir (mac-dest->executable dest mred?)
"../../../etc/")]
(gui-bin->config "../../.."))]
[(eq? 'windows (cross-system-type))
(unless keep-exe?
;; adjust relative path (since GRacket is off by one):
(update-config-dir dest "etc/"))])))
;; adjust relative path (since GRacket is likely off by one):
(update-config-dir dest (gui-bin->config 'same)))]
[else
(update-config-dir dest (gui-bin->config 'same))])))
;; Check whether we need an absolute path to config:
(let ([dir (get-current-config-dir (dest->executable dest))])
(when (relative-path? dir)
@ -1695,11 +1704,14 @@
(cond
[osx?
;; default path in `gracket' is off by one:
(set-collects-path dest-exe #"../../../collects")]
(set-collects-path dest-exe (path->bytes
(build-path 'up 'up 'up
(find-relative-path* dest (find-collects-dir)))))]
[(eq? 'windows (cross-system-type))
(unless keep-exe?
;; off by one in this case, too:
(set-collects-path dest-exe #"collects"))])])
(set-collects-path dest-exe (path->bytes
(find-relative-path* dest (find-collects-dir)))))])])
(cond
[(and use-starter-info? osx?)
(finish-osx-mred dest full-cmdline exe keep-exe? relative?)]
@ -1808,3 +1820,7 @@
[(list? p) (map mac-mred-collects-path-adjust p)]
[(relative-path? p) (build-path 'up 'up 'up p)]
[else p]))
(define (find-relative-path* wrt-exe p)
(define-values (wrt base name) (split-path (path->complete-path wrt-exe)))
(find-relative-path (simplify-path wrt) (simplify-path p)))

View File

@ -423,7 +423,9 @@
[(equal? cdir gdir) p]
[else rel]))
p))))
(find-console-bin-dir))])
(if (eq? kind 'mred)
(find-gui-bin-dir)
(find-console-bin-dir)))])
(if (let ([a (assq 'relative? aux)])
(and a (cdr a)))
(make-relative-path-header dest bindir use-librktdir?)
@ -468,8 +470,11 @@
(when use-librktdir?
(display "# {{{ librktdir\n")
(display "librktdir=\"$bindir/")
(display (find-relative-path (find-console-bin-dir)
(find-lib-dir)))
(display (find-relative-path (simplify-path
(let-values ([(base name dir?) (split-path (path->complete-path dest))])
base))
(simplify-path
(find-lib-dir))))
(display "\"\n")
(display "# }}} librktdir\n"))
(newline)
@ -924,13 +929,13 @@
(string-append (if mred? file (unix-sfx file mred?)) ".exe")]
[else file]))
(define (program-launcher-path name mred? user? tethered?)
(define (program-launcher-path name mred? user? tethered? console?)
(let* ([variant (current-launcher-variant)]
[mac-script? (and (eq? (cross-system-type) 'macosx)
(script-variant? variant))])
(let ([p (add-file-suffix
(build-path
(if (or mac-script? (not mred?))
(if (or mac-script? (not mred?) console?)
(if user?
(or (and tethered?
(find-addon-tethered-console-bin-dir))
@ -953,10 +958,19 @@
(path-replace-extension p #".app")
p))))
(define (gracket-program-launcher-path name #:user? [user? #f] #:tethered? [tethered? #f])
(program-launcher-path name #t user? tethered?))
(define (mred-program-launcher-path name #:user? [user? #f] #:tethered? [tethered? #f])
(gracket-program-launcher-path name #:user? user? #:tethered? tethered?))
(define (gracket-program-launcher-path name
#:user? [user? #f]
#:tethered? [tethered? #f]
#:console? [console? #f])
(program-launcher-path name #t user? tethered? console?))
(define (mred-program-launcher-path name
#:user? [user? #f]
#:tethered? [tethered? #f]
#:console? [console? #f])
(gracket-program-launcher-path name
#:user? user?
#:tethered? tethered?
#:console? console?))
(define (racket-program-launcher-path name #:user? [user? #f] #:tethered? [tethered? #f])
(case (cross-system-type)
@ -971,7 +985,7 @@
(unix-sfx name #f))
(current-launcher-variant)
#f)]
[else (program-launcher-path name #f user? tethered?)]))
[else (program-launcher-path name #f user? tethered? #t)]))
(define (mzscheme-program-launcher-path name #:user? [user? #f] #:tethered? [tethered? #f])
(racket-program-launcher-path name #:user? user? #:tethered? tethered?))

View File

@ -25,7 +25,7 @@
[(macosx unix) "bin"]))
(define-finder provide
config:bin-dir
config:gui-bin-dir
find-gui-bin-dir
find-user-gui-bin-dir
(case (cross-system-type)

View File

@ -58,6 +58,8 @@
(define-config config:include-dir 'include-dir to-path)
(define-config config:include-search-dirs 'include-search-dirs to-path)
(define-config config:bin-dir 'bin-dir to-path)
(define-config config:gui-bin-dir/raw 'gui-bin-dir to-path)
(define config:gui-bin-dir (delay/sync (or (force config:gui-bin-dir/raw) (force config:bin-dir))))
(define-config config:config-tethered-console-bin-dir 'config-tethered-console-bin-dir to-path)
(define-config config:config-tethered-gui-bin-dir 'config-tethered-gui-bin-dir to-path)
(define-config config:man-dir 'man-dir to-path)
@ -271,6 +273,7 @@
;; `setup/dirs`
(provide config:bin-dir
config:gui-bin-dir
config:config-tethered-console-bin-dir
config:config-tethered-gui-bin-dir)