diff --git a/collects/compiler/commands/exe.rkt b/collects/compiler/commands/exe.rkt index 28d53e2ace..0ac336f9a5 100644 --- a/collects/compiler/commands/exe.rkt +++ b/collects/compiler/commands/exe.rkt @@ -10,6 +10,7 @@ (define gui (make-parameter #f)) (define 3m (make-parameter #t)) +(define launcher (make-parameter #f)) (define exe-output (make-parameter #f)) (define exe-embedded-flags (make-parameter '("-U" "--"))) @@ -26,6 +27,8 @@ (exe-output file)] [("--gui") "Generate GUI executable" (gui #t)] + [("-l" "--launcher") "Generate a launcher" + (launcher #t)] [("--collects-path") path "Set as main collects for executable" (exe-embedded-collects-path path)] [("--collects-dest") dir "Write collection code to " @@ -70,27 +73,38 @@ (extract-base-filename/ss source-file (string->symbol (short-program+command-name)))) (gui))]) - (mzc:create-embedding-executable - dest - #:mred? (gui) - #:variant (if (3m) '3m 'cgc) - #:verbose? (very-verbose) - #:modules (cons `(#%mzc: (file ,source-file)) - (map (lambda (l) `(#t (lib ,l))) - (exe-embedded-libraries))) - #:configure-via-first-module? #t - #:literal-expression - (parameterize ([current-namespace (make-base-namespace)]) - (compile - `(namespace-require - '',(string->symbol - (format "#%mzc:~a" - (let-values ([(base name dir?) - (split-path source-file)]) - (path->bytes (path-replace-suffix name #"")))))))) - #:cmdline (exe-embedded-flags) - #:collects-path (exe-embedded-collects-path) - #:collects-dest (exe-embedded-collects-dest) - #:aux (exe-aux)) + (cond + [(launcher) + (parameterize ([current-launcher-variant (if (3m) '3m 'cgc)]) + ((if (gui) + make-gracket-launcher + make-racket-launcher) + (append (list "-t" (path->string (path->complete-path source-file))) + (exe-embedded-flags)) + dest + (exe-aux)))] + [else + (mzc:create-embedding-executable + dest + #:mred? (gui) + #:variant (if (3m) '3m 'cgc) + #:verbose? (very-verbose) + #:modules (cons `(#%mzc: (file ,source-file)) + (map (lambda (l) `(#t (lib ,l))) + (exe-embedded-libraries))) + #:configure-via-first-module? #t + #:literal-expression + (parameterize ([current-namespace (make-base-namespace)]) + (compile + `(namespace-require + '',(string->symbol + (format "#%mzc:~a" + (let-values ([(base name dir?) + (split-path source-file)]) + (path->bytes (path-replace-suffix name #"")))))))) + #:cmdline (exe-embedded-flags) + #:collects-path (exe-embedded-collects-path) + #:collects-dest (exe-embedded-collects-dest) + #:aux (exe-aux))]) (when (verbose) (printf " [output to \"~a\"]\n" dest))) diff --git a/collects/tests/racket/embed.rktl b/collects/tests/racket/embed.rktl index be92fb8b7b..79e882b036 100644 --- a/collects/tests/racket/embed.rktl +++ b/collects/tests/racket/embed.rktl @@ -6,6 +6,7 @@ (require compiler/embed mzlib/file mzlib/process + launcher compiler/distribute) (define (mk-dest-bin mred?) @@ -67,12 +68,9 @@ (test expect with-input-from-file (build-path (find-system-path 'temp-dir) "stdout") (lambda () (read-string 5000))))) -(define try-exe - (case-lambda - [(exe expect mred?) - (try-exe exe expect mred? void)] - [(exe expect mred? dist-hook . collects) - (try-one-exe exe expect mred?) +(define (try-exe exe expect mred? [dist-hook void] #:dist? [dist? #t] . collects) + (try-one-exe exe expect mred?) + (when dist? ;; Build a distirbution directory, and try that, too: (printf " ... from distribution ...\n") (when (directory-exists? dist-dir) @@ -84,7 +82,7 @@ dist-mred-exe dist-mz-exe)) expect mred?) - (delete-directory/files dist-dir)])) + (delete-directory/files dist-dir))) (define (base-compile e) (parameterize ([current-namespace (make-base-namespace)]) @@ -109,6 +107,13 @@ `(,(flags "l") ,(string-append "tests/racket/" filename))) (try-exe dest expect mred?) + ;; As a launcher: + (prepare dest filename) + ((if mred? make-gracket-launcher make-racket-launcher) + (list "-l" (string-append "tests/racket/" filename)) + dest) + (try-exe dest expect mred? #:dist? #f) + ;; Try explicit prefix: (printf ">>>explicit prefix\n") (let ([w/prefix @@ -250,16 +255,38 @@ `("-l" "tests/racket/embed-me5.rkt")) (try-exe mr-dest "This is 5: #\n" #t))) -;; Try the mzc interface: +;; Try the raco interface: (require setup/dirs mzlib/file) (define mzc (build-path (find-console-bin-dir) (if (eq? 'windows (system-type)) "mzc.exe" "mzc"))) +(define raco (build-path (find-console-bin-dir) (if (eq? 'windows (system-type)) + "raco.exe" + "raco"))) (define (mzc-tests mred?) (parameterize ([current-directory (find-system-path 'temp-dir)]) + ;; raco exe + (system* raco + "exe" + "-o" (path->string (mk-dest mred?)) + (if mred? "--gui" "--") + (path->string (build-path (collection-path "tests" "racket") "embed-me1.rkt"))) + (try-exe (mk-dest mred?) "This is 1\n" mred?) + + ;;raco exe --launcher + (system* raco + "exe" + "--launcher" + "-o" (path->string (mk-dest mred?)) + (if mred? "--gui" "--") + (path->string (build-path (collection-path "tests" "racket") "embed-me1.rkt"))) + (try-exe (mk-dest mred?) "This is 1\n" mred? #:dist? #f) + + ;; the rest use mzc... + (system* mzc (if mred? "--gui-exe" "--exe") (path->string (mk-dest mred?))