source: project/release/3/cmk/cmk.scm @ 12851

Last change on this file since 12851 was 12851, checked in by Ivan Raikov, 12 years ago

Some fixes to mingw build.

File size: 79.0 KB
Line 
1
2;;
3;; Chicken make file.
4;;
5;; Copyright 2008 The Chicken Team.
6;;
7;;  Redistribution and use in source and binary forms, with or without
8;;  modification, are permitted provided that the following
9;;  conditions are met:
10;;
11;;  Redistributions of source code must retain the above copyright
12;;  notice, this list of conditions and the following disclaimer.
13;;
14;;  Redistributions in binary form must reproduce the above copyright
15;;  notice, this list of conditions and the following disclaimer in
16;;  the documentation and/or other materials provided with the
17;;  distribution.
18;;
19;;  Neither the name of the author nor the names of its contributors
20;;  may be used to endorse or promote products derived from this
21;;  software without specific prior written permission.
22;;
23;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24;; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26;; FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27;; COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
28;; INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29;; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30;; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31;; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
32;; STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33;; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
34;; OF THE POSSIBILITY OF SUCH DAMAGE.
35;;
36;;
37
38(declare (run-time-macros)
39         (disable-interrupts)
40         (uses library eval extras )
41  (foreign-declare #<<EOF
42
43
44#include <errno.h>
45#include <stdio.h>
46
47#ifdef unix
48#include <unistd.h>
49#endif
50
51#ifdef WIN32
52#include <fcntl.h>
53#endif
54
55#include <sys/types.h>
56#include <sys/stat.h>
57
58#ifdef WIN32
59#define open_binary_input_pipe(a, n, name)   C_mpointer(a, _popen(C_c_string(name), "r"))
60#define open_binary_output_pipe(a, n, name)  C_mpointer(a, _popen(C_c_string(name), "w"))
61#define close_pipe(p)                        C_fix(_pclose(C_port_file(p)))
62#else
63#define open_binary_input_pipe(a, n, name)   C_mpointer(a, popen(C_c_string(name), "r"))
64#define open_binary_output_pipe(a, n, name)  C_mpointer(a, popen(C_c_string(name), "w"))
65#define close_pipe(p)                        C_fix(pclose(C_port_file(p)))
66#endif
67
68#define open_text_input_pipe(a, n, name)     open_binary_input_pipe(a, n, name)
69#define open_text_output_pipe(a, n, name)    open_binary_output_pipe(a, n, name)
70
71
72#define C_set_file_ptr(port, ptr)  (C_set_block_item(port, 0, (C_block_item(ptr, 0))), C_SCHEME_UNDEFINED)
73#define C_curdir(buf)       (getcwd(C_c_string(buf), 256) ? C_fix(strlen(C_c_string(buf))) : C_SCHEME_FALSE)
74
75#define C_stat(fn)          C_fix(stat((char *)C_data_pointer(fn), &C_statbuf))
76#define C_fstat(f)          C_fix(fstat(C_unfix(f), &C_statbuf))
77
78static C_TLS struct stat C_statbuf;
79
80EOF
81))
82
83(include "chicken-more-macros.scm")
84(include "args.scm")
85(include "cmk-utils.scm")
86
87(define run-verbose (make-parameter #f))
88(define print-rules (make-parameter #f))
89
90(define opts
91  `(
92    ,(args:make-option (debug-build)       #:none
93                       "specify that a debug version of Chicken is built")
94    ,(args:make-option (static-build)      #:none
95                       "specify that a static version of Chicken is built")
96    ,(args:make-option (platform)       (required: "PLATFORM")
97                       "target platform"
98                       ($ arg))
99    ,(args:make-option (host-system)       (required: "NAME")
100                       "host system prefix"
101                       ($ arg))
102    ,(args:make-option (program-prefix)       (required: "NAME")
103                       "prefix for the names of Chicken executables"
104                       ($ arg))
105    ,(args:make-option (program-suffix)       (required: "NAME")
106                       "suffix for the names of Chicken executables"
107                       ($ arg))
108
109    ,(args:make-option (assembler)       (required: "NAME")
110                       "assembler command (default is gcc)")
111    ,(args:make-option (c-compiler)       (required: "NAME")
112                       "path to C compiler (default is gcc)")
113    ,(args:make-option (cxx-compiler)       (required: "NAME")
114                       "path to C++ compiler (default is g++)")
115    ,(args:make-option (librarian)       (required: "NAME")
116                       "archiver command (default is ar)")
117    ,(args:make-option (linker)       (required: "NAME")
118                       "linker command (default is gcc)")
119    ,(args:make-option (makeinfo)       (required: "NAME")
120                       "makeinfo command (default is makeinfo)")
121    ,(args:make-option (remove-command)       (required: "NAME")
122                       "file removal command (default is rm (POSIX) or del (Windows))")
123    ,(args:make-option (install-command)       (required: "NAME")
124                       "file install command (default is install (POSIX) or copy (Windows))")
125    ,(args:make-option (makedir-command)       (required: "NAME")
126                       "directory creation command (default is mkdir)")
127    ,(args:make-option (prefix)       (required: "DIR")
128                       "installation prefix")
129    ,(args:make-option (dest-dir)       (required: "DIR")
130                       "destination directory for installation")
131    ,(args:make-option (src-dir)       (required: "DIR")
132                       "directory where the Chicken source tree is located")
133    ,(args:make-option (symbol-gc)       #:none
134                       "always enable garbage collection for unused symbols")
135    ,(args:make-option (no-apply-hook)       #:none
136                       "disable support for breakpoints (and speed up procedure invocation)")
137    ,(args:make-option (use-host-pcre)       #:none
138                       "use PCRE installed on host system")
139    ,(args:make-option (v verbose)  #:none           
140                       "Print each command before it is executed"
141                       (run-verbose #t))
142    ,(args:make-option (p print-rules)  #:none     
143                       "Print all make rules and exit"
144                       (print-rules #t))
145    ,(args:make-option (h help)  #:none              "Print help and exit"
146                       (usage))
147
148    ))
149
150
151;; Use args:usage to generate a formatted list of options (from OPTS),
152;; suitable for embedding into help text.
153(define (usage)
154  (print "Usage: " (car (argv)) " [options...] <target> ")
155  (newline)
156  (print "Where <target> can be one of: " )
157  (newline)
158  (for-each (lambda (x) (print  "  " x))
159            `(all clean distclean spotless install uninstall
160                  confclean check fullcheck dist libs install-libs bootstrap))
161  (newline)
162  (print "The following options are recognized: ")
163  (newline)
164  (print (parameterize ((args:indent 5) (args:width 30)) (args:usage opts)))
165 
166  (exit 1))
167
168
169;; Process arguments and collate options and arguments into OPTIONS
170;; alist, and operands (filenames) into OPERANDS. 
171(define args    (command-line-arguments))
172(set!-values (options operands)  (args:parse args opts))
173
174
175(define (compute-rules options)
176
177  (if (not (or (getenv "PLATFORM") (alist-ref 'platform options)))
178      (begin
179        (print "No platform given." nl)
180        (print "Please select your target platform by running one of the following commands:" nl)
181        (print "chicken-build --platform=linux " )
182        (print "chicken-build --platform=bsd")
183        (print "chicken-build --platform=macosx")
184        (print "chicken-build --platform=mingw-msys")
185        (print "chicken-build --platform=mingw")
186        (print "chicken-build --platform=cygwin")
187        (print "chicken-build --platform=solaris")
188        (print "chicken-build --platform=msvc")
189        (print nl)
190        (print "For more information, consult the README file." nl)
191        (exit 1)))
192
193
194  ;; Basic platform configuration
195
196  (define platform ($ (or (getenv "PLATFORM") (lookup-def 'platform options))) )
197
198  (define arch-value (make-parameter #f))
199
200  (define (arch)
201    (if (not (arch-value))
202        (arch-value 
203         (case platform 
204           ((linux bsd macosx solaris)
205            ($ (ipipe read-line (sh ,(source-path "config-arch.sh")))))
206           (else "x86"))))
207    (arch-value))
208
209  (define needs-relinking?
210    (make-parameter
211     (case platform
212       ((linux)  #t)
213       (else     #f))))
214
215  ;; Runtime parameters
216
217  (define binary-version   3)
218  (define stack-direction  (make-parameter 1))
219
220  ;; Directories
221
222  (define src-dir         (or (getenv "SRCDIR") (lookup-def 'src-dir options)  "."))
223  (define dest-dir        (or (getenv "DESTDIR") (lookup-def 'dest-dir options) ""))
224
225  (define prefix          (make-parameter (or (getenv "PREFIX") (lookup-def 'prefix options) 
226                                              (case platform
227                                                ((mingw-msys)  "c:/devtools")
228                                                ((mingw)       "c:\\devtools")
229                                                (else          "/usr/local")))))
230
231  (define bin-dir         (make-parameter (make-pathname (prefix) "bin")))
232  (define lib-dir         (make-parameter (make-pathname (prefix) "lib")))
233  (define chicken-lib-dir (make-parameter (make-pathname (lib-dir) "chicken")))
234  (define inc-dir         (make-parameter (make-pathname (prefix) "include")))
235  (define egg-dir         (make-parameter (make-pathname (chicken-lib-dir) (->string binary-version))))
236
237  (define share-dir       (make-parameter (make-pathname (prefix) "share")))
238  (define data-dir        (make-parameter (make-pathname (share-dir) "chicken")))
239  (define doc-dir         (make-parameter (make-pathname (data-dir) "doc")))
240  (define top-man-dir     (make-parameter (make-pathname (share-dir) "man")))
241  (define man-dir         (make-parameter (make-pathname (top-man-dir) "man1")))
242  (define info-dir        (make-parameter (make-pathname (share-dir) "info")))
243
244  (define (source-path x)
245    (make-pathname src-dir (->string x)))
246
247  (define (pcre-source-path x)
248    (make-pathname src-dir (make-pathname "pcre" (->string x))))
249
250  (define (dest-path x)
251    (if (zero? (string-length dest-dir)) (->string x)
252        (make-pathname dest-dir (->string x))))
253
254
255  ;; Build parameters
256
257  (define nursery         (make-parameter
258                           (case (arch)
259                             ((x86-64)  (* 256 1024))
260                             (else      (* 128 1024)))))
261
262  (define debug-build?    (assoc 'debug-build options))
263  (define symbol-gc?      (or (getenv "SYMBOLGC") (assoc 'symbol-gc options)))
264  (define no-apply-hook?  (or (getenv "NOAPPLYHOOK") (assoc 'no-apply-hook options)))
265  (define hacked-apply?   (make-parameter #t))
266
267  ;; Commands
268
269  (define host-system   (or (getenv "HOSTSYSTEM") (lookup-def 'host-system options)))
270
271  (define c-compiler    (or (getenv "C_COMPILER") (lookup-def 'c-compiler options)
272                            (pcmd$ host-system "gcc")))
273  (define cxx-compiler  (or (getenv "CXX_COMPILER") (lookup-def 'cxx-compiler options)
274                            (pcmd$ host-system "g++")))
275  (define librarian     (or (getenv "LIBRARIAN") (lookup-def 'librarian options)
276                            (pcmd$ host-system "ar")))
277  (define linker        (or (getenv "LINKER") (lookup-def 'linker options)
278                            c-compiler))
279
280  (define assembler       (or (getenv "ASSEMBLER") (lookup-def 'assembler options)
281                              c-compiler))
282  (define makeinfo        (or (getenv "MAKEINFO") (lookup-def 'makeinfo options)
283                              "makeinfo"))
284
285  (define remove-command  (or (getenv "REMOVE_COMMAND") (lookup-def 'remove-command options)
286                              (case platform
287                                ((mingw)  "del")
288                                (else     "rm"))))
289  (define install-command  (or (getenv "INSTALL_COMMAND") (lookup-def 'install-command options)
290                               (case platform
291                                 ((mingw)  "copy")
292                                 (else     "install"))))
293  (define makedir-command  (or (getenv "MAKEDIR_COMMAND") (lookup-def 'makedir-command options)
294                               "mkdir"))
295
296  (define install-info-command (or (getenv "INSTALL_INFO_COMMAND") 
297                                   (lookup-def 'install-info-command options)
298                                   "install-info"))
299
300  (define uninstall-info-command (or (getenv "UNINSTALL_INFO_COMMAND") 
301                                     (lookup-def 'uninstall-info-command options)
302                                     "uninstall-info"))
303
304  (define postinstall-static-library (make-parameter #f))
305  (define postinstall-program (make-parameter #f))
306  (define postinstall-program-flags (make-parameter #f))
307
308  ;; Compiler- and linker-related options
309
310  (define libraries (make-parameter (list)))
311  (define includes  (make-parameter (list "-I."  (s+ "-I" src-dir))))
312
313  (define target-libraries (make-parameter (lambda () (pv libraries))))
314
315  (define soname-version
316    (make-parameter ""))
317
318  (define c-compiler-options
319    (make-parameter (list)))
320
321  (define c-compiler-optimization-options
322    (make-parameter (list)))
323
324  (define c-compiler-compile-option
325    (make-parameter "-c"))
326
327  (define c-compiler-output-option
328    (make-parameter "-o"))
329
330  (define (c-compiler-output x)
331    (s+ (c-compiler-output-option) " " x))
332
333  (define c-compiler-build-runtime-options 
334    (make-parameter (list "-DC_BUILDING_LIBCHICKEN")))
335
336  (define c-compiler-build-unsafe-runtime-options 
337    (make-parameter (lambda () (append (pv c-compiler-build-runtime-options) 
338                                       (list "-DNDEBUG" "-DC_UNSAFE_RUNTIME")))))
339
340  (define c-compiler-shared-options
341    (make-parameter (list "-fPIC" "-DPIC")))
342
343  (define runtime-linker-path
344    (make-parameter (current-directory)))
345
346  (define linker-link-shared-library-extra-options
347    (make-parameter (lambda (x) (list))))
348
349  (define linker-link-shared-library-options
350    (make-parameter (list)))
351
352  (define linker-link-shared-program-options
353    (make-parameter (list)))
354
355  (define linker-executable-options 
356    (make-parameter (list "-L.")))
357
358  (define linker-static-options
359    (make-parameter linker-executable-options))
360
361  (define linker-options 
362    (make-parameter (list)))
363
364  (define linker-output-option 
365    (make-parameter "-o"))
366
367  (define (linker-output x)
368    (s+ (linker-output-option) " " x))
369
370  (define linker-library-option 
371    (make-parameter (list "-l")))
372
373  (define static-build?
374    (make-parameter (or (getenv "STATICBUILD") (lookup-def 'static-build options))))
375
376  (define linker-library-prefix
377    (make-parameter (if (pv static-build?) "lib" "-l")))
378
379  (define linker-library-suffix
380    (make-parameter (if (pv static-build?) ".a" "")))
381
382
383  ;; Helper program options
384
385  (define librarian-options
386    (make-parameter (list "cru")))
387
388  (define librarian-output-option
389    (make-parameter ""))
390
391  (define (librarian-output x)
392    (s+ (librarian-output-option) " " x))
393
394  (define remove-command-options
395    (make-parameter (list "-f")))
396
397  (define remove-command-recursive-options
398    (make-parameter (list "-fr")))
399
400  (define make-writable-command
401    (make-parameter "chmod 0755"))
402
403  (define makeinfo-options 
404    (make-parameter (list "--no-split")))
405
406  (define install-program-shared-library-options
407    (make-parameter (list)))
408
409  (define install-program-static-library-options
410    (make-parameter (list)))
411
412  (define install-program-executable-options
413    (make-parameter (list)))
414
415  (define install-program-file-options 
416    (make-parameter (list)))
417
418  (define makedir-command-options
419    (make-parameter (list)))
420
421  (define assembler-options 
422    (make-parameter c-compiler-options))
423
424  (define assembler-output-option 
425    (make-parameter "-o"))
426
427  (define (assembler-output x)
428    (s+ (assembler-output-option) " " x))
429
430  (define assembler-compile-option
431    (make-parameter "-c"))
432
433  (define uninstallinfo-program-options
434    (make-parameter (list "--delete")))
435
436
437  ;; Other settings
438
439  (define no-unix-shell?   (make-parameter #f))
440  (define dlls-in-path?    (make-parameter #f))
441  (define clean-mingw-libs (make-parameter (list)))
442
443  (define hostname   (make-parameter ""))
444  (define build-time (make-parameter ""))
445  (define uname-sys  (make-parameter ""))
446
447  (define build-tag
448    (make-parameter (lambda () (s+ "compiled " (pv build-time) " on " (pv hostname) " " "(" (pv uname-sys) ")"))))
449
450  (define lock-to-space? 
451    (or (getenv "LOCKTOSPACE") (lookup-def 'lock-tospace options)))
452
453  (if lock-to-space?
454      (c-compiler-build-runtime-options 
455       (cons "-DC_LOCK_TOSPACE" (pv c-compiler-build-runtime-options))))
456
457  (define no-ptables? 
458    (or (getenv "NOPTABLES") (lookup-def 'no-ptables options)))
459
460  (define c-compiler-ptables-options
461    (make-parameter (if (not no-ptables?) (list "-DC_ENABLE_PTABLES") (list))))
462
463  ;; Program prefix and suffix
464
465  (define program-prefix (or (lookup-def 'program-prefix options) ""))
466  (define program-suffix (or (lookup-def 'program-suffix options) ""))
467
468  ;; File extensions
469
470  (define O    (make-parameter ".o"))
471  (define A    (make-parameter ".a"))
472  (define SO   (make-parameter ".so"))
473  (define ASM  (make-parameter ".s"))
474  (define EXE  (make-parameter ""))
475
476  ;; Special files
477
478  (define posix-file (make-parameter "posixunix"))
479  (define chicken_config_h-file "chicken-config.h")
480
481  (define apply-hack-src    (make-parameter (s+ "apply-hack." (arch) (pv ASM))))
482  (define apply-hack-object (make-parameter (s+ "apply-hack." (arch) (pv O))))
483
484  ;; Bootstrapping compiler
485
486  (define chicken-bootstrap (make-parameter (lambda () (s+ "chicken" (pv EXE)))))
487
488  ;; Scheme compiler flags
489
490  (define chicken-options 
491    (make-parameter (lambda () (list "-quiet" "-no-trace" "-optimize-level 2" 
492                                     "-include-path ." (s+ "-include-path " src-dir)))))
493
494  (define (chicken-library-options )
495    (cons  "-explicit-use" (pv chicken-options)))
496
497  (define (chicken-program-options )
498    (cons  "-no-lambda-info" (pv chicken-options)))
499
500  (define (chicken-compiler-options )
501    (cons "-extend private-namespace.scm" (chicken-program-options)))
502
503  (define (chicken-unsafe-options)
504    (list "-unsafe" "-no-lambda-info"))
505
506
507  ;; PCRE-specific setup
508
509  (define use-host-pcre? 
510    (or (getenv "USE_HOST_PCRE") 
511        (assoc 'use-host-pcre options)))
512
513  (define pcre-dir 
514    (make-parameter (source-path "pcre")))
515
516  (define pcre-includes 
517    (make-parameter (lambda () (cons (s+ "-I" (pv pcre-dir)) (pv includes)))))
518
519  (define pcre-c-compiler-options 
520    (make-parameter (list "-DPCRE_STATIC" "-DHAVE_CONFIG_H")))
521
522  (define chicken-pcre-library-options
523    (make-parameter (list (s+ "-include-path " (pv pcre-dir)))))
524
525  (if use-host-pcre?
526      (chicken-pcre-library-options (list))
527      (includes (cons (s+ "-I" (pv pcre-dir)) (pv includes))))
528
529
530  ;; Platform-specific configuration
531
532  (case platform
533    ((linux)   (begin
534                 (libraries   
535                  (append (list "-lm" "-ldl") 
536                          (pv libraries)))
537
538                 (c-compiler-options 
539                  (append (list "-fno-strict-aliasing" "-DHAVE_CHICKEN_CONFIG_H")
540                          (pv c-compiler-options)))
541
542                 (c-compiler-optimization-options
543                  (append (if debug-build? 
544                              (list "-g" "-Wall" "-Wno-unused")
545                              (list "-Os" "-fomit-frame-pointer"))
546                          (pv c-compiler-optimization-options)))
547
548                 (soname-version (s+ "." binary-version))
549
550                 (linker-link-shared-library-options (list "-shared"))
551
552                 (runtime-linker-path (ipipe read-line (pwd)))
553
554                 (linker-link-shared-program-options
555                  (list (s+ "-Wl,-R" (pv runtime-linker-path))))
556                 
557                 ))
558   
559    ((bsd)     (begin
560                 (libraries   
561                  (append (list "-lm" ) 
562                          (pv libraries)))
563                 
564                 (c-compiler-options 
565                  (append (list "-fno-strict-aliasing" "-DHAVE_CHICKEN_CONFIG_H")
566                          (pv c-compiler-options)))
567
568                 (c-compiler-optimization-options
569                  (append (if debug-build? 
570                              (list "-g" "-Wall" "-Wno-unused")
571                              (list "-Os" "-fomit-frame-pointer"))
572                          (pv c-compiler-optimization-options)))
573
574                 (linker-link-shared-library-options (list "-shared"))
575
576                 (linker-link-shared-program-options
577                  (list (s+ "-Wl,-R" (pv runtime-linker-path))))
578
579                 ))
580
581    ((cygwin)   (begin
582                  (libraries   
583                   (append (list "-lm" ) 
584                           (pv libraries)))
585
586                  (dlls-in-path? #t)
587                  (SO ".dll")
588                  (EXE ".exe")
589
590                  (c-compiler-options 
591                   (append (list "-fno-strict-aliasing" "-DHAVE_CHICKEN_CONFIG_H")
592                           (pv c-compiler-options)))
593
594                  (c-compiler-optimization-options
595                   (append (if debug-build? 
596                               (list "-g" "-Wall" "-Wno-unused")
597                               (list "-Os" ))
598                           (pv c-compiler-optimization-options)))
599
600                  (c-compiler-shared-options 
601                   (cons "-DPIC" (pv c-compiler-shared-options)))
602                 
603                  (linker-link-shared-library-options (list "-shared"))
604
605                  (linker-link-shared-program-options
606                   (list  "-Wl,--dll-search-prefix=cyg" "-Wl,--export-dynamic" ))
607
608                  ))
609
610    ((macosx)   (begin
611                  (SO ".dylib")
612
613                  (postinstall-program  "install_name_tool")
614                 
615                  (c-compiler-options 
616                   (append (list "-no-cpp-precomp" "-fno-common" 
617                                 "-fno-strict-aliasing" "-DHAVE_CHICKEN_CONFIG_H")
618                           (pv c-compiler-options)))
619
620                  (c-compiler-optimization-options
621                   (append (if debug-build? 
622                               (list "-g" "-Wall" "-Wno-unused")
623                               (list "-Os" "-fomit-frame-pointer" ))
624                           (pv c-compiler-optimization-options)))
625                 
626                  (linker-link-shared-library-options
627                   (list "-dynamiclib"  "-compatibility_version 1" 
628                         "-current_version 1.0" ))
629
630                  (postinstall-program-flags 
631                   (list (s+ "-change libchicken" (pv SO))
632                         (make-pathname (pv lib-dir) (s+ "libchicken" (pv SO)))))
633                 
634                  (librarian-options (list "scru"))
635
636                  (case (arch)
637                    ((x86-64)
638                     (begin (c-compiler-options (cons "-m64" (pv c-compiler-options)))
639                            (linker-options (cons "-m64" (pv linker-options)))))
640
641                    ((universal)
642                     (c-compiler-options 
643                      (append (list "-arch ppc" "-arch i386" "-isysroot /Developer/SDKs/MacOSX10.4u.sdk"
644                                    (pv c-compiler-options))))
645                     (linker-options 
646                      (append (list "-arch ppc" "-arch i386" "-isysroot /Developer/SDKs/MacOSX10.4u.sdk"
647                                    (pv linker-options))))))
648
649                  ))
650
651    ((mingw)      (begin
652                    (no-unix-shell? #t)
653                    (dlls-in-path? #t)
654
655                    (clean-mingw-libs (list "libchickengui.a" "libchickengui.dll" "libchickengui.dll.a"))
656
657                    (SO   ".dll")
658                    (EXE  ".exe")
659                   
660                    (posix-file "posixwin")
661
662                    (libraries (append (list "-lm" "-lws2_32") (pv libraries)))
663                   
664                    (c-compiler-options 
665                     (append (list "-fno-strict-aliasing" "-DHAVE_CHICKEN_CONFIG_H")
666                             (pv c-compiler-options)))
667                   
668                    (c-compiler-optimization-options
669                     (append (if debug-build? 
670                                 (list "-g" "-Wall" "-Wno-unused")
671                                 (list "-Os"  ))
672                             (pv c-compiler-optimization-options)))
673                   
674                    (c-compiler-shared-options  (list "-DPIC"))
675                   
676                    (linker-link-shared-library-options (list "-shared"))
677                   
678                    (linker-link-shared-program-options
679                     (list  "-Wl,--dll-search-prefix=cyg" "-Wl,--export-dynamic" ))
680
681                    ))
682
683    ((mingw-msys)  (begin
684                     (dlls-in-path? #t)
685
686                     (clean-mingw-libs (list "libchickengui.a" "libchickengui.dll" "libchickengui.dll.a"))
687                     
688                     (SO   ".dll")
689                     (EXE  ".exe")
690                     
691                     (posix-file "posixwin")
692
693                     (libraries (append (list "-lm" "-lws2_32") (pv libraries)))
694                     
695                     (c-compiler-options 
696                      (append (list "-fno-strict-aliasing" "-DHAVE_CHICKEN_CONFIG_H")
697                              (pv c-compiler-options)))
698
699                     (c-compiler-optimization-options
700                      (append (if debug-build? 
701                                  (list "-g" "-Wall" "-Wno-unused")
702                                  (list "-Os"  ))
703                              (pv c-compiler-optimization-options)))
704                     
705                     (c-compiler-shared-options (list "-DPIC" ))
706                     
707                     (linker-link-shared-library-options (list "-shared"))
708
709                     (linker-link-shared-program-options
710                      (list  "-Wl,--dll-search-prefix=cyg" "-Wl,--export-dynamic" ))
711
712                     ))
713
714    ((solaris)      (begin
715                     
716                      (libraries   
717                       (append (list "-lrt" "-lsocket" "-lnsl" "-lm" "-ldl") 
718                               (pv libraries)))
719                     
720                      (c-compiler-options 
721                       (append (list "-fno-strict-aliasing" "-DHAVE_CHICKEN_CONFIG_H")
722                               (pv c-compiler-options)))
723                     
724                      (c-compiler-optimization-options
725                       (append (if debug-build? 
726                                   (list "-g" "-Wall" "-Wno-unused")
727                                   (list "-Os" "-fomit-frame-pointer"))
728                               (pv c-compiler-optimization-options)))
729                     
730                      (linker-link-shared-library-options (list "-shared"))
731
732                      (linker-link-shared-program-options
733                       (list (s+ "-Wl,-R" (pv lib-dir))))
734                     
735                      ))
736    )
737
738
739  ;; Some common parameters
740
741  (case platform
742    ((linux bsd solaris macosx cygwin)
743     (begin
744       (hostname    (ipipe read-line (hostname)))
745       (build-time  (ipipe read-line (date +%Y-%m-%d)))
746       (uname-sys   (ipipe read-line (uname)))
747       (install-program-shared-library-options (list "-m755"))
748       (install-program-static-library-options (list "-m644"))
749       (install-program-executable-options     (list "-m755"))
750       (install-program-file-options           (list "-m644"))
751       (makedir-command-options                (list "-p"))))
752    ((mingw)
753     (begin
754       (build-time  (ipipe read-line (date /t)))
755       (uname-sys   "MinGW")
756       (remove-command-options (list "/f" "/q"))
757       (remove-command-recursive-options (list "/f" "/s" "/q"))
758       (make-writable-command "rem")))
759    )
760
761  ;; Target-specific configuration
762
763  (define libchicken_so-libraries   
764    (case platform
765      ((mingw mingw-msys)  (list "-lm" "-lws2_32"))
766      (else                (pv libraries))))
767
768
769  (define libuchicken_so-libraries   
770    (case platform
771      ((mingw mingw-msys)  (list "-lm" "-lws2_32"))
772      (else                (pv libraries))))
773
774
775  (define libchickengui_so-libraries   
776    (case platform
777      ((mingw mingw-msys)  (list "-lm" "-lws2_32" "-lkernel32" "-luser32" "-lgdi32" ))
778      (else                (pv libraries))))
779
780
781  (define libchicken_so-linker-options
782    (case platform
783      ((linux)   (list (s+ "-Wl,-soname,libchicken.so" (pv soname-version))))
784      ((macosx)  (list (s+ "-install_name " (s+ "libchicken" (pv SO)))))
785      ((cygwin)  (list "-Wl,--out-implib,libchicken.dll.a" "-Wl,--export-all-symbols"
786                       "-Wl,--enable-auto-import" "-Wl,--image-base=0x10000000"
787                       "-Wl,--dll" "-Wl,--add-stdcall-alias"    "-Wl,--no-whole-archive"))
788      ((mingw mingw-msys)  (list "-Wl,--out-implib,libchicken.dll.a"))
789     
790      (else      (list))))
791
792  (define libuchicken_so-linker-options
793    (case platform
794      ((linux)   (list (s+ "-Wl,-soname,libuchicken.so" (pv soname-version))))
795      ((macosx)  (list (s+ "-install_name " (s+ "libuchicken" (pv SO)))))
796      ((cygwin)  (list "-Wl,--out-implib,libchicken.dll.a" "-Wl,--export-all-symbols"
797                       "-Wl,--enable-auto-import" "-Wl,--image-base=0x10000000"
798                       "-Wl,--dll" "-Wl,--add-stdcall-alias"    "-Wl,--no-whole-archive"))
799      ((mingw mingw-msys)  (list "-Wl,--out-implib,libchicken.dll.a"))
800     
801      (else     (list))))
802
803
804  (define libchickengui_so-linker-options
805    (case platform
806      ((mingw mingw-msys)  (list "-Wl,--out-implib,libchickengui.dll.a"))
807      (else     (list))))
808
809
810  (define libchicken-import-library
811    (case platform
812      ((mingw mingw-msys cygwin)    "libchicken.dll.a")
813      (else                         #f)))
814
815
816  (define libuchicken-import-library
817    (case platform
818      ((mingw mingw-msys cygwin)    "libuchicken.dll.a")
819      (else                         #f)))
820
821
822  (define libchickengui-import-library
823    (case platform
824      ((mingw mingw-msys cygwin)    "libchickengui.dll.a")
825      (else                         #f)))
826
827
828  ;; Chicken program targets
829
830  (define chicken-program
831    (s+ program-prefix "chicken" program-suffix))
832
833  (define csc-program
834    (s+ program-prefix "csc" program-suffix))
835 
836  (define csi-program
837    (s+ program-prefix "csi" program-suffix))
838 
839  (define chicken-profile-program
840    (s+ program-prefix "chicken-profile" program-suffix))
841 
842  (define chicken-bug-program
843    (s+ program-prefix "chicken-bug" program-suffix))
844
845  (define chicken-setup-program
846    (s+ program-prefix "chicken-setup" program-suffix))
847
848
849  (define primary-libchicken    #f)
850  (define libchicken_so-file    #f)
851  (define libuchicken_so-file   #f)
852  (define libchickengui_so-file #f)
853
854  (define chicken-static-executable  #f)
855  (define csi-static-executable      #f)
856  (define chicken-shared-executable  #f)
857  (define csi-shared-executable      #f)
858
859  (define libs-target  (list))
860  (define targets     (list))
861
862  (if (pv static-build? )
863      (begin
864        (case platform
865          ((cygwin) 
866           (begin
867             (set! primary-libchicken    "cygchicken-0.dll")
868             (set! libchicken_so-file    "cygchicken-0.dll")
869             (set! libuchicken_so-file   "cyguchicken-0.dll")))
870          (else
871           (begin
872             (set! primary-libchicken (s+ "libchicken" (pv A))))))
873
874        (set! chicken-static-executable  (s+ chicken-program (pv EXE)))
875        (set! csi-static-executable      (s+ csi-program (pv EXE)))
876        (set! chicken-shared-executable  (s+ chicken-program "-shared" (pv EXE)))
877        (set! csi-shared-executable      (s+ csi-program "-shared" (pv EXE)))
878
879        (set! libs-target   (list (s+ "libchicken" (pv A)) (s+ "libuchicken" (pv A))))
880        (set! targets       (append libs-target 
881                                    (list chicken-static-executable csi-static-executable 
882                                          (s+ chicken-profile-program (pv EXE))
883                                          (s+ csc-program (pv EXE))
884                                          (s+ chicken-setup-program (pv EXE))
885                                          (s+ chicken-bug-program (pv EXE))
886                                          "chicken.info")))
887       
888        )
889      (begin
890        (set! primary-libchicken  (s+ "libchicken"  (pv SO) (pv soname-version)))
891        (set! libchicken_so-file  (s+ "libchicken"  (pv SO) (pv soname-version)))
892        (set! libuchicken_so-file (s+ "libuchicken" (pv SO) (pv soname-version)))
893
894        (case platform
895          ((mingw mingw-msys)  (set! libchickengui_so-file (s+ "libchickengui"  (pv SO)))))
896
897        (set! chicken-static-executable   (s+ chicken-program "-static" (pv EXE)))
898        (set! csi-static-executable       (s+ csi-program     "-static" (pv EXE)))
899        (set! chicken-shared-executable   (s+ chicken-program (pv EXE)))
900        (set! csi-shared-executable       (s+ csi-program     (pv EXE)))
901
902        (set! libs-target     (list (s+ "libchicken" (pv A)) (s+ "libuchicken" (pv A))
903                                    libchicken_so-file libuchicken_so-file))
904        (set! targets         (append libs-target 
905                                      (list chicken-shared-executable csi-shared-executable 
906                                            (s+ chicken-profile-program (pv EXE))
907                                            (s+ csc-program (pv EXE))
908                                            (s+ chicken-setup-program (pv EXE))
909                                            (s+ chicken-bug-program (pv EXE))
910                                            "chicken.info")))
911        ))
912
913
914
915
916  ;; main rule
917
918
919  (define (mkdir p)
920    (run (,makedir-command ,@(pv makedir-command-options) ,p)))
921
922  (define (symlink p1 p2)
923    (if (not (equal? p1 p2))
924        (run (ln -sf ,p1 ,p2))))
925
926  (define all-rule
927    (let* ((targets  (case platform
928                       ((mingw mingw-msys) 
929                        (append (list (s+ "libchickengui" (pv SO)) (s+ "libchickengui" (pv A)))
930                                targets))
931                       (else targets)))
932           (targets  (cons "buildsvnrevision" targets)))
933      `("all"  ,targets ,void)))
934
935
936  (define buildsvnrevision-rule
937    `("buildsvnrevision" ()
938      ,(lambda ()
939         (if (pv no-unix-shell?)
940             (call-with-output-file "buildsvnrevision" 
941               (lambda (out) (display "0" out)))
942             (run (sh ,(source-path "svnrevision.sh")))))))
943             
944
945  (define (create-chicken-defaults_h out)
946    (display  
947#<#END
948     /* generated */
949     ##define C_BUILD_TAG "#{(pv build-tag)}" 
950     ##define C_SVN_REVISION #{(call-with-input-file "buildsvnrevision" read-line)}
951     ##ifndef C_INSTALL_CC
952     ## define C_INSTALL_CC "#{c-compiler}"
953     ##endif
954     ##ifndef C_INSTALL_CXX
955     ## define C_INSTALL_CXX "#{cxx-compiler}"
956     ##endif
957     ##ifndef C_INSTALL_CFLAGS
958     ## define C_INSTALL_CFLAGS "#{(sw+ (append (pv c-compiler-options) (pv c-compiler-optimization-options)))}"
959     ##endif
960     ##ifndef C_INSTALL_LDFLAGS
961     ## define C_INSTALL_LDFLAGS "#{(sw+ (pv linker-options))}"
962     ##endif
963     ##ifndef C_INSTALL_SHARE_HOME
964     ## define C_INSTALL_SHARE_HOME "#{(pv data-dir)}"
965     ##endif
966     ##ifndef C_INSTALL_BIN_HOME
967     ## define C_INSTALL_BIN_HOME "#{(pv bin-dir)}"
968     ##endif
969     ##ifndef C_INSTALL_EGG_HOME
970     ## define C_INSTALL_EGG_HOME "#{(pv egg-dir)}"
971     ##endif
972     ##ifndef C_INSTALL_LIB_HOME
973     ## define C_INSTALL_LIB_HOME "#{(pv lib-dir)}"
974     ##endif
975     ##ifndef C_INSTALL_STATIC_LIB_HOME
976     ## define C_INSTALL_STATIC_LIB_HOME "#{(pv lib-dir)}"
977     ##endif
978     ##ifndef C_INSTALL_INCLUDE_HOME
979     ## define C_INSTALL_INCLUDE_HOME "#{(pv inc-dir)}"
980     ##endif
981     ##ifndef C_INSTALL_MORE_LIBS
982     ## define C_INSTALL_MORE_LIBS "#{(sw+ (pv libraries))}"
983     ##endif
984     ##ifndef C_INSTALL_MORE_STATIC_LIBS
985     ## define C_INSTALL_MORE_STATIC_LIBS "#{(sw+ (pv libraries))}"
986     ##endif
987     ##ifndef C_DEFAULT_TARGET_STACK_SIZE
988     ## define C_DEFAULT_TARGET_STACK_SIZE #{(pv nursery)}
989     ##endif
990     ##ifndef C_STACK_GROWS_DOWNWARD
991     ## define C_STACK_GROWS_DOWNWARD #{(pv stack-direction)}
992     ##endif
993     ##ifndef C_TARGET_MORE_LIBS
994     ## define C_TARGET_MORE_LIBS "#{(sw+ (pv target-libraries))}"
995     ##endif
996     ##ifndef C_TARGET_MORE_STATIC_LIBS
997     ## define C_TARGET_MORE_STATIC_LIBS "#{(sw+ (pv target-libraries))}"
998     ##endif
999
1000     ##ifndef C_CHICKEN_PROGRAM
1001     ## define C_CHICKEN_PROGRAM "#{chicken-program}"
1002     ##endif
1003     ##ifndef C_CSC_PROGRAM
1004     ## define C_CSC_PROGRAM "#{csc-program}"
1005     ##endif
1006     ##ifndef C_CSI_PROGRAM
1007     ## define C_CSI_PROGRAM "#{csi-program}"
1008     ##endif
1009     ##ifndef C_CHICKEN_PROFILE_PROGRAM
1010     ## define C_CHICKEN_PROFILE_PROGRAM "#{chicken-profile-program}"
1011     ##endif
1012     ##ifndef C_CHICKEN_SETUP_PROGRAM
1013     ## define C_CHICKEN_SETUP_PROGRAM "#{chicken-setup-program}"
1014     ##endif
1015     ##ifndef C_CHICKEN_BUG_PROGRAM
1016     ## define C_CHICKEN_BUG_PROGRAM "#{chicken-bug-program}"
1017     ##endif
1018     ##ifndef C_BINARY_VERSION
1019     ## define C_BINARY_VERSION #{binary-version}
1020     ##endif
1021
1022END
1023     out))
1024
1025  (define chicken-defaults_h-rule
1026    `("chicken-defaults.h" ("buildsvnrevision")
1027      ,(lambda ()
1028         (call-with-output-file "chicken-defaults.h" create-chicken-defaults_h))))
1029
1030
1031  #|      FIXME:
1032         ##ifndef C_TARGET_CC
1033         ## define C_TARGET_CC \"$(TARGET_C_COMPILER)\"
1034         ##endif
1035         ##ifndef C_TARGET_CXX
1036         ## define C_TARGET_CXX \"$(TARGET_CXX_COMPILER)\"
1037         ##endif
1038         ##ifndef C_TARGET_CFLAGS
1039         ## define C_TARGET_CFLAGS \"$(TARGET_C_COMPILER_OPTIONS) $(TARGET_C_COMPILER_OPTIMIZATION_OPTIONS)\"
1040         ##endif
1041         ##ifndef C_TARGET_LDFLAGS
1042         ## define C_TARGET_LDFLAGS \"$(TARGET_LINKER_OPTIONS) $(TARGET_LINKER_OPTIMIZATION_OPTIONS)\"
1043         ##endif
1044         ##ifndef C_CROSS_CHICKEN
1045         ## define C_CROSS_CHICKEN $(CROSS_CHICKEN)
1046         ##endif
1047ifdef WINDOWS
1048        ##ifndef C_TARGET_LIB_HOME
1049        ## define C_TARGET_LIB_HOME \"$(TARGET_PREFIX)\\lib\"
1050        ##endif
1051        ##ifndef C_TARGET_RUN_LIB_HOME
1052        ## define C_TARGET_RUN_LIB_HOME \"$(TARGET_RUN_PREFIX)\\lib\"
1053        ##endif
1054        ##ifndef C_TARGET_SHARE_HOME
1055        ## define C_TARGET_SHARE_HOME \"$(TARGET_PREFIX)\\share\"
1056        ##endif
1057        ##ifndef C_TARGET_INCLUDE_HOME
1058        ## define C_TARGET_INCLUDE_HOME \"$(TARGET_PREFIX)\\include\"
1059        ##endif
1060        ##ifndef C_TARGET_STATIC_LIB_HOME
1061        ## define C_TARGET_STATIC_LIB_HOME \"$(TARGET_PREFIX)\\lib\"
1062        ##endif
1063else
1064        echo "#ifndef C_TARGET_LIB_HOME
1065        echo "# define C_TARGET_LIB_HOME \"$(TARGET_PREFIX)/lib\"
1066        echo "#endif
1067        echo "#ifndef C_TARGET_RUN_LIB_HOME
1068        echo "# define C_TARGET_RUN_LIB_HOME \"$(TARGET_RUN_PREFIX)/lib\"
1069        echo "#endif
1070        echo "#ifndef C_TARGET_SHARE_HOME
1071        echo "# define C_TARGET_SHARE_HOME \"$(TARGET_PREFIX)/share\"
1072        echo "#endif
1073        echo "#ifndef C_TARGET_INCLUDE_HOME
1074        echo "# define C_TARGET_INCLUDE_HOME \"$(TARGET_PREFIX)/include\"
1075        echo "#endif
1076        echo "#ifndef C_TARGET_STATIC_LIB_HOME
1077        echo "# define C_TARGET_STATIC_LIB_HOME \"$(TARGET_PREFIX)/lib\"
1078        echo "#endif
1079endif
1080|#
1081
1082(define chicken-config_h-rule
1083  `("chicken-config.h" ("chicken-defaults.h")
1084    ,(lambda ()
1085       (call-with-output-file "chicken-config.h"
1086         (lambda (out)
1087           (case platform
1088             ((linux)
1089              (display
1090#<<END
1091               #define HAVE_DIRENT_H 1
1092               #define HAVE_DLFCN_H 1
1093               #define HAVE_INTTYPES_H 1
1094               #define HAVE_LIMITS_H 1
1095               #define HAVE_LONG_LONG 1
1096               #define HAVE_MEMMOVE 1
1097               #define HAVE_MEMORY_H 1
1098               #define HAVE_STDINT_H 1
1099               #define HAVE_STDLIB_H 1
1100               #define HAVE_STRERROR 1
1101               #define HAVE_STRINGS_H 1
1102               #define HAVE_STRING_H 1
1103               #define HAVE_STRTOLL 1
1104               #define HAVE_STRTOQ 1
1105               #define HAVE_SYS_STAT_H 1
1106               #define HAVE_SYS_TYPES_H 1
1107               #define HAVE_UNISTD_H 1
1108               #define HAVE_UNSIGNED_LONG_LONG 1
1109               #define STDC_HEADERS 1
1110               #define HAVE_ALLOCA 1
1111               #define HAVE_ALLOCA_H 1
1112               #define HAVE_GRP_H 1
1113               #define HAVE_ERRNO_H 1
1114               #define HAVE_GCVT 1
1115               #define HAVE_SYSEXITS_H 1
1116               #define HAVE_MEMMOVE 1
1117               #define C_STACK_GROWS_DOWNWARD 1
1118
1119END
1120               out))
1121             ((bsd)
1122              (display
1123#<<END
1124               #define HAVE_DIRENT_H 1
1125               #define HAVE_DLFCN_H 1
1126               #define HAVE_INTTYPES_H 1
1127               #define HAVE_LIMITS_H 1
1128               #define HAVE_LONG_LONG 1
1129               #define HAVE_MEMMOVE 1
1130               #define HAVE_MEMORY_H 1
1131               #define HAVE_STDINT_H 1
1132               #define HAVE_STDLIB_H 1
1133               #define HAVE_STRERROR 1
1134               #define HAVE_STRINGS_H 1
1135               #define HAVE_STRING_H 1
1136               #define HAVE_STRTOLL 1
1137               #define HAVE_STRTOQ 1
1138               #define HAVE_SYS_STAT_H 1
1139               #define HAVE_SYS_TYPES_H 1
1140               #define HAVE_UNISTD_H 1
1141               #define HAVE_UNSIGNED_LONG_LONG 1
1142               #define STDC_HEADERS 1
1143               #define HAVE_ALLOCA 1
1144               #define HAVE_ALLOCA_H 1
1145               #define HAVE_GRP_H 1
1146               #define HAVE_ERRNO_H 1
1147               #define HAVE_SYSEXITS_H 1
1148               #define C_STACK_GROWS_DOWNWARD 1
1149
1150END
1151               out))
1152             ((macosx)
1153              (display
1154#<<END
1155               #define HAVE_DIRENT_H 1
1156               #define HAVE_DLFCN_H 1
1157               #define HAVE_INTTYPES_H 1
1158               #define HAVE_LIMITS_H 1
1159               #define HAVE_LONG_LONG 1
1160               #define HAVE_MEMMOVE 1
1161               #define HAVE_MEMORY_H 1
1162               #define HAVE_STDINT_H 1
1163               #define HAVE_STDLIB_H 1
1164               #define HAVE_STRERROR 1
1165               #define HAVE_STRINGS_H 1
1166               #define HAVE_STRING_H 1
1167               #define HAVE_STRTOLL 1
1168               #define HAVE_STRTOQ 1
1169               #define HAVE_SYS_STAT_H 1
1170               #define HAVE_SYS_TYPES_H 1
1171               #define HAVE_UNISTD_H 1
1172               #define HAVE_UNSIGNED_LONG_LONG 1
1173               #define STDC_HEADERS 1
1174               #define HAVE_ALLOCA 1
1175               #define HAVE_ALLOCA_H 1
1176               #define HAVE_GRP_H 1
1177               #define HAVE_CRT_EXTERNS_H 1
1178               #define HAVE_ERRNO_H 1
1179               #define HAVE_SYSEXITS_H 1
1180               #define C_STACK_GROWS_DOWNWARD 1
1181
1182END
1183               out))
1184             ((solaris)
1185              (display
1186#<<END
1187               #define HAVE_DIRENT_H 1
1188               #define HAVE_DLFCN_H 1
1189               #define HAVE_INTTYPES_H 1
1190               #define HAVE_LIMITS_H 1
1191               #define HAVE_LONG_LONG 1
1192               #define HAVE_MEMMOVE 1
1193               #define HAVE_MEMORY_H 1
1194               #define HAVE_STDINT_H 1
1195               #define HAVE_STDLIB_H 1
1196               #define HAVE_STRERROR 1
1197               #define HAVE_STRINGS_H 1
1198               #define HAVE_STRING_H 1
1199               #define HAVE_STRTOLL 1
1200               #define HAVE_SYS_STAT_H 1
1201               #define HAVE_SYS_TYPES_H 1
1202               #define HAVE_UNISTD_H 1
1203               #define HAVE_UNSIGNED_LONG_LONG 1
1204               #define STDC_HEADERS 1
1205               #define HAVE_ALLOCA_H 1
1206               #define HAVE_ALLOCA 1
1207               #define HAVE_GRP_H 1
1208               #define HAVE_ERRNO_H 1
1209               #define HAVE_GCVT 1
1210               #define HAVE_SYSEXITS_H 1
1211               #define C_STACK_GROWS_DOWNWARD 1
1212
1213END
1214               out))
1215             ((cygwin) 
1216              (display (s+ "#define C_SVN_REVISION " (call-with-input-file "buildsvnrevision" read-line)) out)
1217              (display
1218#<<END
1219               #define HAVE_DIRENT_H 1
1220               #define HAVE_INTTYPES_H 1
1221               #define HAVE_LIMITS_H 1
1222               #define HAVE_LONG_LONG 1
1223               #define HAVE_MEMMOVE 1
1224               #define HAVE_MEMORY_H 1
1225               #define HAVE_STDINT_H 1
1226               #define HAVE_STDLIB_H 1
1227               #define HAVE_STRERROR 1
1228               #define HAVE_STRINGS_H 1
1229               #define HAVE_STRING_H 1
1230               #define HAVE_STRTOLL 1
1231               #define HAVE_STRTOQ 1
1232               #define HAVE_SYS_STAT_H 1
1233               #define HAVE_SYS_TYPES_H 1
1234               #define HAVE_UNISTD_H 1
1235               #define HAVE_UNSIGNED_LONG_LONG 1
1236               #define STDC_HEADERS 1
1237               #define HAVE_ALLOCA 1
1238               #define HAVE_ALLOCA_H 1
1239               #define HAVE_GRP_H 1
1240               #define HAVE_ERRNO_H 1
1241               #define HAVE_GCVT 1
1242               #define HAVE_SYSEXITS_H 1
1243               #define HAVE_DLFCN_H 1
1244               #define C_STACK_GROWS_DOWNWARD 1
1245
1246END
1247               out))
1248
1249             ((mingw)
1250              (display
1251#<<END
1252               #define HAVE_DIRENT_H 1
1253               #define HAVE_INTTYPES_H 1
1254               #define HAVE_LIMITS_H 1
1255               #define HAVE_LONG_LONG 1
1256               #define HAVE_MEMMOVE 1
1257               #define HAVE_MEMORY_H 1
1258               #define HAVE_STDINT_H 1
1259               #define HAVE_STDLIB_H 1
1260               #define HAVE_STRERROR 1
1261               #define HAVE_STRINGS_H 1
1262               #define HAVE_STRING_H 1
1263               #define HAVE_STRTOLL 1
1264               #define HAVE_SYS_STAT_H 1
1265               #define HAVE_SYS_TYPES_H 1
1266               #define HAVE_UNISTD_H 1
1267               #define HAVE_UNSIGNED_LONG_LONG 1
1268               #define HAVE_WINDOWS_H 1
1269               #define HAVE__STRTOI64 1
1270               #define STDC_HEADERS 1
1271               #define HAVE_ALLOCA_H 1
1272               #define HAVE_DIRECT_H 1
1273               #define HAVE_ERRNO_H 1
1274               #define HAVE_GCVT 1
1275               #define HAVE_LOADLIBRARY 1
1276               #define HAVE_GETPROCADDRESS 1
1277               #define HAVE_WINSOCK2_H 1
1278               #define HAVE_WS2TCPIP_H 1
1279               #define C_STACK_GROWS_DOWNWARD 1
1280
1281END
1282               out))
1283             ((mingw-msys)
1284              (display
1285#<<END
1286               #define HAVE_DIRENT_H 1
1287               #define HAVE_INTTYPES_H 1
1288               #define HAVE_LIMITS_H 1
1289               #define HAVE_LONG_LONG 1
1290               #define HAVE_MEMMOVE 1
1291               #define HAVE_MEMORY_H 1
1292               #define HAVE_STDINT_H 1
1293               #define HAVE_STDLIB_H 1
1294               #define HAVE_STRERROR 1
1295               #define HAVE_STRINGS_H 1
1296               #define HAVE_STRING_H 1
1297               #define HAVE_STRTOLL 1
1298               #define HAVE_SYS_STAT_H 1
1299               #define HAVE_SYS_TYPES_H 1
1300               #define HAVE_UNISTD_H 1
1301               #define HAVE_UNSIGNED_LONG_LONG 1
1302               #define HAVE_WINDOWS_H 1
1303               #define HAVE__STRTOI64 1
1304               #define STDC_HEADERS 1
1305               #define HAVE_ALLOCA_H 1
1306               #define HAVE_DIRECT_H 1
1307               #define HAVE_ERRNO_H 1
1308               #define HAVE_GCVT 1
1309               #define HAVE_LOADLIBRARY 1
1310               #define HAVE_GETPROCADDRESS 1
1311               #define HAVE_WINSOCK2_H 1
1312               #define HAVE_WS2TCPIP_H 1
1313               #define C_STACK_GROWS_DOWNWARD 1
1314
1315END
1316               out))
1317             )
1318           (if symbol-gc?
1319               (display "#define C_COLLECT_ALL_SYMBOLS\n" out))
1320           
1321           (if no-apply-hook?
1322               (display "#define C_NO_APPLY_HOOK\n" out))
1323           
1324           (if (pv hacked-apply?)
1325               (display "#define C_HACKED_APPLY\n" out))
1326           
1327           (if use-host-pcre?
1328               (display "#define C_USE_HOST_PCRE\n" out))
1329           
1330           (create-chicken-defaults_h out)
1331           ))
1332       )))
1333
1334(define chicken_h-rule 
1335  `("chicken.h" (,(source-path "chicken.h"))
1336    ,(lambda ()
1337       (run (,install-command ,(source-path "chicken.h") ".")))))
1338
1339(define libchicken-objects0 
1340  `(library eval data-structures ports files extras lolevel utils tcp
1341            srfi-1 srfi-4 srfi-13 srfi-14 srfi-18 srfi-69 ,(pv posix-file) 
1342            regex scheduler profiler stub match ))
1343
1344(define libchicken-shared-objects 
1345  (map (lambda (x) (s+ x (pv O))) 
1346       (cons 'runtime libchicken-objects0)))
1347
1348(define libchicken-static-objects 
1349  (map (lambda (x) (s+ x "-static" (pv O))) 
1350       (cons 'runtime libchicken-objects0)))
1351
1352(define libuchicken-objects0
1353  `(ulibrary ueval udata-structures uports ufiles uextras ulolevel
1354             uutils utcp usrfi-1 usrfi-4 usrfi-13 usrfi-14 usrfi-18 usrfi-69
1355             ,(s+ "u" (pv posix-file)) uregex scheduler profiler stub match
1356             ))
1357
1358(define libuchicken-shared-objects 
1359  (map (lambda (x) (s+ x (pv O))) (cons 'uruntime libuchicken-objects0)))
1360
1361(define libuchicken-static-objects 
1362  (map (lambda (x) (s+ x "-static" (pv O))) (cons 'uruntime libuchicken-objects0)))
1363
1364(define libchickengui-objects0
1365  `(library eval data-structures ports files extras lolevel utils tcp
1366            srfi-1 srfi-4 srfi-13 srfi-14 srfi-18 srfi-69 ,(pv posix-file) 
1367            regex scheduler profiler stub match gui-runtime))
1368
1369(define libchickengui-shared-objects 
1370  (map (lambda (x) (s+ x (pv O))) libchickengui-objects0))
1371
1372(define libchickengui-static-objects 
1373  (map (lambda (x) (s+ x "-static" (pv O))) libchickengui-objects0))
1374
1375(define pcre-objects0 (list))
1376
1377(if (not use-host-pcre?)
1378    (set! pcre-objects0
1379          `(pcre_chartables pcre_compile pcre_config pcre_dfa_exec
1380                            pcre_exec pcre_fullinfo pcre_get pcre_globals pcre_info
1381                            pcre_maketables pcre_newline pcre_ord2utf8 pcre_refcount pcre_study
1382                            pcre_tables pcre_try_flipped pcre_ucd pcre_valid_utf8 pcre_version
1383                            pcre_xclass)))
1384
1385(define pcre-shared-objects 
1386  (map (lambda (x) (s+ x (pv O))) pcre-objects0))
1387
1388(define pcre-static-objects 
1389  (map (lambda (x) (s+ x "-static" (pv O))) pcre-objects0))
1390
1391(define compiler-objects0 
1392  `(chicken batch-driver compiler optimizer support c-platform c-backend))
1393
1394(define compiler-objects 
1395  (map (lambda (x) (s+ x (pv O))) compiler-objects0))
1396
1397(define compiler-static-objects 
1398  (map (lambda (x) (s+ x "-static" (pv O))) compiler-objects0))
1399
1400(define program-objects0
1401  `(chicken-profile chicken-setup csc csi))
1402
1403(define program-objects
1404  (map (lambda (x) (s+ x (pv O))) program-objects0))
1405
1406;; rules for library objects
1407
1408(define library-compiler-flags
1409  (cons (pv c-compiler-compile-option)
1410        (append (pv c-compiler-options) 
1411                (pv c-compiler-ptables-options) 
1412                (pv c-compiler-optimization-options) 
1413                (pv c-compiler-shared-options) 
1414                (pv c-compiler-build-runtime-options) 
1415                (pv pcre-c-compiler-options )
1416                (pv includes) )))
1417
1418(define library-objects-rules
1419  (map (lambda (x) 
1420         (let ((source (case x 
1421                         ((runtime) (source-path (s+ x ".c"))) 
1422                         ((gui-runtime) (source-path "runtime.c"))
1423                         (else (s+ x ".c"))))
1424               (obj (s+ x (pv O))))
1425           `(,obj (,source "chicken.h" ,chicken_config_h-file)
1426                  ,(lambda () (run (,c-compiler ,@library-compiler-flags
1427                                                ,(c-compiler-output obj) 
1428                                                ,source))))))
1429       (append '(runtime gui-runtime) libchicken-objects0)))
1430
1431(define library-unsafe-compiler-flags
1432  (cons (pv c-compiler-compile-option)
1433        (append (pv c-compiler-options) (pv c-compiler-ptables-options) 
1434                (pv c-compiler-optimization-options) 
1435                (pv c-compiler-shared-options) (pv c-compiler-build-unsafe-runtime-options) 
1436                (pv includes))))
1437
1438(define library-unsafe-objects-rules
1439  (cons* 
1440   (let ((obj (s+ "uruntime" (pv O)))
1441         (source (source-path "runtime.c")))
1442     `(,obj  (,source "chicken.h" ,chicken_config_h-file)
1443             ,(lambda () (run (,c-compiler ,@library-compiler-flags ,source
1444                                           ,(c-compiler-output obj))))))
1445   (map (lambda (x) 
1446          (let ((obj (s+ "u" x (pv O)))
1447                (source (s+ "u" x ".c")))
1448            `(,obj (,source ,"chicken.h" ,chicken_config_h-file)
1449                   ,(lambda () (run (,c-compiler ,@library-unsafe-compiler-flags
1450                                                 ,(c-compiler-output obj) ,source))))))
1451        libchicken-objects0)))
1452
1453
1454(define library-static-compiler-flags
1455  (cons (pv c-compiler-compile-option)
1456        (append (pv c-compiler-options) (pv c-compiler-ptables-options) 
1457                (pv c-compiler-optimization-options) 
1458                (pv c-compiler-build-runtime-options) 
1459                (pv includes))))
1460
1461(define library-static-objects-rules
1462  (map (lambda (x) 
1463         (let ((obj (s+ x "-static" (pv O)))
1464               (source (case x 
1465                         ((runtime)     (source-path (s+ x ".c")))
1466                         ((gui-runtime) (source-path "runtime.c"))
1467                         (else (s+ x ".c")))))
1468           `(,obj (,source  "chicken.h" ,chicken_config_h-file)
1469                  ,(lambda () (run (,c-compiler ,@library-static-compiler-flags
1470                                                ,(c-compiler-output obj) ,source))))))
1471       (append '(runtime gui-runtime) libchicken-objects0)))
1472
1473
1474(define library-unsafe-static-compiler-flags
1475  (cons (pv c-compiler-compile-option)
1476        (append (pv c-compiler-options) (pv c-compiler-ptables-options) 
1477                (pv c-compiler-optimization-options) 
1478                (pv c-compiler-build-unsafe-runtime-options) 
1479                (pv includes))))
1480
1481
1482(define library-unsafe-static-objects-rules
1483  (cons* 
1484   (let ((obj (s+ "uruntime-static" (pv O)))
1485         (source (source-path "runtime.c")))
1486     `(,obj  (,source "chicken.h" ,chicken_config_h-file)
1487             ,(lambda () (run (,c-compiler ,@library-unsafe-static-compiler-flags ,(source-path "runtime.c")
1488                                           ,(c-compiler-output obj))))))
1489   (map (lambda (x) 
1490          (let ((obj (s+ "u" x "-static" (pv O)))
1491                (source (s+ "u" x ".c")))
1492            `(,obj (,source "chicken.h" ,chicken_config_h-file)
1493                   ,(lambda () (run (,c-compiler ,@library-unsafe-static-compiler-flags 
1494                                                 ,(c-compiler-output obj) ,source))))))
1495        libchicken-objects0)))
1496
1497;; rules for compiler objects
1498
1499(define compiler-compiler-flags
1500  (cons (pv c-compiler-compile-option) 
1501        (append (pv c-compiler-options) (pv c-compiler-ptables-options) 
1502                (pv c-compiler-optimization-options) 
1503                (pv c-compiler-shared-options) (pv includes))))
1504
1505
1506(define compiler-objects-rules
1507  (map (lambda (x) 
1508         (let ((obj (s+ x (pv O)))
1509               (source (s+ x ".c")))
1510           `(,obj (,source "chicken.h" ,chicken_config_h-file)
1511                  ,(lambda () (run (,c-compiler ,@compiler-compiler-flags
1512                                                ,(c-compiler-output obj) ,source))))))
1513       compiler-objects0))
1514
1515
1516(define compiler-static-compiler-flags
1517  (cons (pv c-compiler-compile-option)
1518        (append (pv c-compiler-options) (pv c-compiler-ptables-options) 
1519                (pv c-compiler-optimization-options) 
1520                (pv includes))))
1521
1522
1523(define compiler-static-objects-rules
1524  (map (lambda (x) 
1525         (let ((obj (s+ x "-static" (pv O)))
1526               (source (s+ x ".c")))
1527           `(,obj (,source "chicken.h" ,chicken_config_h-file)
1528                  ,(lambda () (run (,c-compiler ,@compiler-static-compiler-flags
1529                                                ,(c-compiler-output obj) ,source))))))
1530       compiler-objects0))
1531
1532;; rules for pcre objects
1533
1534(define pcre-compiler-flags
1535  (cons (pv c-compiler-compile-option)
1536        (append (pv c-compiler-options) (pv c-compiler-ptables-options) 
1537                (pv c-compiler-optimization-options) 
1538                (pv c-compiler-shared-options)  (pv pcre-c-compiler-options) 
1539                (pv pcre-includes))))
1540
1541
1542(define pcre-objects-rules
1543  (map (lambda (x) 
1544         (let ((obj (s+ x (pv O)) )
1545               (source (pcre-source-path (s+ x ".c"))))
1546           `(,obj (,source ,chicken_config_h-file 
1547                           ,@(map pcre-source-path (list "pcre_internal.h" "config.h" "pcre.h" "ucp.h")))
1548                  ,(lambda () (run (,c-compiler ,@pcre-compiler-flags
1549                                                ,(c-compiler-output obj) ,source))))))
1550       pcre-objects0))
1551
1552
1553(define pcre-static-compiler-flags
1554  (cons (pv c-compiler-compile-option)
1555        (append (pv c-compiler-options) (pv c-compiler-ptables-options) 
1556                (pv c-compiler-optimization-options) 
1557                (pv pcre-c-compiler-options)  (pv pcre-includes))))
1558
1559
1560(define pcre-static-objects-rules
1561  (map (lambda (x) 
1562         (let ((obj (s+ x "-static" (pv O)) )
1563               (source (pcre-source-path (s+ x ".c"))))
1564           `(,obj (,source ,chicken_config_h-file 
1565                           ,@(map pcre-source-path (list "pcre_internal.h" "config.h" "pcre.h" "ucp.h")))
1566                  ,(lambda () (run (,c-compiler ,@pcre-compiler-flags
1567                                                ,(c-compiler-output obj) ,source))))))
1568       pcre-objects0))
1569
1570;; rules for assembler objects
1571
1572(define apply-hack-object-rules
1573    (case platform
1574      ((macosx) 
1575       (let ((obj (pv apply-hack-object ))
1576             (source (list (s+ "apply-hack.x86" (pv O)) (s+ "apply-hack.ppc.darwin" (pv O)))))
1577         `(
1578           (,(s+ "apply-hack.ppc.darwin" (pv O)) (,(source-path "apply-hack.ppc.darwin.s"))
1579            ,(lambda () (run ("as" "-arch ppc" 
1580                                         ,(assembler-output (s+ "apply-hack.ppc.darwin" (pv O)))
1581                                         ,(source-path "apply-hack.ppc.darwin.s")))))
1582           (,(s+ "apply-hack.x86" (pv O)) (,(source-path "apply-hack.x86.s"))
1583            ,(lambda () (run ("as" "-arch i386" 
1584                                         ,(assembler-output (s+ "apply-hack.x86" (pv O)))
1585                                         ,(source-path "apply-hack.x86.s")))))
1586           (,obj ,source
1587                 ,(lambda ()
1588                    (run ("lipo" "-create" ,(s+ "-output " ,obj) ,@source))))
1589           )))
1590      (else
1591       (let ((obj (pv apply-hack-object ))
1592             (source (source-path (s+ "apply-hack." (arch) (pv ASM)))))
1593         `((,obj (,source)
1594                 ,(lambda ()
1595                    (run (,assembler ,@(pv assembler-options) ,(pv assembler-compile-option)
1596                                     ,source ,(assembler-output obj))))))))))
1597
1598;; rules for program objects
1599
1600(define program-compiler-flags
1601  (cons (pv c-compiler-compile-option)
1602        (append (pv c-compiler-options) (pv c-compiler-ptables-options) 
1603                (pv c-compiler-optimization-options) 
1604                (pv c-compiler-shared-options) (pv includes))))
1605
1606(define program-objects-rules
1607  (map (lambda (x) 
1608         (let ((obj (s+ x (pv O)))
1609               (source (s+ x ".c")))
1610           `(,obj (,source "chicken.h" ,chicken_config_h-file)
1611                  ,(lambda () (run (,c-compiler ,@program-compiler-flags
1612                                                ,(c-compiler-output obj) ,source))))))
1613       program-objects0))
1614
1615
1616(define program-static-compiler-flags
1617  (cons (pv c-compiler-compile-option)
1618        (append (pv c-compiler-options) (pv c-compiler-ptables-options) 
1619                (pv c-compiler-optimization-options) 
1620                (pv includes))))
1621
1622
1623(define program-static-objects-rules
1624  (map (lambda (x) 
1625         (let ((obj (s+ x "-static" (pv O)))
1626               (source (s+ x ".c")))
1627           `(,obj (,source "chicken.h" ,chicken_config_h-file)
1628                  ,(lambda () (run (,c-compiler ,@program-static-compiler-flags
1629                                                ,(c-compiler-output obj) ,source))))))
1630       `(csi chicken-bug)))
1631
1632
1633;; rules for libchicken
1634
1635
1636
1637(define libchicken_so-rule
1638  `(,libchicken_so-file
1639    (,@libchicken-shared-objects ,@pcre-shared-objects ,(pv apply-hack-object))
1640    ,(lambda ()
1641       (run (,linker ,@(pv linker-options) ,@(pv linker-link-shared-library-options) 
1642                     ,@libchicken_so-linker-options 
1643                     ,(linker-output libchicken_so-file)
1644                     ,@libchicken-shared-objects ,@pcre-shared-objects ,(pv apply-hack-object)
1645                     ,@libchicken_so-libraries
1646                     ))
1647       (if (pv soname-version)
1648           (symlink libchicken_so-file (s+ "libchicken" (pv SO)))))))
1649
1650
1651(define libuchicken_so-rule
1652  `(,libuchicken_so-file
1653    (,@libuchicken-shared-objects ,@pcre-shared-objects ,(pv apply-hack-object))
1654    ,(lambda ()
1655       (run (,linker ,@(pv linker-options) ,@(pv linker-link-shared-library-options) 
1656                     ,@libuchicken_so-linker-options 
1657                     ,(linker-output libuchicken_so-file)
1658                     ,@libuchicken-shared-objects ,@pcre-shared-objects ,(pv apply-hack-object)
1659                     ,@libuchicken_so-libraries
1660                     ))
1661       (if (pv soname-version)
1662           (symlink libuchicken_so-file (s+ "libuchicken" (pv SO)))))))
1663
1664(define cygchicken-0.dll-rule
1665  `("cygchicken-0.dll"
1666    (,@libuchicken-shared-objects ,@pcre-shared-objects ,(pv apply-hack-object))
1667    ,(lambda ()
1668       (run (,c-compiler -shared  ,(c-compiler-output libchicken_so-file) 
1669                         "-Wl,--dll" "-Wl,--add-stdcall-alias"
1670                         "-Wl,--enable-stdcall-fixup"   "-Wl,--warn-unresolved-symbols"
1671                         "-Wl,--dll-search-prefix=cyg"  "-Wl,--allow-multiple-definition"
1672                         "-Wl,--allow-shlib-undefined"   "-Wl,--export-dynamic"
1673                         "-Wl,--out-implib=libchicken.dll.a" "-Wl,--export-all-symbols"
1674                         "-Wl,--enable-auto-import"
1675                         "-Wl,--whole-archive" ,@(pv libchicken-shared-objects) ,@(pv pcre-shared-objects) 
1676                         ,(pv apply-hack-object) 
1677                         "-Wl,--no-whole-archive" ,@(pv libchicken_so-libraries))))))
1678
1679
1680(define cyguchicken-0.dll-rule
1681  `("cygchicken-0.dll"
1682    (,@libuchicken-shared-objects ,@pcre-shared-objects ,(pv apply-hack-object))
1683    ,(lambda ()
1684       (run (,c-compiler -shared ,(c-compiler-output libuchicken_so-file) 
1685                         "-Wl,--dll" "-Wl,--add-stdcall-alias"
1686                         "-Wl,--enable-stdcall-fixup"  "-Wl,--warn-unresolved-symbols"
1687                         "-Wl,--dll-search-prefix=cyg" "-Wl,--allow-multiple-definition"
1688                         "-Wl,--allow-shlib-undefined" "-Wl,--export-dynamic"
1689                         "-Wl,--out-implib=libchicken.dll.a" "-Wl,--export-all-symbols"
1690                         "-Wl,--enable-auto-import"
1691                         "-Wl,--whole-archive" ,@(pv libuchicken-shared-objects) ,@(pv pcre-shared-objects) 
1692                         ,(pv apply-hack-object) 
1693                         "-Wl,--no-whole-archive" ,@(pv libuchicken_so-libraries))))))
1694
1695(define libchickengui_so-rule
1696  `(,libchickengui_so-file
1697    (,@libchickengui-shared-objects ,@pcre-shared-objects ,(pv apply-hack-object))
1698    ,(lambda ()
1699       (run  (,linker ,@(pv linker-options) ,@(pv linker-link-shared-library-options) 
1700                      ,@libchickengui_so-linker-options 
1701                      ,(linker-output libchickengui_so-file)
1702                      ,@libchickengui-shared-objects ,@pcre-shared-objects 
1703                      ,(pv apply-hack-object) ,@libchickengui_so-libraries
1704                      )))))
1705
1706(define libchicken_a-rule
1707  (let ((target (s+ "libchicken" (pv A))))
1708    `(,target (,@libchicken-static-objects ,@pcre-static-objects ,(pv apply-hack-object) )
1709              ,(lambda ()
1710                 (run (,librarian ,@(librarian-options) 
1711                                  ,(librarian-output target) ,(pv apply-hack-object)
1712                                  ,@libchicken-static-objects ,@pcre-static-objects 
1713                                  ))))))
1714
1715(define libuchicken_a-rule
1716  (let ((target (s+ "libuchicken" (pv A))))
1717    `(,target (,@libuchicken-static-objects ,@pcre-static-objects ,(pv apply-hack-object) )
1718              ,(lambda ()
1719                 (run (,librarian ,@(librarian-options) 
1720                                  ,(librarian-output target) ,(pv apply-hack-object)
1721                                  ,@libuchicken-static-objects ,@pcre-static-objects 
1722                                  ))))))
1723
1724(define libchickengui_a-rule
1725  (let ((target (s+ "libchickengui" (pv A))))
1726    `(,target (,@libchickengui-static-objects ,@pcre-static-objects ,(pv apply-hack-object))
1727              ,(lambda ()
1728                 (run (,librarian ,@(librarian-options) 
1729                                  ,(librarian-output target) ,(pv apply-hack-object)
1730                                  ,@libchickengui-static-objects ,@pcre-static-objects ))))))
1731
1732(define libs-rule
1733  `("libs" ,libs-target))
1734
1735;; rules for executables
1736
1737(define chicken-shared-executable-rule
1738  `(,chicken-shared-executable (,@compiler-objects ,primary-libchicken)
1739                               ,(lambda ()
1740                                  (run (,linker ,@(pv linker-options) ,@(pv linker-executable-options) 
1741                                                ,@(pv linker-link-shared-program-options) ,@(pv libraries)
1742                                                ,(s+ (pv linker-library-prefix) "chicken" (linker-library-suffix)  )
1743                                                ,@compiler-objects 
1744                                                ,(linker-output chicken-shared-executable)  )))))
1745
1746
1747(define csi-shared-executable-rule
1748  (let ((obj (s+ "csi" (pv O))))
1749    `(,csi-shared-executable (,obj ,primary-libchicken)
1750                             ,(lambda ()
1751                                (run (,linker ,@(pv linker-options) ,@(pv linker-executable-options) 
1752                                              ,@(pv linker-link-shared-program-options)  ,@(pv libraries)
1753                                              ,(s+ (pv linker-library-prefix) "chicken" (linker-library-suffix))
1754                                              ,obj ,(linker-output csi-shared-executable) ))))))
1755
1756
1757(define chicken-setup-program-rule
1758  (let ((obj (s+ "chicken-setup" (pv O))))
1759    `(,chicken-setup-program (,obj ,primary-libchicken)
1760                             ,(lambda ()
1761                                (run (,linker ,@(pv linker-options) ,@(pv linker-executable-options) 
1762                                              ,@(pv linker-link-shared-program-options)  ,@(pv libraries)
1763                                              ,(s+ (pv linker-library-prefix) "chicken" (linker-library-suffix))
1764                                              ,obj ,(linker-output chicken-setup-program) ))))))
1765
1766
1767(define chicken-profile-program-rule
1768  (let ((target (s+ "chicken-profile" (pv EXE)))
1769        (obj    (s+ "chicken-profile" (pv O))))
1770    `(,target (,obj ,primary-libchicken)
1771              ,(lambda ()
1772                 (run (,linker ,@(pv linker-options) ,@(pv linker-executable-options) 
1773                               ,@(pv linker-link-shared-program-options)  ,@(pv libraries)
1774                               ,(s+ (pv linker-library-prefix) "chicken" (linker-library-suffix))
1775                               ,obj ,(linker-output target)))))))
1776
1777
1778(define csc-program-rule
1779  (let ((target  (s+ "csc" (pv EXE)))
1780        (obj     (s+ "csc" (pv O)))) 
1781    `(,target (,obj ,primary-libchicken)
1782              ,(lambda ()
1783                 (run (,linker ,@(pv linker-options) ,@(pv linker-executable-options) 
1784                               ,@(pv linker-link-shared-program-options)  ,@(pv libraries)
1785                               ,(s+ (pv linker-library-prefix) "chicken" (linker-library-suffix))
1786                               ,obj ,(linker-output target)))))))
1787
1788;; rules for static executables
1789
1790(define chicken-static-executable-rule
1791  (let ((source `(,@compiler-static-objects ,(s+ "libchicken" (pv A)))))
1792    `(,chicken-static-executable ,source
1793                                 ,(lambda ()
1794                                    (run (,linker ,@(pv linker-options) ,@(pv linker-static-options) 
1795                                                  ,@(pv libraries) ,@source
1796                                                  ,(linker-output chicken-static-executable)))))))
1797
1798(define csi-static-executable-rule 
1799  (let ((source `(,(s+ "csi" "-static" (pv O)) ,(s+ "libchicken" (pv A)))))
1800    `(,csi-static-executable ,source
1801                             ,(lambda ()
1802                                (run (,linker ,@(pv linker-options) ,@(pv linker-static-options) 
1803                                              ,@(pv libraries) ,@source
1804                                              ,(linker-output csi-static-executable)))))))
1805
1806
1807(define chicken-bug-program-rule 
1808  (let ((target   (s+ "chicken-bug" (pv EXE)))
1809        (source  `(,(s+ "chicken-bug" "-static" (pv O)) ,(s+ "libchicken" (pv A)))))
1810    `(,target ,source 
1811              ,(lambda ()
1812                 (run (,linker ,@(pv linker-options) ,@(pv linker-static-options) 
1813                               ,@(pv libraries) ,@source
1814                               ,(linker-output target)))))))
1815
1816
1817;; info documentation
1818
1819(define chicken_info-rule
1820  `("chicken.info" (,(source-path "chicken.texi"))
1821    ,(lambda ()
1822       (run (,makeinfo ,@(pv makeinfo-options) ,(source-path "chicken.texi"))))))
1823
1824
1825;; installation rules
1826
1827(define (install opt f dest)
1828  (run (,install-command ,@(pv opt) ,f ,dest)))
1829
1830(define install-libs-rule
1831  `("install-libs" ()
1832    ,(lambda ()
1833       (if (not (zero? (string-length dest-dir)))  (mkdir dest-dir))
1834
1835       (mkdir (dest-path (pv lib-dir)))
1836       (mkdir (dest-path (pv chicken-lib-dir)))
1837       (mkdir (dest-path (pv egg-dir)))
1838       (mkdir (dest-path (pv inc-dir)))
1839       (mkdir (dest-path (pv bin-dir)))
1840
1841       (install install-program-static-library-options 
1842                (s+ "libchicken" (pv A)) (dest-path (pv lib-dir)))
1843       (install install-program-static-library-options 
1844                (s+ "libuchicken" (pv A)) (dest-path (pv lib-dir)))
1845       
1846       (if libchicken-import-library
1847           (install install-program-static-library-options 
1848                    libchicken-import-library (dest-path (pv lib-dir))))
1849       (if libuchicken-import-library
1850           (install install-program-static-library-options 
1851                    libuchicken-import-library (dest-path (pv lib-dir))))
1852
1853       (case platform
1854         ((mingw mingw-msys cygwin)   
1855          (begin
1856            (install install-program-static-library-options 
1857                     (s+ "libchickengui" (pv A)) (dest-path (pv lib-dir)))
1858            (if libchickengui-import-library
1859                (install install-program-static-library-options 
1860                         libchickengui-import-library (dest-path (pv lib-dir)))))))
1861
1862       (if (pv postinstall-static-library)
1863           (run (,(pv postinstall-program) ,@(pv postinstall-program-flags)
1864                 ,(make-pathname (pv lib-dir) (s+ "libchicken" (pv A))))
1865                (,(pv postinstall-program) ,@(pv postinstall-program-flags)
1866                 ,(make-pathname (pv lib-dir) (s+ "libuchicken" (pv A))))))
1867       
1868
1869       (install install-program-file-options
1870                "chicken.h"
1871                (dest-path (pv inc-dir)))
1872
1873       
1874       (install install-program-file-options
1875                chicken_config_h-file (dest-path (pv inc-dir)))
1876       
1877       (if (not (pv static-build?))
1878           (begin
1879             (if (pv dlls-in-path?)
1880                 (begin
1881                   (install install-program-shared-library-options 
1882                            libchicken_so-file (dest-path (pv bin-dir)))
1883                   (install install-program-shared-library-options 
1884                            libuchicken_so-file (dest-path (pv bin-dir))))
1885                 (begin
1886                   (install install-program-shared-library-options 
1887                            libchicken_so-file (dest-path (pv lib-dir)))
1888                   (install install-program-shared-library-options 
1889                            libuchicken_so-file (dest-path (pv lib-dir)))))
1890
1891             (if (pv soname-version)
1892                 (let ((libdir (dest-path (pv lib-dir))))
1893                   (symlink libchicken_so-file (s+ "libchicken" (pv SO)))
1894                   (symlink libuchicken_so-file (s+ "libuchicken" (pv SO)))))
1895             
1896
1897             (case platform
1898               ((mingw mingw-msys cygwin)
1899                (install install-program-shared-library-options 
1900                         (s+ "libchickengui" (pv SO)) (dest-path (pv bin-dir)))))
1901             ))
1902       )))
1903
1904
1905(define (make-install-rule needs-relinking?)
1906  (if needs-relinking?
1907
1908      `("install" ()
1909        ,(lambda ()
1910           (for-each
1911            (lambda (x) 
1912              (run (,remove-command ,@(pv remove-command-options) ,(s+ x (pv EXE)))))
1913            `(,chicken-program ,csi-program ,csc-program 
1914                               ,chicken-profile-program ,chicken-setup-program))
1915           (runtime-linker-path (pv lib-dir) )
1916           (make/proc (cons (make-install-rule #f) (get-rules)) "install" )
1917           (for-each
1918            (lambda (x) 
1919              (run (,(pv make-writable-command) 
1920                    ,(dest-path (s+ (make-pathname (pv bin-dir) x) (pv EXE))))))
1921            `(,chicken-program ,csi-program ,csc-program 
1922                               ,chicken-profile-program ,chicken-setup-program))
1923           (if (not (pv static-build?))
1924               (run (,(pv make-writable-command) 
1925                     ,(dest-path (s+ (make-pathname (pv bin-dir) chicken-setup-program) (pv EXE))))))
1926           ))
1927
1928      `("install" ,(append targets (list "install-libs" ))
1929        ,(lambda ()
1930
1931           (if (not (zero? (string-length dest-dir)))
1932               (mkdir dest-dir))
1933           
1934           (for-each
1935            (lambda (x) (mkdir (dest-path (pv x))))
1936            `(,bin-dir ,top-man-dir ,man-dir ,info-dir ,doc-dir))
1937
1938           (for-each
1939            (lambda (x) 
1940              (install install-program-executable-options
1941                       (s+ x (pv EXE)) (dest-path (pv bin-dir))))
1942            `(,chicken-program ,csi-program ,csc-program 
1943                               ,chicken-profile-program ,chicken-bug-program))
1944
1945           (if (pv postinstall-program)
1946               (let ((bdir (dest-path (pv bin-dir))))
1947                 (for-each
1948                  (lambda (x) 
1949                    (run (,(pv postinstall-program) ,@(pv postinstall-program-flags) 
1950                          ,(make-pathname bdir x))))
1951                  `(,chicken-program ,csi-program ,csc-program 
1952                                     ,chicken-profile-program ,chicken-bug-program))))
1953           
1954           (if (not (pv static-build?))
1955               (let ((bdir (dest-path (pv bin-dir))))
1956                 (install install-program-executable-options (s+ chicken-setup-program (pv EXE)) bdir)
1957                 (if (pv postinstall-program)
1958                     (run (,(pv postinstall-program) ,@(pv postinstall-program-flags) 
1959                           ,(make-pathname bdir chicken-setup-program))))))
1960
1961           (let ((mdir (dest-path (pv man-dir))))
1962             (for-each
1963              (lambda (x) (install install-program-file-options (s+ src-dir x) mdir))
1964              `("chicken.1" "csi.1" "csc.1" "chicken-setup.1" "chicken-profile.1" "chicken-bug.1")))
1965
1966           (let ((hdir (make-pathname (dest-path (pv doc-dir)) "html")))
1967             (mkdir hdir)
1968             (run* (,install-command ,@(pv install-program-file-options)
1969                                     ,(make-pathname (source-path "html") "*.html")
1970                                     ,hdir)))
1971           
1972           (run* (,install-command ,@(pv install-program-file-options) "chicken.pdf"
1973                                   ,(dest-path (pv doc-dir))))
1974
1975           (let ((ddir (dest-path (pv doc-dir))))
1976             (for-each
1977              (lambda (x) (install install-program-file-options (source-path x) ddir))
1978              `("README" "LICENSE")))
1979
1980           (let ((ddir (dest-path (pv data-dir))))
1981             (for-each
1982              (lambda (x) (install install-program-file-options (source-path x) ddir))
1983              `("chicken-more-macros.scm" "chicken-ffi-macros.scm" "chicken-sys-macros.scm"))
1984             (run (,install-command ,@(pv install-program-file-options)
1985                                    "*.exports" ,ddir)))
1986
1987
1988           (run* (,install-command ,@(pv install-program-file-options) "chicken.info"
1989                                   ,(dest-path (pv info-dir))))
1990           
1991           (run* (,install-info-command ,(s+ "--info-dir=" (dest-path (pv info-dir)))
1992                                        "chicken.info"))
1993           
1994           (case platform
1995             ((mingw mingw-msys cygwin)
1996              (install install-program-executable-options 
1997                       (source-path "csibatch.bat")
1998                       (dest-path (pv bin-dir)))))
1999           ))))
2000
2001
2002(define install-rule  (make-install-rule  (pv needs-relinking?)))
2003
2004(define uninstall-rule
2005  `("uninstall" ()
2006    ,(lambda ()
2007       (let ((bdir (dest-path (pv bin-dir)))
2008             (ldir (dest-path (pv lib-dir)))
2009             (mdir (dest-path (pv man-dir)))
2010             (idir (dest-path (pv inc-dir))))
2011         (for-each
2012          (lambda (x) 
2013            (run (,remove-command ,@(pv remove-command-options) ,(make-pathname bdir (s+ x (pv EXE))))))
2014          `(,chicken-program ,csi-program ,csc-program ,chicken-bug-program
2015                             ,chicken-profile-program ,chicken-setup-program))
2016         
2017         (run (,remove-command ,@(pv remove-command-options) 
2018                               ,@(map (lambda (x) (make-pathname ldir (s+ x "*.*"))) 
2019                                      `("libchicken" "libuchicken"))))
2020
2021         (run (,remove-command ,@(pv remove-command-options) 
2022                               ,@(map (lambda (x) (make-pathname bdir (s+ x "*.*"))) 
2023                                      `("libchicken" "libuchicken"))))
2024
2025         (case platform
2026           ((cygwin) 
2027            (run (,remove-command ,@(pv remove-command-options) 
2028                                  ,@(map (lambda (x) (make-pathname bdir (s+ x "*.*"))) 
2029                                         `("cygchicken" "cyguchicken"))))))
2030         
2031         (run (,remove-command ,@(pv remove-command-options) 
2032                               ,@(map (lambda (x) (make-pathname mdir (s+ x ".1"))) 
2033                                      `(chicken csi csc chicken-profile chicken-setup chicken-bug))))
2034
2035         (run (,remove-command ,@(pv remove-command-options) 
2036                               ,@(map (lambda (x) (make-pathname idir (s+ x ".h"))) 
2037                                      `(chicken chicken-config ))))
2038
2039         (run (,remove-command ,@(pv remove-command-recursive-options)
2040                               ,(dest-path (pv data-dir))))
2041
2042         (run* (,uninstall-info-command ,(s+ "--infodir=" (dest-path (pv info-dir))) "chicken.info"))
2043
2044         (run* (,remove-command ,@(pv remove-command-options)
2045                                ,(make-pathname (dest-path (pv info-dir)) "chicken.info")))
2046
2047
2048         (case platform
2049           ((cygwin mingw mingw-msys)
2050            (run (,remove-command ,@(pv remove-command-options)
2051                                  ,(make-pathname bdir "csibatch.bat")))))
2052
2053         ))))
2054
2055;; rules for C sources
2056
2057(define library-c-sources-private `(data-structures ports files extras srfi-69))
2058(define library-c-sources-other   `(eval lolevel tcp srfi-1 srfi-4 srfi-13 srfi-14 srfi-18
2059                                         utils posixunix posixwin scheduler profiler stub match))
2060
2061(define library_c-rule 
2062  (let ((target "library.c")
2063        (source  (map source-path (list "library.scm" "version.scm" "banner.scm"))))
2064    `(,target ,source
2065              ,(lambda ()
2066                 (run (,(pv chicken-bootstrap) ,(car source) ,@(pv chicken-library-options)
2067                       ,(s+ "-output-file " target)))))))
2068
2069
2070(define regex_c-rule 
2071  (let ((target "regex.c")
2072        (source (map source-path (list "regex.scm" "version.scm" "banner.scm"))))
2073    `(,target ,source
2074              ,(lambda ()
2075                 (run (,(pv chicken-bootstrap) ,(car source)
2076                       ,@(pv chicken-library-options)  ,@(pv chicken-pcre-library-options)
2077                       ,(s+ "-output-file " target)))))))
2078
2079
2080(define library-c-source-private-rules
2081  (map (lambda (x)
2082         (let ((target (s+ x ".c"))
2083               (source (map source-path (list (s+ x ".scm") "private-namespace.scm"))))
2084           `(,target ,source
2085                     ,(lambda ()
2086                        (run (,(pv chicken-bootstrap) ,(car source) ,@(pv chicken-library-options)
2087                              ,(s+ "-extend " "private-namespace.scm")
2088                              ,(s+ "-output-file " target)))))))
2089       library-c-sources-private))
2090
2091
2092(define library-c-source-other-rules
2093  (map (lambda (x)
2094         (let ((target (s+ x ".c"))
2095               (source (list (source-path (s+ x ".scm") ))))
2096           `(,target ,source
2097                     ,(lambda ()
2098                        (run (,(pv chicken-bootstrap) ,(car source )
2099                              ,@(pv chicken-library-options)
2100                              ,(s+ "-output-file " target)))))))
2101       library-c-sources-other))
2102
2103
2104(define ulibrary_c-rule 
2105  (let ((target "ulibrary.c")
2106        (source (map source-path (list "library.scm" "version.scm" "banner.scm"))))
2107    `(,target ,source
2108              ,(lambda ()
2109                 (run (,(pv chicken-bootstrap) ,(car source )
2110                       ,@(pv chicken-library-options) ,@(pv chicken-unsafe-options)
2111                       ,(s+ "-output-file " target)))))))
2112
2113
2114(define uregex_c-rule 
2115  (let ((target "uregex.c")
2116        (source (map source-path (list "regex.scm" "version.scm" "banner.scm"))))
2117    `(,target ,source
2118              ,(lambda ()
2119                 (run (,(pv chicken-bootstrap) ,(car source )
2120                       ,@(pv chicken-library-options)  ,@(pv chicken-unsafe-options) 
2121                       ,@(pv chicken-pcre-library-options)
2122                       ,(s+ "-output-file " target)))))))
2123
2124
2125(define library-c-source-private-unsafe-rules
2126  (map (lambda (x)
2127         (let ((target (s+ "u" x ".c"))
2128               (source (map source-path (list (s+ x ".scm") "private-namespace.scm"))))
2129           `(,target ,source
2130                     ,(lambda ()
2131                        (run (,(pv chicken-bootstrap) ,(car source )
2132                              ,@(pv chicken-library-options) ,@(pv chicken-unsafe-options) 
2133                              ,(s+ "-extend " "private-namespace.scm")
2134                              ,(s+ "-output-file " target)))))))
2135       library-c-sources-private))
2136
2137
2138(define library-c-source-other-unsafe-rules
2139  (map (lambda (x)
2140         (let ((target (s+ "u" x ".c"))
2141               (source (list (source-path (s+ x ".scm") ))))
2142           `(,target ,source
2143                     ,(lambda ()
2144                        (run (,(pv chicken-bootstrap) ,(car source )
2145                              ,@(pv chicken-library-options) ,@(pv chicken-unsafe-options)
2146                              ,(s+ "-output-file " target)))))))
2147       library-c-sources-other))
2148
2149(define chicken-c-sources
2150  `(support compiler optimizer batch-driver c-platform c-backend ))
2151
2152(define chicken_c-rule
2153  (let ((target "chicken.c")
2154        (source (map source-path
2155                     (list "chicken.scm" "chicken-more-macros.scm" "chicken-ffi-macros.scm"
2156                           "private-namespace.scm"))))
2157    `(,target ,source
2158              ,(lambda ()
2159                 (run (,(pv chicken-bootstrap) ,(car source )
2160                       ,@(pv chicken-compiler-options) 
2161                       ,(s+ "-output-file " target)))))))
2162
2163(define chicken-c-source-rules 
2164  (map (lambda (x)
2165         (let ((target (s+ x ".c"))
2166               (source (map source-path
2167                            ((lambda (lst)
2168                               (case x
2169                                 ((support)  (append lst (list "banner.scm")))
2170                                 (else lst)))
2171                             (list (s+ x ".scm") "private-namespace.scm")))))
2172           `(,target ,source
2173                     ,(lambda ()
2174                        (run (,(pv chicken-bootstrap) ,(car source) ,@(pv chicken-compiler-options)
2175                              ,(s+ "-output-file " target)))))))
2176       chicken-c-sources))
2177
2178(define csi_c-rule
2179  (let ((target "csi.c")
2180        (source (map source-path
2181                     (list "csi.scm" "banner.scm" "chicken-more-macros.scm" 
2182                           "private-namespace.scm"))))
2183    `(,target ,source
2184              ,(lambda ()
2185                 (run (,(pv chicken-bootstrap) ,(car source )
2186                       ,@(pv chicken-program-options) ,(s+ "-extend " "private-namespace.scm")
2187                       ,(s+ "-output-file " target)))))))
2188
2189
2190(define chicken-setup_c-rule
2191  (let ((target "chicken-setup.c")
2192        (source (map source-path (list "chicken-setup.scm" "chicken-more-macros.scm" ))))
2193    `(,target ,source
2194              ,(lambda ()
2195                 (run (,(pv chicken-bootstrap) ,(car source )
2196                       ,@(pv chicken-program-options) 
2197                       ,(s+ "-output-file " target)))))))
2198
2199
2200(define chicken-program-c-sources `(chicken-profile csc chicken-bug))
2201
2202(define chicken-program-c-source-rules
2203  (map (lambda (x)
2204         (let ((target (s+ x ".c"))
2205               (source (map source-path (list (s+ x ".scm") ))))
2206           `(,target ,source
2207                     ,(lambda ()
2208                        (run (,(pv chicken-bootstrap) ,(car source) ,@(pv chicken-program-options)
2209                              ,(s+ "-output-file " target)))))))
2210       chicken-program-c-sources))
2211
2212;; distribution files
2213
2214(define distfiles-rule
2215  `("distfiles" 
2216    ,(cons "buildsvnrevision"
2217           (map (lambda (x) (s+ x ".c"))
2218                `(library eval data-structures ports files extras lolevel
2219                          utils tcp srfi-1 srfi-4 srfi-13 srfi-14 srfi-18 srfi-69 posixunix
2220                          posixwin regex scheduler profiler stub match ulibrary ueval
2221                          udata-structures uports ufiles uextras ulolevel uutils utcp usrfi-1                     
2222                          usrfi-4 usrfi-13 usrfi-14 usrfi-18 usrfi-69 uposixunix uposixwin
2223                          uregex chicken-profile chicken-setup csc csi chicken batch-driver
2224                          compiler optimizer support c-platform c-backend chicken-bug)))
2225    ,(lambda () (call-with-output-file "distfiles" (lambda (out) (display "" out))))))
2226
2227;; cleaning up
2228
2229(define clean-rule
2230  `("clean" ()
2231    ,(lambda ()
2232       (run* (,remove-command 
2233              ,@(pv remove-command-options)
2234              ,@(filter identity
2235                        (let ((lst (append pcre-objects0
2236                                           `(runtime uruntime 
2237                                                     library eval data-structures ports files 
2238                                                     extras lolevel utils tcp srfi-1 srfi-4 srfi-13 srfi-14 srfi-18 srfi-69
2239                                                     posixunix posixwin regex scheduler profiler stub match ulibrary ueval
2240                                                     udata-structures uports ufiles uextras ulolevel uutils utcp usrfi-1
2241                                                     usrfi-4 usrfi-13 usrfi-14 usrfi-18 usrfi-69 uposixunix uposixwin
2242                                                     uregex chicken-profile chicken-setup chicken-bug csc csi chicken
2243                                                     batch-driver compiler optimizer support c-platform c-backend))))
2244                          (append
2245                           (list libchicken_so-file libuchicken_so-file libchickengui_so-file 
2246                                 "bootstrap.tar.gz" "chicken.info" (pv apply-hack-object))
2247                           (pv clean-mingw-libs)
2248                           (map (lambda (x) (s+ x (pv EXE))) 
2249                                `(chicken csi csc chicken-setup chicken-boot
2250                                          chicken-profile csi-static csc-static 
2251                                          chicken-static chicken-bug))
2252                           (map (lambda (x) (s+ x (pv A))) `(libchicken libuchicken libchickengui))
2253                           (map (lambda (x) (s+ x (pv O))) lst)
2254                           (map (lambda (x) (s+ x "-static" (pv O))) lst)
2255                           ))))))))
2256
2257(define confclean-rule
2258  `("confclean" ()
2259    ,(lambda ()
2260       (run* (,remove-command ,@(pv remove-command-options)
2261                              "chicken-config.h" "chicken-defaults.h" "buildsvnrevision")))))
2262
2263(define spotless-rule
2264  `("spotless" ("distclean")
2265    ,(lambda ()
2266       (run* (,remove-command ,@(pv remove-command-options)
2267                              ,@(cons* "*.exports" "distfiles"
2268                                      (map (lambda (x) (s+ x ".c"))
2269                                           `(library eval data-structures ports files
2270                                                     extras lolevel utils tcp srfi-1 srfi-4 srfi-13 srfi-14 srfi-18 srfi-69
2271                                                     posixunix posixwin regex scheduler profiler stub match ulibrary ueval
2272                                                     udata-structures uports ufiles uextras ulolevel uutils utcp usrfi-1
2273                                                     usrfi-4 usrfi-13 usrfi-14 usrfi-18 usrfi-69 uposixunix uposixwin
2274                                                     uregex chicken-profile chicken-setup chicken-bug csc csi chicken
2275                                                     batch-driver compiler optimizer support c-platform c-backend))))))))
2276
2277(define distclean-rule
2278  `("distclean" ("clean" "confclean") ))
2279
2280;; run tests
2281
2282(define check-rule
2283  `("check"  ("all")
2284    ,(lambda () (run (cd tests "; " sh runtests.sh)))))
2285
2286
2287;; Only for UNIX, yet:
2288
2289(define fullcheck-rule
2290  `("fullcheck" ("check" "compiler-check")))
2291
2292(define compiler-check-rule
2293  `("compiler-check" ()
2294    ,(lambda ()
2295       (print "======================================== packing ...")
2296       (make/proc (get-rules) "dist" )
2297       (run (,(pv remove-command) ,@(pv remove-command-recursive-options) 
2298             "tests/chicken-*")
2299            (tar "-C tests" -zxf "`ls -t chicken-*.tar.gz | head -1`"))
2300
2301       (print "======================================== building stage 1 ...")
2302       (let* ((cwd (current-directory))
2303              (options1 (cons '(static-build . #t) options))
2304              (rules1  (compute-rules options1)))
2305         (current-directory (ipipe read-line (sh -c "\"ls tests/chicken-*\"")))
2306         (compute-rules (cons '(static-build . #t) options)))
2307         (make/proc rules1 "confclean")
2308         (make/proc rules1 "all")
2309         (run (sh -c "\"touch *.scm\""))
2310         (current-directory cwd)
2311
2312       (print "======================================== building stage 2 ...")
2313       (let ((cwd (current-directory)))
2314         (current-directory (ipipe read-line (ls "tests/chicken-*")))
2315         (make/proc (get-rules) "confclean")
2316         (make/proc (get-rules) "all")
2317         (current-directory cwd)
2318         (run (cat "tests/chicken-*/*.c" > "tests/stage2.out")))
2319
2320       (print "======================================== building stage 3 ...")
2321       (let ((cwd (current-directory)))
2322         (current-directory (ipipe read-line (ls -l "tests/chicken-*")))
2323         (make/proc (get-rules) "confclean")
2324         (make/proc (get-rules) "all")
2325         (current-directory cwd)
2326         (run (cat "tests/chicken-*/*.c" > "tests/stage3.out"))
2327         (run (diff "tests/stage2.out" "tests/stage3.out" > "tests/stages.diff"))
2328         (run (,(pv remove-command) ,@(pv remove-command-recursive-options) "tests/chicken-*"))))))
2329
2330
2331;; bootstrap from C source tarball
2332
2333(define bootstrap-rule
2334  (let ((archive "bootstrap.tar.gz"))
2335    `("bootstrap" (,archive)
2336      ,(lambda ()
2337         (run (gzip -d ,(s+ "-c " archive) "|" tar xvf -))
2338         (run (touch "*.c"))
2339         (make/proc (compute-rules (cons '(static-build . #t) options)) (s+ "chicken" (pv EXE)))
2340         (run (cp ,(s+ "chicken" (pv EXE)) ,(s+ "chicken-boot" (pv EXE))))
2341         (run (sh -c "\"touch *.scm\""))
2342         ))))
2343
2344(define bootstrap_tar_gz-rule
2345  (let ((target "bootstrap.tar.gz"))
2346    `(,target ("distfiles")
2347              ,(lambda ()
2348                 (run (tar cfz ,target 
2349                           ,@(map (lambda (x) (s+ x ".c")) 
2350                                  (append `(library eval data-structures ports files extras 
2351                                                    lolevel utils tcp srfi-1 srfi-4 srfi-13 srfi-14 srfi-18 srfi-69 
2352                                                    posixunix posixwin regex scheduler profiler stub match)
2353                                          compiler-objects0))))))))
2354
2355
2356(define rules 
2357  (append
2358   `(
2359     ,all-rule 
2360     ,buildsvnrevision-rule
2361     ,chicken-config_h-rule
2362     ,chicken-defaults_h-rule
2363     ,chicken_h-rule
2364     ,libchicken_so-rule
2365     ,libuchicken_so-rule
2366     ,cygchicken-0.dll-rule   
2367     ,cyguchicken-0.dll-rule
2368     ,libchickengui_so-rule
2369     ,libchicken_a-rule
2370     ,libuchicken_a-rule
2371     ,libchickengui_a-rule
2372     ,libs-rule
2373     ,chicken-shared-executable-rule   
2374     ,csi-shared-executable-rule
2375     ,chicken-setup-program-rule
2376     ,chicken-profile-program-rule
2377     ,csc-program-rule
2378     ,chicken-static-executable-rule
2379     ,csi-static-executable-rule 
2380     ,chicken-bug-program-rule 
2381     ,chicken_info-rule
2382     ,install-libs-rule
2383     ,install-rule
2384     ,uninstall-rule
2385     ,library_c-rule 
2386     ,regex_c-rule 
2387     ,ulibrary_c-rule 
2388     ,uregex_c-rule 
2389     ,chicken_c-rule
2390     ,csi_c-rule
2391     ,chicken-setup_c-rule
2392     ,distfiles-rule
2393     ,clean-rule
2394     ,confclean-rule
2395     ,spotless-rule
2396     ,distclean-rule
2397     ,check-rule
2398     ,fullcheck-rule
2399     ,compiler-check-rule
2400     ,bootstrap-rule
2401     ,bootstrap_tar_gz-rule
2402     )
2403   apply-hack-object-rules
2404   library-objects-rules
2405   library-unsafe-objects-rules
2406   library-static-objects-rules
2407   library-unsafe-static-objects-rules
2408   compiler-objects-rules
2409   compiler-static-objects-rules
2410   pcre-objects-rules
2411   pcre-static-objects-rules
2412   program-objects-rules
2413   program-static-objects-rules
2414   library-c-source-private-rules
2415   library-c-source-other-rules
2416   library-c-source-private-unsafe-rules
2417   library-c-source-other-unsafe-rules
2418   chicken-c-source-rules 
2419   chicken-program-c-source-rules
2420   ))
2421   
2422   (define (get-rules) (filter (lambda (x) (car x)) rules))
2423
2424  (get-rules))
2425
2426(define (main options operands)
2427  (if (print-rules)
2428      (begin (pretty-print rules)
2429             (exit 1)))
2430  (if (null? operands) (usage))
2431  (for-each (lambda (target) (make/proc (compute-rules options) (->string target ))) operands))
2432
2433
2434(main options operands)
2435
Note: See TracBrowser for help on using the repository browser.