diff --git a/racket/src/cs/c/Makefile.in b/racket/src/cs/c/Makefile.in index b047b0bc8a..b0b2645453 100644 --- a/racket/src/cs/c/Makefile.in +++ b/racket/src/cs/c/Makefile.in @@ -110,16 +110,19 @@ $(SCHEME_BIN): cd @SCHEME_SRC@ && ./configure @SCHEME_CONFIG_ARGS@ cd @SCHEME_SRC@ && make +racket.boot: racket.so + $(SCHEME) --script $(srcdir)/convert-to-boot.ss @COMPRESS_COMP@ racket.so racket.boot + # ---------------------------------------- # Unix EMBED_DEPS = $(srcdir)/embed-boot.rkt racketcs@NOT_OSX@: raw_racketcs racket.so $(EMBED_DEPS) - $(RACKET) $(srcdir)/embed-boot.rkt @COMPRESS_COMP@ raw_racketcs racketcs $(SCHEME_INC) racket.so + $(RACKET) $(srcdir)/embed-boot.rkt @COMPRESS_COMP@ raw_racketcs racketcs $(SCHEME_INC) racket.boot gracketcs@NOT_OSX@: raw_gracketcs racket.so $(EMBED_DEPS) - $(RACKET) $(srcdir)/embed-boot.rkt @COMPRESS_COMP@ raw_gracketcs gracketcs $(SCHEME_INC) racket.so + $(RACKET) $(srcdir)/embed-boot.rkt @COMPRESS_COMP@ raw_gracketcs gracketcs $(SCHEME_INC) racket.boot BOOT_OBJS = boot.o $(SCHEME_INC)/kernel.o rktio/librktio.a @@ -152,7 +155,7 @@ $(GRACKET_BIN): grmain.o $(RKTFW) $(GRAPPSKEL) $(GRAPPSKEL): $(srcdir)/../../mac/osx_appl.rkt $(srcdir)/../../racket/src/schvers.h $(srcdir)/../../mac/icon/GRacket.icns env $(RACKET) $(srcdir)/../../mac/osx_appl.rkt $(srcdir)/../.. "CS" -BOOT_FILES = $(SCHEME_INC)/petite.boot $(SCHEME_INC)/scheme.boot racket.so +BOOT_FILES = $(SCHEME_INC)/petite.boot $(SCHEME_INC)/scheme.boot racket.boot FW_BOOT_DEST = Racket.framework/Versions/$(FWVERSION)_CS/boot $(RKTFW): $(BOOT_OBJS) $(BOOT_FILES) @@ -162,8 +165,8 @@ $(RKTFW): $(BOOT_OBJS) $(BOOT_FILES) ln -s Versions/$(FWVERSION)_CS/Racket Racket.framework/Racket mkdir -p Racket.framework/Versions/$(FWVERSION)_CS/boot cp $(SCHEME_INC)/petite.boot $(SCHEME_INC)/scheme.boot $(FW_BOOT_DEST) - cp racket.so $(FW_BOOT_DEST) - $(RACKET) $(srcdir)/adjust-compress.rkt @COMPRESS_COMP@ $(FW_BOOT_DEST)/petite.boot $(FW_BOOT_DEST)/scheme.boot $(FW_BOOT_DEST)/racket.so + cp racket.boot $(FW_BOOT_DEST) + $(RACKET) $(srcdir)/adjust-compress.rkt @COMPRESS_COMP@ $(FW_BOOT_DEST)/petite.boot $(FW_BOOT_DEST)/scheme.boot $(FW_BOOT_DEST)/racket.boot # ---------------------------------------- # Common @@ -222,7 +225,7 @@ macos-install: mkdir -p $(DESTDIR)"$(RKTFWDEST)/Versions/$(FWVERSION)_CS/boot" cp $(RKTFWDIR)/boot/petite.boot $(DESTDIR)$(RKTFWDEST)/Versions/$(FWVERSION)_CS/boot/ cp $(RKTFWDIR)/boot/scheme.boot $(DESTDIR)$(RKTFWDEST)/Versions/$(FWVERSION)_CS/boot/ - cp $(RKTFWDIR)/boot/racket.so $(DESTDIR)$(RKTFWDEST)/Versions/$(FWVERSION)_CS/boot/ + cp $(RKTFWDIR)/boot/racket.boot $(DESTDIR)$(RKTFWDEST)/Versions/$(FWVERSION)_CS/boot/ /usr/bin/install_name_tool -change "@executable_path/Racket.framework/Versions/$(FWVERSION)_CS/Racket" "@FRAMEWORK_PREFIX@Racket.framework/Versions/$(FWVERSION)_CS/Racket" $(DESTDIR)"$(bindir)/racket$(CS_GR_INSTALLED)" rm -rf $(DESTDIR)"$(libpltdir)/GRacket$(CS_GR_INSTALLED).app" $(ICP) -r "GRacketCS.app" $(DESTDIR)"$(libpltdir)/GRacket$(CS_GR_INSTALLED).app" diff --git a/racket/src/cs/c/boot.c b/racket/src/cs/c/boot.c index dee4e0cb9a..67c2d3a15d 100644 --- a/racket/src/cs/c/boot.c +++ b/racket/src/cs/c/boot.c @@ -9,6 +9,8 @@ #include "rktio.h" #include "boot.h" +#define RACKET_AS_BOOT + #if defined(_MSC_VER) || defined(__MINGW32__) # define BOOT_O_BINARY O_BINARY #endif @@ -70,13 +72,21 @@ static void racket_exit(int v) exit(v); } +static void init_foreign() +{ +# include "rktio.inc" + Sforeign_symbol("racket_exit", (void *)racket_exit); +} + void racket_boot(int argc, char **argv, char *self, long segment_offset, char *coldir, char *configdir, int pos1, int pos2, int pos3, int is_gui) /* exe argument already stripped from argv */ { - int fd; +#if !defined(RACKET_USE_FRAMEWORK) || !defined(RACKET_AS_BOOT) + int fd; +#endif #ifdef RACKET_USE_FRAMEWORK const char *fw_path; #endif @@ -87,6 +97,9 @@ void racket_boot(int argc, char **argv, char *self, long segment_offset, fw_path = get_framework_path(); Sregister_boot_file(path_append(fw_path, "petite.boot")); Sregister_boot_file(path_append(fw_path, "scheme.boot")); +# ifdef RACKET_AS_BOOT + Sregister_boot_file(path_append(fw_path, "racket.boot")); +# endif #else fd = open(self, O_RDONLY | BOOT_O_BINARY); @@ -100,13 +113,16 @@ void racket_boot(int argc, char **argv, char *self, long segment_offset, fd2 = open(self, O_RDONLY | BOOT_O_BINARY); lseek(fd2, pos2, SEEK_SET); Sregister_boot_file_fd("scheme", fd2); + +# ifdef RACKET_AS_BOOT + fd = open(self, O_RDONLY | BOOT_O_BINARY); + lseek(fd, pos3, SEEK_SET); + Sregister_boot_file_fd("racket", fd); +# endif } #endif - - Sbuild_heap(NULL, NULL); -# include "rktio.inc" - Sforeign_symbol("racket_exit", (void *)racket_exit); + Sbuild_heap(NULL, init_foreign); { ptr l = Snil; @@ -122,13 +138,25 @@ void racket_boot(int argc, char **argv, char *self, long segment_offset, l = Scons(Sbytevector(configdir), l); l = Scons(Sbytevector(coldir), l); l = Scons(Sbytevector(self), l); + +#ifdef RACKET_AS_BOOT + { + ptr c, start, apply; + c = Stop_level_value(Sstring_to_symbol("scheme-start")); + start = Scall0(c); + apply = Stop_level_value(Sstring_to_symbol("apply")); + Scall2(apply, start, l); + } +#else Sset_top_level_value(Sstring_to_symbol("bytes-command-line-arguments"), l); +#endif } -#ifdef RACKET_USE_FRAMEWORK +#ifndef RACKET_AS_BOOT +# ifdef RACKET_USE_FRAMEWORK fd = open(path_append(fw_path, "racket.so"), O_RDONLY); pos3 = 0; -#endif +# endif { ptr c, p; @@ -143,4 +171,5 @@ void racket_boot(int argc, char **argv, char *self, long segment_offset, c = Stop_level_value(Sstring_to_symbol("load-compiled-from-port")); Scall1(c, p); } +#endif } diff --git a/racket/src/cs/c/convert-to-boot.ss b/racket/src/cs/c/convert-to-boot.ss new file mode 100644 index 0000000000..14373b438e --- /dev/null +++ b/racket/src/cs/c/convert-to-boot.ss @@ -0,0 +1,17 @@ +(compile-compressed #f) + +(define-values (src dest) + (let loop ([args (command-line-arguments)]) + (cond + [(and (pair? args) + (equal? (car args) "--compress")) + (compile-compressed #t) + (loop (cdr args))] + [(null? args) + (error 'convert-to-boot "missing file arguments")] + [(and (pair? (cdr args)) (null? (cddr args))) + (values (car args) (cadr args))] + [else + (error 'convert-to-boot "extra arguments after files")]))) + +(make-boot-file dest '("petite" "scheme") src) diff --git a/racket/src/cs/c/embed-boot.rkt b/racket/src/cs/c/embed-boot.rkt index 90eff99c74..2524c3132c 100644 --- a/racket/src/cs/c/embed-boot.rkt +++ b/racket/src/cs/c/embed-boot.rkt @@ -9,11 +9,11 @@ #:once-each [("--compress") "Leave compiled code files as compressed" (enable-compress!)] - #:args (src-file dest-file boot-dir racket.so) + #:args (src-file dest-file boot-dir racket.boot) (define bstr1 (adjust-compress (file->bytes (build-path boot-dir "petite.boot")))) (define bstr2 (adjust-compress (file->bytes (build-path boot-dir "scheme.boot")))) - (define bstr3 (adjust-compress (file->bytes racket.so))) + (define bstr3 (adjust-compress (file->bytes racket.boot))) (with-handlers ([exn? (lambda (x) (when (file-exists? dest-file) diff --git a/racket/src/cs/main.sps b/racket/src/cs/main.sps index 0d0da1366d..3a6a0e9556 100644 --- a/racket/src/cs/main.sps +++ b/racket/src/cs/main.sps @@ -42,7 +42,13 @@ (define-syntax seq (syntax-rules () [(_ expr ...) (define dummy (let () expr ... (void)))])) - (define (run the-command-line-arguments) + (define (run the-command-line-arguments/maybe-bytes) + (define the-command-line-arguments + (map (lambda (s) (if (bytes? s) + (bytes->string/locale s #\?) + s)) + the-command-line-arguments/maybe-bytes)) + (seq (unless (>= (length the-command-line-arguments) 5) (error 'racket "expected `self`, `collects`, and `libs` paths plus `segment-offset` and `is-gui?` to start")) @@ -518,8 +524,7 @@ (define the-command-line-arguments (or (and (top-level-bound? 'bytes-command-line-arguments) - (map (lambda (s) (bytes->string/locale s #\?)) - (top-level-value 'bytes-command-line-arguments))) + (top-level-value 'bytes-command-line-arguments)) (command-line-arguments))) (if (null? the-command-line-arguments) diff --git a/racket/src/cs/racket.boot b/racket/src/cs/racket.boot new file mode 100644 index 0000000000..0f71e724bd Binary files /dev/null and b/racket/src/cs/racket.boot differ