~ chicken-core (chicken-5) c6e57fa85d702b6e3db182128cec81d238b1e0cd
commit c6e57fa85d702b6e3db182128cec81d238b1e0cd Author: felix <felix@call-with-current-continuation.org> AuthorDate: Fri Feb 19 11:36:40 2010 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Fri Feb 19 11:36:40 2010 +0100 various changes regarding deployment for csc and chicken-install diff --git a/CHICKEN.icns b/CHICKEN.icns new file mode 100644 index 00000000..8203c7da Binary files /dev/null and b/CHICKEN.icns differ diff --git a/chicken-install.scm b/chicken-install.scm index 933a44e2..961edc4e 100644 --- a/chicken-install.scm +++ b/chicken-install.scm @@ -84,6 +84,7 @@ (define *proxy-port* #f) (define *running-test* #f) (define *mappings* '()) + (define *deploy* #f) (define-constant +module-db+ "modules.db") (define-constant +defaults-file+ "setup.defaults") @@ -200,6 +201,7 @@ (define *eggs+dirs+vers* '()) (define *dependencies* '()) (define *checked* '()) + (define *csi* (shellpath (make-pathname *program-path* (foreign-value "C_CSI_PROGRAM" c-string)))) @@ -333,6 +335,7 @@ (if (and *no-install* (not dep?)) " -e \"(setup-install-mode #f)\"" "") (if *host-extension* " -e \"(host-extension #t)\"" "") (if *prefix* (sprintf " -e \"(installation-prefix \\\"~a\\\")\"" *prefix*) "") + (if *deploy* " -e \"(deployment-mode #t)\"" "") #\space (shellpath (make-pathname (cadr e+d+v) (car e+d+v) "setup"))) ) @@ -468,6 +471,7 @@ usage: chicken-install [OPTION | EXTENSION[:VERSION]] ... -i -init DIRECTORY initialize empty alternative repository -u -update-db update export database -repository print path used for egg installation + -deploy build extensions for deployment EOF );| (exit code)) @@ -564,6 +568,9 @@ EOF (string=? "-host-extension" arg)) ; DEPRECATED (set! *host-extension* #t) (loop (cdr args) eggs)) + ((string=? "-deploy" arg) + (set! *deploy* #t) + (loop (cdr args) eggs)) ((string=? "-username" arg) (unless (pair? (cdr args)) (usage 1)) (set! *username* (cadr args)) diff --git a/csc.scm b/csc.scm index 62c4b8b4..a4399fa6 100644 --- a/csc.scm +++ b/csc.scm @@ -62,8 +62,10 @@ (define mingw (eq? (build-platform) 'mingw32)) (define msvc (eq? (build-platform) 'msvc)) (define osx (eq? (software-version) 'macosx)) -(define hpux-hppa (and (eq? (software-version) 'hpux) - (eq? (machine-type) 'hppa))) +(define win (or mingw msvc)) + +(define elf + (memq (software-version) '(linux freebsd netbsd openbsd dragonfly solaris))) (define (quit msg . args) (fprintf (current-error-port) "~a: ~?~%" CSC_PROGRAM msg args) @@ -182,6 +184,8 @@ (define show-libs #f) (define dry-run #f) (define gui #f) +(define deploy #f) +(define shared-deploy #f) (define extra-libraries (if host-mode @@ -253,18 +257,22 @@ TARGET_LIB_HOME)) ) (define link-options '()) -(define builtin-link-options - (cond ((or osx hpux-hppa mingw) - (list (conc "-L\"" library-dir "\""))) - (else + +(define (builtin-link-options) + (cond (elf (list (conc "-L\"" library-dir "\"") - (conc " -Wl,-R\"" (prefix "" "lib" - (if host-mode - INSTALL_LIB_HOME - TARGET_RUN_LIB_HOME)) - "\"")) ) ) ) - + (conc " -Wl,-R\"" + (if (or deploy shared-deploy) + "\\$ORIGIN" + (prefix "" "lib" + (if host-mode + INSTALL_LIB_HOME + TARGET_RUN_LIB_HOME))) + "\"")) ) + (else + (list (conc "-L\"" library-dir "\""))))) + (define target-filename #f) (define verbose #f) (define keep-files #f) @@ -408,6 +416,7 @@ Usage: ~a FILENAME | OPTION ... code -dll -library compile multiple units into a dynamic library + -deploy deploy self-contained application bundle Options to other passes: @@ -500,11 +509,16 @@ EOF (else "-shared")) link-options)) (set! shared #t) ) + (define (use-private-repository) + (set! compile-options (cons "-DC_PRIVATE_REPOSITORY" compile-options)) + (when osx + (set! link-options (cons "-framework CoreFoundation" link-options)))) + (let loop ([args args]) (cond [(null? args) ;; Builtin search directory options do not override explict options (set! compile-options (append compile-options builtin-compile-options)) - (set! link-options (append link-options builtin-link-options)) + (set! link-options (append link-options (builtin-link-options))) ;; (when inquiry-only (when show-cflags (print* (compiler-options) #\space)) @@ -534,16 +548,23 @@ EOF (pathname-replace-extension (first scheme-files) shared-library-extension) (pathname-replace-extension (first scheme-files) executable-extension) ) ) ) (run-translation) ] ) + (when deploy + (cond (shared + (set! deploy #f) + (set! shared-deploy #t)) + (else (use-private-repository)))) (unless translate-only (run-compilation) (unless compile-only (when (member target-filename scheme-files) (printf "Warning: output file will overwrite source file `~A' - renaming source to `~A.old'~%" target-filename target-filename) - (command "~A ~A ~A" - (if windows-shell "move" "mv") - (quotewrap target-filename) - (quotewrap (string-append target-filename ".old")))) + (command + (sprintf + "~A ~A ~A" + (if windows-shell "move" "mv") + (quotewrap target-filename) + (quotewrap (string-append target-filename ".old"))))) (run-linking)) ) ] [else (let* ([arg (car args)] @@ -617,9 +638,7 @@ EOF (t-options "-static-extension" (car rest)) (set! rest (cdr rest)) ] ((-private-repository) - (set! compile-options (cons "-DC_PRIVATE_REPOSITORY" compile-options)) - (when osx - (set! link-options (cons "-framework CoreFoundation" link-options)))) + (use-private-repository)) [(-gui -windows |-W|) ;DEPRECATED (set! gui #t) @@ -633,6 +652,8 @@ EOF (msvc (set! link-options (cons* "kernel32.lib" "user32.lib" "gdi32.lib" link-options)))))] + ((-deploy) + (set! deploy #t)) [(-framework) (check s rest) (when osx @@ -831,17 +852,35 @@ EOF ;;; Link object files and libraries: (define (run-linking) - (let ((files (map quotewrap - (append object-files - (nth-value 0 (static-extension-info)) ) ) ) - (target (quotewrap target-filename))) + (let* ((files (map quotewrap + (append object-files + (nth-value 0 (static-extension-info)) ) ) ) + (target (quotewrap target-filename)) + (targetdir #f)) + (when deploy + (set! targetdir (pathname-strip-extension target-filename)) + (when osx + (set! targetdir (make-pathname #f targetdir "app")) + (command + (sprintf "mkdir -p ~a" + (quotewrap (make-pathname targetdir "{Contents/MacOS,Contents/Resources}"))))) + (set! target-filename + (make-pathname + targetdir + (if osx + (string-append "Contents/MaCOS/" (pathname-file target-filename)) + (pathname-file target-filename)))) + (set! target (quotewrap target-filename)) + (unless (directory-exists? targetdir) + (print "creating " targetdir) + (create-directory targetdir))) (command (string-intersperse (cons* (cond (cpp-mode c++-linker) (else linker) ) (append files - (list (string-append link-output-flag target) + (list (string-append link-output-flag (quotewrap target-filename)) (linker-options) (linker-libraries #f) ) ) ) ) ) (when (and osx (or (not cross-chicken) host-mode)) @@ -849,17 +888,53 @@ EOF (string-append "install_name_tool -change lib" (if unsafe-libraries "u" "") "chicken.dylib " (quotewrap - (make-pathname - (prefix "" "lib" - (if host-mode - INSTALL_LIB_HOME - TARGET_RUN_LIB_HOME)) - (if unsafe-libraries "libuchicken.dylib" "libchicken.dylib")) ) + (let ((lib (if unsafe-libraries "libuchicken.dylib" "libchicken.dylib")) ) + (if (or shared-deploy deploy) + (make-pathname "@executable_path" lib) + (make-pathname + (lib-path) + lib)))) " " target) ) - (when gui (rez target))) + (when (and gui (not deploy)) + (rez target))) + (when deploy + (copy-libraries targetdir) + (when osx + (create-mac-bundle + (pathname-file target-filename) + targetdir))) (unless keep-files (for-each $delete-file generated-object-files)) ) ) +(define (lib-path) + (prefix "" + "lib" + (if win + INSTALL_BIN_HOME + (if host-mode + INSTALL_LIB_HOME + TARGET_RUN_LIB_HOME)))) + +(define (copy-libraries targetdir) + (let ((lib (make-pathname + (lib-path) + (if unsafe-libraries + "libuchicken" + "libchicken") + (cond (osx "dylib") + (win "dll") + (else "so"))))) + (copy-files lib targetdir))) + +(define (copy-files from to) + (command + (sprintf "~a ~a ~a" + (if windows-shell + "copy /Y" + "cp") + (quotewrap from) + (quotewrap to)))) + (define (static-extension-info) (let ((rpath (repository-path))) (if (and rpath (pair? static-extensions)) @@ -936,8 +1011,8 @@ EOF (if (zero? raw-exit-code) 0 1)) last-exit-code))) -(define (command fstr . args) - (unless (zero? (apply $system fstr args)) +(define (command str) + (unless (zero? ($system str)) (exit last-exit-code))) (define ($delete-file str) @@ -948,22 +1023,37 @@ EOF (define (rez file) ;; see also: http://www.cocan.org/getting_started_with_ocaml_on_mac_os_x (command - "/Developer/Tools/Rez -t APPL -o ~a ~a" - (quotewrap file) - (quotewrap (make-pathname home "mac.r")))) + (sprintf "/Developer/Tools/Rez -t APPL -o ~a ~a" + (quotewrap file) + (quotewrap (make-pathname home "mac.r"))))) (define (create-mac-bundle prg dname) - (let ((d (make-pathname dname "Contents/MacOS"))) - (command "mkdir -p ~a" (qs (normalize-pathname d))) - (let ((pl (make-pathname d "Info.plist"))) + (let* ((d0 (make-pathname dname "Contents")) + (d (make-pathname dname "Contents/MacOS")) + (d2 (make-pathname dname "Contents/Resources"))) + (let ((icons (make-pathname d2 "CHICKEN.icns"))) + (unless (file-exists? icons) + (copy-files + (make-pathname home "CHICKEN.icns") + d2))) + (let ((pl (make-pathname d0 "Info.plist"))) (unless (file-exists? pl) (with-output-to-file pl (cut print #<#EOF <?xml version="1.0" encoding="UTF-8"?> -<plist version="1.0"> +<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd"> +<plist version="0.9"> <dict> - <key>CFBundleExecutable</key> - <string>#{prg}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleIconFile</key> + <string>CHICKEN.icns</string> + <key>CFBundleGetInfoString</key> + <string>Created by CHICKEN</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleExecutable</key> + <string>#{prg}</string> </dict> </plist> EOF diff --git a/distribution/manifest b/distribution/manifest index 1636235e..712cb5e0 100644 --- a/distribution/manifest +++ b/distribution/manifest @@ -262,6 +262,7 @@ setup-api.import.c setup-download.import.c types.db mac.r +CHICKEN.icns manual/Accessing external objects manual/Acknowledgements manual/Basic mode of operation diff --git a/rules.make b/rules.make index 0f0cabe4..0faceadc 100644 --- a/rules.make +++ b/rules.make @@ -964,6 +964,9 @@ install-setup-files: $(INSTALL_PROGRAM) $(INSTALL_PROGRAM_FILE_OPTIONS) $(SRCDIR)setup.defaults "$(DESTDIR)$(IDATADIR)" $(INSTALL_PROGRAM) $(INSTALL_PROGRAM_EXECUTABLE_OPTIONS) setup-api.so "$(DESTDIR)$(IEGGDIR)" $(INSTALL_PROGRAM) $(INSTALL_PROGRAM_EXECUTABLE_OPTIONS) setup-download.so "$(DESTDIR)$(IEGGDIR)" +ifeq ($(PLATFORM),macosx) + $(INSTALL_PROGRAM) $(INSTALL_PROGRAM_FILE_OPTIONS) $(SRCDIR)CHICKEN.icns "$(DESTDIR)$(IDATADIR)" +endif uninstall: $(REMOVE_COMMAND) $(REMOVE_COMMAND_OPTIONS) "$(DESTDIR)$(IBINDIR)$(SEP)$(CHICKEN_PROGRAM)$(EXE)" \ diff --git a/setup-api.scm b/setup-api.scm index 9802b2e9..85e8e03e 100644 --- a/setup-api.scm +++ b/setup-api.scm @@ -43,7 +43,7 @@ make make/proc host-extension install-extension install-program install-script - setup-verbose-mode setup-install-mode + setup-verbose-mode setup-install-mode deployment-mode installation-prefix chicken-prefix ;XXX remove at some stage from exports find-library find-header @@ -113,6 +113,7 @@ (define setup-root-directory (make-parameter *base-directory*)) (define setup-verbose-mode (make-parameter #f)) (define setup-install-mode (make-parameter #t)) +(define deployment-mode (make-parameter #f)) (define program-path (make-parameter *chicken-bin-path*)) (define keep-intermediates (make-parameter #f)) @@ -219,6 +220,7 @@ "" "-setup-mode") (if (keep-intermediates) "-k" "") (if (host-extension) "-host" "") + (if (deployment-mode) "-deploy" "") *csc-options*) " ") ) ((assoc prg *installed-executables*) =>Trap