Installation on Amiga (AmigaDOS): --------------------------------- 1. Install a GNU GCC development platform I don't believe CLISP can be compiled with anything else than GCC on the Amiga. CLISP source heavily stresses any C compiler. I managed to compile early versions of CLISP on my stock B2000 with 5MB of RAM and gcc-1.40, throwing every program out of the machine (including RAM: and LoadWB) and running each compiler stage separately. Luckily, when I hit GCC bugs, newer bug-freed versions were available. Compilation of CLISP has lead to several bug-reports in gnu.gcc.bugs. 2. Install Amiga includes They are copyrighted by Commodore-Amiga and can be obtained on the Amiga Developer CD or on Fred Fish CDs. See your Amiga FAQ. 3. Make directory trees Leave source in src/ (only *.d, *.h and *.lsp files are needed) and utilities in utils/ (only comment5, ansidecl and cvtmsgs are needed). Choose the version you want to build (see README.Amiga or README) and create directories like make.high/, make.low/ and make.wide/ at the same level as src/. 4. IxPrefs and ixemul.library `/' pathname translation In order to find include files located in /src/ relatively to the make.* directory, ixemul.library shouldn't translate /. As sh (which is called by GNU-make) doesn't seem to be able to handle this situation, a workaround is to assign src: and utils: to the src/ and utils/ directories respectively. 5. Check your stack sizes gcc-cc1 uses up to 380000 bytes of stack in EVAL.D. gcc-cpp and gcc-as get along with 20000 bytes. gcc-ld requires 180000 bytes. This is my observed stack usage relative to GCC-2.5.8 and can increase when adding new features to CLISP. If your make program cannot set stack sizes, you'll have to run everything with the maximum stack. I have my own make program which recognizes and honours the stack command. 6. Make the clisp support library found in amiga/jchlib/ This is a micro C startup library containing the bare minimum to start a program from CLI or WorkBench, setjmp() and strlen(). It's used by CLISP but could be by other programs too. It doesn't require ixemul.library. From WorkBench, it opens the window specified by the WINDOW tooltype, initializes argv[] with ARGS if present and supports project icons (currently all in the same directory only). Compiling CLISP without using my library has never been tested. 7. Makefile Due to lack of RAM (I have 10 MB :-), big CLISP source files and the huge stack needed by cc1, it was not possible for me to use a generic Makefile and simply run gcc with a stack set to 380000 bytes. That's why I'm using a private make which nobody but I has. It recognizes the stack command. Furthermore my Makefile calls each compiler stage directly, saving the space for the gcc driver. Now, with a normal (GNU-)make, I nevertheless managed to build CLISP by running VMM, a virtual memory manager and setting the maximal stack before starting make. It's a huge waste of resources and won't run in a 10MB system without virtual memory, but you could also try this. Link or copy the /bin/true command to make.*/stack so that /bin/sh will find a stack command (it's called by the Makefile). If /bin/sh can't find cc1, cpp etc. because they are deep inside the gcc-lib hierarchy, set a local variable PATH to all the paths. Make and thus sh will inherit this variable: set PATH /gnu/bin:/gnu/lib/gcc-lib/m68k-cbm-amigados/2.x.x:/C:/utils/:. 8. Edit make.*/Makefile according to your choices and tastes. By default, you'll make the international (well, english, french and german) version of CLISP, which requires more space than a single language one that can be built by adding one of -DENGLISH, -DFRANCAIS or -DDEUTSCH flags to the compiler. See src/lispbibl.d for everything that can be defined. The amiga or AMIGA define serves to recognize the Amiga (don't set them for now under Amiga-UNIX). Interesting preprocessor flags include AMIGA3000, MC680Y0 for 68020 or better (implied by AMIGA3000), MC68000 for 68000 only, and WIDE for 64 bit ints (for 32 bit clean pointers). Extensions like gettext and readline cannot currently be added as they use stdio and malloc whereas CLISP uses the low-level and unbuffered dos.library routines for i/o and AllocMem() etc. for all memory. Don't mess with it. Using UNIX-like (open) or ANSI (fopen) stdio would require a large rewrite of several source files. 9. Edit src/config.lsp src/timezone.lsp See README for the one line to modify in timezone.lsp. In config.lsp, you may wish to set your favourite editor or restrict the load-path. 10. Remove every $ from the file src/ari68020.mit.d and rename it src/ari68020.d sed > ari68020.d -e "s/$//" ari68020.mit.d Quote $ according to your shell conventions and sed version. 11. Copy, rename or link src/ari68000.mit.d to src/ari68000.d 12. Type make (while in a make.* directory) (-low) make HIGH=1 (-high) make WIDE=1 (-wide) and wait for things to happen. One night on a B2000, more than one hour on an A4000/40. Hint: use FIFO: (by Matt Dillon) in order to get a logfile. NewShell FIFO:shell/rwkecs Run >nil: remcli shell Run >nil: cat FIFO:shell/rmt >>compile.log echo "Log going into compile.log." Or use KingCon, ConsoleBuffer or else the Recorder program from the hacks204 archive by Andy Finkel (doesn't seem to work with 3.0). 13. Patches Gcc-2.3.3 -O2 -fomit-frame-pointer put several bugs in the compiler output. I previously corrected two of them by hand-patching the assembly files. Gcc-2.5.7 produced correct output but for 68020 and above machines only. Gcc-2.5.8 produces few bugs and only in the -DWIDE version. Beta versions of gcc-2.6.0 were not stable enough for compilation of the -DWIDE version. I'm using Gcc-2.5.8. Here's what to patch in control.s:_C_go (before the second eql): movel a5@(-12),sp@- movel a5@(-16),sp@- #APP | Should only be incremented once! | movel d1,a2 | addql #8,d1 #NO_APP movel d1,a2 addql #8,d1 movel a2@(4),sp@- movel a2@,sp@- movel d1,a5@(-28) jbsr _eql Here's a patch for predtype.s:_equalp (case_string dotimespL loop): movel a5@(-32),d1 movel d1,a1 addql #1,d1 moveb a1@,d0 #APP | Save incremented address! movel d1,a5@(-32) #NO_APP movel d0,sp@- jbsr a6@ Nobody gurantees there aren't more bugs not uncovered by the tests. 14. Type make interpreted.mem a memory image with everything uncompiled (size 1.7MB) make lispinit.mem makes all *.fas files and a memory image with everything compiled (size 500KB, 1MB for wide version) The second step is the most time consuming. 15. A test-suite The directory clisp/tests/ contains a large number of test files. While in CLISP, do (cd "/tests/") (load "tests") (run-all-tests) and have a look at possibly resulting .erg files. Only alltest.erg and array.erg should remain and report some limit or fixnum differences. 16. Documentation Unluckily for an Amiga-only site, I generated the .man file on a UNIX box and displayed it in an EMACS buffer (M-x man) from where I saved it. I'd like to know about better ways to do this. 17. Known compiler warnings This gives you an idea of what not to look at. Some warnings, especially in LISPARIT.D vary among the versions. /src/array.d: In function `C_make_array': /src/array.d:2445: warning: `fillpointer' may be used uninitialized in this function /src/array.d: In function `C_adjust_array': /src/array.d:2742: warning: `fillpointer' may be used uninitialized in this function /src/charstrg.d: In function `test_index_arg': /src/charstrg.d:1418: warning: `i' may be used uninitialized in this function /src/charstrg.d: In function `test_string_limits': /src/charstrg.d:1508: warning: `start' may be used uninitialized in this function /src/charstrg.d:1509: warning: `end' may be used uninitialized in this function /src/charstrg.d: In function `test_1_stringsym_limits': /src/charstrg.d:1587: warning: `start' may be used uninitialized in this function /src/charstrg.d:1588: warning: `end' may be used uninitialized in this function /src/charstrg.d: In function `test_2_stringsym_limits': /src/charstrg.d:1659: warning: `start1' may be used uninitialized in this function /src/charstrg.d:1660: warning: `end1' may be used uninitialized in this function /src/charstrg.d:1689: warning: `start2' may be used uninitialized in this function /src/charstrg.d:1690: warning: `end2' may be used uninitialized in this function /src/charstrg.d: In function `C_substring': /src/charstrg.d:2322: warning: `start' may be used uninitialized in this function /src/charstrg.d:2323: warning: `end' may be used uninitialized in this function /src/control.d: In function `C_tagbody': /src/control.d:1439: warning: variable `body' may be clobbered by `longjmp' or `vfork' /src/eval.d: In function `invoke_handlers': /src/eval.d:686: warning: variable `other_ranges' may be clobbered by `longjmp' or `vfork' /src/eval.d:689: warning: variable `FRAME' may be clobbered by `longjmp' or `vfork' /src/eval.d:702: warning: variable `i' may be clobbered by `longjmp' or `vfork' /src/eval.d: In function `funcall_iclosure': /src/eval.d:2371: warning: argument `closure' may be clobbered by `longjmp' or `vfork' /src/eval.d:2372: warning: argument `args_pointer' may be clobbered by `longjmp' or `vfork' /src/eval.d:2373: warning: argument `argcount' may be clobbered by `longjmp' or `vfork' /src/eval.d: In function `eval': /src/eval.d:2849: warning: variable `_SetSignal_re' may be clobbered by `longjmp' or `vfork' /src/eval.d:2849: warning: variable `_n1' may be clobbered by `longjmp' or `vfork' /src/eval.d:2846: warning: argument `form' may be clobbered by `longjmp' or `vfork' /src/eval.d: In function `eval_no_hooks': /src/eval.d:2906: warning: argument `form' may be clobbered by `longjmp' or `vfork' /src/eval.d: In function `interpret_bytecode_': /src/eval.d:5750: warning: variable `closure' may be clobbered by `longjmp' or `vfork' /src/eval.d:5755: warning: variable `byteptr' may be clobbered by `longjmp' or `vfork' /src/eval.d:5763: warning: variable `closureptr' may be clobbered by `longjmp' or `vfork' /src/eval.d:5746: warning: argument `codeptr' may be clobbered by `longjmp' or `vfork' /src/hashtabl.d: In function `hashcode': /src/hashtabl.d:438: warning: statement with no effect /src/hashtabl.d: In function `C_class_tuple_gethash': /src/hashtabl.d:1326: warning: statement with no effect /src/io.d: In function `C_bit_vector_reader': /src/io.d:3155: warning: `ch' may be used uninitialized in this function /src/io.d: In function `C_vector_reader': /src/io.d:3245: warning: `el' may be used uninitialized in this function /src/lisparit0.d: In function `divu_3232_3232_': /src/lisparit0.d:1130: warning: statement with no effect /src/lisparit0.d: In function `make_random_state': /src/lisparit0.d:22269: warning: assignment makes integer from pointer without a cast /src/pathname.d: In function `parse_logical_word': /src/pathname.d:1027: warning: `ch' may be used uninitialized in this function /src/rexx.d: In function `C_rexx_put': /src/rexx.d:89: warning: `vargs' may be used uninitialized in this function /src/spvw.d: In function `speicher_laenge': /src/spvw.d:2364: warning: control reaches end of non-void function /src/spvw.d: In function `alive': /src/spvw.d:3556: warning: control reaches end of non-void function /src/spvw.d: In function `gc_compact_from_varobject_page': /src/spvw.d:5786: warning: `p2' may be used uninitialized in this function /src/spvw.d:5787: warning: `l2' may be used uninitialized in this function /src/spvw.d: In function `gc_compact_from_cons_page': /src/spvw.d:5840: warning: `p2' may be used uninitialized in this function /src/spvw.d:5841: warning: `l2' may be used uninitialized in this function /src/spvw.d: In function `asciz_out': /src/spvw.d:7859: warning: initialization discards `const' from pointer target type /src/spvw.d: In function `main': /src/spvw.d:9580: warning: variable `argv_memneed' may be clobbered by `longjmp' or `vfork' /src/spvw.d:9582: warning: variable `argv_stackneed' may be clobbered by `longjmp' or `vfork' /src/spvw.d: In function `loadmem': /src/spvw.d:11526: warning: empty body in an else-statement /src/stream.d: In function `make_file_stream': /src/stream.d:8793: warning: `art' may be used uninitialized in this function Additionaly for the -low and -00 versions: /src/lisparit0.d: In function `I_to_UL': /src/lisparit0.d:1954: warning: comparison is always 1 due to limited range of data type /src/lisparit0.d: In function `I_to_L': /src/lisparit0.d:2001: warning: comparison is always 1 due to limited range of data type /src/lisparit0.d:2030: warning: comparison is always 0 due to limited range of data type /src/lisparit0.d: In function `I_to_UQ': /src/lisparit0.d:2092: warning: comparison is always 1 due to limited range of data type /src/lisparit0.d: In function `LF_I_scale_float_LF': /src/lisparit0.d:16261: warning: comparison is always 1 due to limited range of data type /src/lisparit0.d:16288: warning: comparison is always 0 due to limited range of data type Authors: -------- Bruno Haible Michael Stoll Email: haible@ma2s2.mathematik.uni-karlsruhe.de Amiga Port by: -------------- Jörg Höhle Email: Joerg.Hoehle@gmd.de