raco exe: add --config-path option, default to "etc"

Make executables created by `raco exe` not refer to the original
configuration directory by default, but add an option for setting
the directory.

For Unix ELF executables, fix `raco exe` to set/preserve the
configuration directory.

Merge to v6.0

original commit: 33b7d49b2e
This commit is contained in:
Matthew Flatt 2013-11-29 10:18:10 -07:00
parent b94fd95bbf
commit 88c3578e52
3 changed files with 68 additions and 38 deletions

View File

@ -16,6 +16,7 @@
(define exe-embedded-flags (make-parameter '("-U" "--"))) (define exe-embedded-flags (make-parameter '("-U" "--")))
(define exe-embedded-libraries (make-parameter null)) (define exe-embedded-libraries (make-parameter null))
(define exe-aux (make-parameter null)) (define exe-aux (make-parameter null))
(define exe-embedded-config-path (make-parameter "etc"))
(define exe-embedded-collects-path (make-parameter null)) (define exe-embedded-collects-path (make-parameter null))
(define exe-embedded-collects-dest (make-parameter #f)) (define exe-embedded-collects-dest (make-parameter #f))
@ -29,6 +30,8 @@
(gui #t)] (gui #t)]
[("-l" "--launcher") "Generate a launcher" [("-l" "--launcher") "Generate a launcher"
(launcher #t)] (launcher #t)]
[("--config-path") path "Set <path> as configuration directory for executable"
(exe-embedded-config-path path)]
[("--collects-path") path "Set <path> as main collects for executable" [("--collects-path") path "Set <path> as main collects for executable"
(exe-embedded-collects-path path)] (exe-embedded-collects-path path)]
[("--collects-dest") dir "Write collection code to <dir>" [("--collects-dest") dir "Write collection code to <dir>"
@ -133,6 +136,7 @@
#:cmdline (exe-embedded-flags) #:cmdline (exe-embedded-flags)
#:collects-path (exe-embedded-collects-path) #:collects-path (exe-embedded-collects-path)
#:collects-dest (exe-embedded-collects-dest) #:collects-dest (exe-embedded-collects-dest)
#:aux (exe-aux))]) #:aux (cons `(config-dir . ,(exe-embedded-config-path))
(exe-aux)))])
(when (verbose) (when (verbose)
(printf " [output to \"~a\"]\n" dest))) (printf " [output to \"~a\"]\n" dest)))

View File

@ -0,0 +1,8 @@
(module embed-me6b racket/base
(with-output-to-file "stdout"
(lambda ()
(printf "This is 6\n")
(with-handlers ([void (lambda (exn) (printf "no etc.ss\n"))])
(printf "~a\n" (and (dynamic-require 'racket/fixnum #f) #t))))
#:exists 'append))

View File

@ -363,46 +363,64 @@
(path->string (build-path (collection-path "tests" "compiler" "embed") "embed-me1.rkt"))) (path->string (build-path (collection-path "tests" "compiler" "embed") "embed-me1.rkt")))
(try-exe (mk-dest mred?) "This is 1\n" mred?) (try-exe (mk-dest mred?) "This is 1\n" mred?)
;; Check that etc.rkt isn't found if it's not included: (define (check-collection-path prog lib in-main?)
(printf ">>not included\n") ;; Check that etc.rkt isn't found if it's not included:
(system* mzc (printf ">>not included\n")
(if mred? "--gui-exe" "--exe") (system* mzc
(path->string (mk-dest mred?)) (if mred? "--gui-exe" "--exe")
(path->string (build-path (collection-path "tests" "compiler" "embed") "embed-me6.rkt"))) (path->string (mk-dest mred?))
(try-exe (mk-dest mred?) "This is 6\nno etc.ss\n" mred?) (path->string (build-path (collection-path "tests" "compiler" "embed") prog)))
(try-exe (mk-dest mred?) "This is 6\nno etc.ss\n" mred?)
;; And it is found if it is included: ;; And it is found if it is included:
(printf ">>included\n") (printf ">>included\n")
(system* mzc (system* mzc
(if mred? "--gui-exe" "--exe") (if mred? "--gui-exe" "--exe")
(path->string (mk-dest mred?)) (path->string (mk-dest mred?))
"++lib" "mzlib/etc.rkt" "++lib" lib
(path->string (build-path (collection-path "tests" "compiler" "embed") "embed-me6.rkt"))) (path->string (build-path (collection-path "tests" "compiler" "embed") prog)))
(try-exe (mk-dest mred?) "This is 6\n#t\n" mred?) (try-exe (mk-dest mred?) "This is 6\n#t\n" mred?)
;; Or, it's found if we set the collection path: ;; Or, it's found if we set the collection path and the config path (where the latter
(printf ">>set coll path\n") ;; finds links for packages):
(system* mzc (printf ">>set coll path\n")
(if mred? "--gui-exe" "--exe") (system* mzc
(path->string (mk-dest mred?)) (if mred? "--gui-exe" "--exe")
"--collects-path" (path->string (mk-dest mred?))
(path->string (find-collects-dir)) "--collects-path"
(path->string (build-path (collection-path "tests" "compiler" "embed") "embed-me6.rkt"))) (path->string (find-collects-dir))
;; Don't try a distribution for this one: (path->string (build-path (collection-path "tests" "compiler" "embed") prog)))
(try-one-exe (mk-dest mred?) "This is 6\n#t\n" mred?) ;; Don't try a distribution for this one:
(try-one-exe (mk-dest mred?) (if in-main? "This is 6\n#t\n" "This is 6\nno etc.ss\n") mred?)
;; Try --collects-dest mode ;; Or, it's found if we set the collection path and the config path (where the latter
(printf ">>--collects-dest\n") ;; finds links for packages):
(system* mzc (printf ">>set coll path plus config\n")
(if mred? "--gui-exe" "--exe") (system* mzc
(path->string (mk-dest mred?)) (if mred? "--gui-exe" "--exe")
"++lib" "mzlib/etc.rkt" (path->string (mk-dest mred?))
"--collects-dest" "cts" "--collects-path"
"--collects-path" "cts" (path->string (find-collects-dir))
(path->string (build-path (collection-path "tests" "compiler" "embed") "embed-me6.rkt"))) "--config-path"
(try-exe (mk-dest mred?) "This is 6\n#t\n" mred? void "cts") ; <- cts copied to distribution (path->string (find-config-dir))
(delete-directory/files "cts") (path->string (build-path (collection-path "tests" "compiler" "embed") prog)))
(test #f system* (mk-dest mred?)) ;; Don't try a distribution for this one:
(try-one-exe (mk-dest mred?) "This is 6\n#t\n" mred?)
;; Try --collects-dest mode
(printf ">>--collects-dest\n")
(system* mzc
(if mred? "--gui-exe" "--exe")
(path->string (mk-dest mred?))
"++lib" lib
"--collects-dest" "cts"
"--collects-path" "cts"
(path->string (build-path (collection-path "tests" "compiler" "embed") prog)))
(try-exe (mk-dest mred?) "This is 6\n#t\n" mred? void "cts") ; <- cts copied to distribution
(delete-directory/files "cts")
(test #f system* (mk-dest mred?)))
(check-collection-path "embed-me6b.rkt" "racket/fixnum.rkt" #t)
(check-collection-path "embed-me6.rkt" "mzlib/etc.rkt" #f)
(void))) (void)))