~ chicken-core (chicken-5) 273399bbd1ff54d0eab5334bc7fa072f35de8d6c
commit 273399bbd1ff54d0eab5334bc7fa072f35de8d6c Author: felix <felix@call-with-current-continuation.org> AuthorDate: Thu Feb 11 15:13:57 2010 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Thu Feb 11 15:13:57 2010 +0100 started support for direct creation of Mac gui apps with csc diff --git a/chicken.h b/chicken.h index b541d871..bae4e99f 100644 --- a/chicken.h +++ b/chicken.h @@ -325,10 +325,12 @@ typedef unsigned __int64 uint64_t; /* Have a GUI? */ -#if defined(C_WINDOWS_GUI) -# include <windows.h> -# ifndef WINAPI -# define WINAPI +#if defined(C_WINDOWS_GUI) || defined(C_GUI) +# ifdef _WIN32 +# include <windows.h> +# ifndef WINAPI +# define WINAPI +# endif # endif #else # define C_GENERIC_CONSOLE @@ -1306,9 +1308,7 @@ extern double trunc(double); #define C_gui_nongui_marker #if !defined(C_EMBEDDED) && !defined(C_SHARED) -# ifndef C_WINDOWS_GUI -# define C_main_entry_point int main(int argc, char *argv[]) { return CHICKEN_main(argc, argv, (void*)C_toplevel); } C_end_of_main -# else +# if (defined(C_WINDOWS_GUI) || defined(C_GUI)) && defined(_WIN32) # define C_main_entry_point \ int WINAPI WinMain(HINSTANCE me, HINSTANCE you, LPSTR cmdline, int show) \ { \ @@ -1316,6 +1316,8 @@ extern double trunc(double); return CHICKEN_main(0, NULL, (void *)C_toplevel); \ } \ C_end_of_main +# else +# define C_main_entry_point int main(int argc, char *argv[]) { return CHICKEN_main(argc, argv, (void*)C_toplevel); } C_end_of_main # endif #else # define C_main_entry_point diff --git a/csc.scm b/csc.scm index 51c73299..d4187989 100644 --- a/csc.scm +++ b/csc.scm @@ -118,8 +118,6 @@ (if msvc "libuchicken-static." "libuchicken.") library-extension)) -(define cleanup-filename quotewrap) - (define default-compilation-optimization-options (string-split (if host-mode INSTALL_CFLAGS TARGET_CFLAGS))) (define best-compilation-optimization-options default-compilation-optimization-options) (define default-linking-optimization-options (string-split (if host-mode INSTALL_LDFLAGS TARGET_LDFLAGS))) @@ -183,6 +181,7 @@ (define show-ldflags #f) (define show-libs #f) (define dry-run #f) +(define gui #f) (define extra-libraries (if host-mode @@ -540,11 +539,10 @@ EOF (when (member target-filename scheme-files) (printf "Warning: output file will overwrite source file `~A' - renaming source to `~A.old'~%" target-filename target-filename) - (unless (zero? ($system (sprintf "~A ~A ~A" - (if windows-shell "move" "mv") - (quotewrap target-filename) - (quotewrap (string-append target-filename ".old"))))) - (exit last-exit-code) ) ) + (command "~A ~A ~A" + (if windows-shell "move" "mv") + (quotewrap target-filename) + (quotewrap (string-append target-filename ".old")))) (run-linking)) ) ] [else (let* ([arg (car args)] @@ -619,17 +617,18 @@ EOF (set! rest (cdr rest)) ] [(-gui -windows |-W|) ;DEPRECATED + (set! gui #t) (when (or msvc mingw) (cond (mingw (set! link-options (cons* "-lkernel32" "-luser32" "-lgdi32" "-mwindows" link-options)) - (set! compile-options (cons "-DC_WINDOWS_GUI" compile-options))) + (set! compile-options (cons "-DC_GUI" compile-options))) (msvc (set! link-options (cons* "kernel32.lib" "user32.lib" "gdi32.lib" link-options)) - (set! compile-options (cons "-DC_WINDOWS_GUI" compile-options)))) ) ] + (set! compile-options (cons "-DC_GUI" compile-options)))) ) ] [(-framework) (check s rest) (when osx @@ -780,17 +779,15 @@ EOF (cond (cpp-mode "cpp") (objc-mode "m") (else "c") ) ) ] ) - (unless (zero? - ($system - (string-intersperse - (cons* translator (cleanup-filename f) - (append - (if to-stdout - '("-to-stdout") - `("-output-file" ,(cleanup-filename fc)) ) - (map quote-option (append translate-options translation-optimization-options)) ) ) - " ") ) ) - (exit last-exit-code) ) + (command + (string-intersperse + (cons* translator (quotewrap f) + (append + (if to-stdout + '("-to-stdout") + `("-output-file" ,(quotewrap fc)) ) + (map quote-option (append translate-options translation-optimization-options)) ) ) + " ") ) (set! c-files (append (list fc) c-files)) (set! generated-c-files (append (list fc) generated-c-files)))) scheme-files) @@ -804,16 +801,14 @@ EOF (for-each (lambda (f) (let ([fo (pathname-replace-extension f object-extension)]) - (unless (zero? - ($system - (string-intersperse - (list (cond (cpp-mode c++-compiler) - (else compiler) ) - (cleanup-filename f) - (string-append compile-output-flag (cleanup-filename fo)) - compile-only-flag - (compiler-options) ) ) ) ) - (exit last-exit-code) ) + (command + (string-intersperse + (list (cond (cpp-mode c++-compiler) + (else compiler) ) + (quotewrap f) + (string-append compile-output-flag (quotewrap fo)) + compile-only-flag + (compiler-options) ) ) ) (set! generated-object-files (cons fo generated-object-files)) (set! ofiles (cons fo ofiles)))) c-files) @@ -832,35 +827,33 @@ EOF ;;; Link object files and libraries: (define (run-linking) - (let ((files (map cleanup-filename + (let ((files (map quotewrap (append object-files (nth-value 0 (static-extension-info)) ) ) ) - (target (cleanup-filename target-filename))) - (unless (zero? - ($system - (string-intersperse - (cons* (cond (cpp-mode c++-linker) - (else linker) ) - (append - files - (list (string-append link-output-flag target) - (linker-options) - (linker-libraries #f) ) ) ) ) ) ) - (exit last-exit-code) ) + (target (quotewrap target-filename))) + (command + (string-intersperse + (cons* (cond (cpp-mode c++-linker) + (else linker) ) + (append + files + (list (string-append link-output-flag target) + (linker-options) + (linker-libraries #f) ) ) ) ) ) (when (and osx (or (not cross-chicken) host-mode)) - (unless (zero? ($system - (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")) ) - " " - target) ) ) - (exit last-exit-code) ) ) + (command + (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")) ) + " " + target) ) + (when gui (rez target))) (unless keep-files (for-each $delete-file generated-object-files)) ) ) (define (static-extension-info) @@ -939,12 +932,50 @@ EOF (if (zero? raw-exit-code) 0 1)) last-exit-code))) +(define (command fstr . args) + (unless (zero? (apply $system fstr args)) + (exit last-exit-code))) + (define ($delete-file str) (when verbose (print "rm " str) ) (unless dry-run (delete-file str) )) +(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")))) + +(define (create-mac-bundle prg dname) + (unless (directory-exists? dname) + (create-directory dname)) + (let ((d (make-pathname dname "Contents"))) + (unless (directory-exists? d) + (create-directory d)) + (let ((d (make-pathname d "MacOS"))) + (unless (directory-exists? d) + (create-directory d)) + (let ((pl (make-pathname d "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"> +<dict> + <key>CFBundleExecutable</key> + <string>#{prg}</string> +</dict> +</plist> +EOF +))) + d)))) + ;;; Run it: -(run (append (string-split (or (get-environment-variable "CSC_OPTIONS") "")) arguments)) +(run + (append + (string-split (or (get-environment-variable "CSC_OPTIONS") "")) + arguments)) diff --git a/distribution/manifest b/distribution/manifest index 7d554159..fe2da1e1 100644 --- a/distribution/manifest +++ b/distribution/manifest @@ -259,6 +259,7 @@ setup-api.c setup-api.import.c setup-download.import.c types.db +mac.r manual/Accessing external objects manual/Acknowledgements manual/Basic mode of operation diff --git a/mac.r b/mac.r new file mode 100644 index 00000000..3d71f2eb --- /dev/null +++ b/mac.r @@ -0,0 +1,13 @@ +data 'MBAR' (128) { + $"0001 0080" /* ...€ */ +}; + +data 'MENU' (128, "Apple") { + $"0080 0000 0000 0000 0000 FFFF FFFB 0114" /* .€........ÿÿÿû.. */ + $"0A41 626F 7574 2046 4C54 4B00 0000 0001" /* ÂAbout FLTK..... */ + $"2D00 0000 0000" /* -..... */ +}; + +data 'carb' (0) { +}; + diff --git a/rules.make b/rules.make index 10b9c01a..0f0cabe4 100644 --- a/rules.make +++ b/rules.make @@ -905,6 +905,9 @@ ifdef WINDOWS_SHELL endif $(INSTALL_PROGRAM) $(INSTALL_PROGRAM_FILE_OPTIONS) $(SRCDIR)types.db "$(DESTDIR)$(IEGGDIR)" endif +ifeq ($(PLATFORM),macosx) + $(INSTALL_PROGRAM) $(INSTALL_PROGRAM_FILE_OPTIONS) $(SRCDIR)mac.r "$(DESTDIR)$(ISHAREDIR)" +endif ifdef STATICBUILD # copy/xcopy is too dumb on WindowsTrap