Consolidate code for evaluating and/or/not expressions
[maxima.git] / configure.lisp
blob7e531a62ff8f36122f41f59592758a06439053dd
1 (defun replace-substring (in-string old new)
2 (let ((result ""))
3 (do ((begin 0)
4 (end (search old in-string)
5 (search old in-string :start2 begin)))
6 ((>= begin (length in-string)) 'done)
7 (if end
8 (progn (setf result (concatenate 'string result
9 (subseq in-string begin end)
10 new))
11 (setf begin (+ end (length old))))
12 (progn (setf result (concatenate 'string result
13 (subseq in-string begin
14 (length in-string))))
15 (setf begin (length in-string)))))
16 result))
18 (defun process-file (in-filename out-filename substitutions)
19 (with-open-file (in in-filename :direction :input)
20 (with-open-file (out out-filename :direction :output
21 :if-exists :supersede)
22 (do ((line (read-line in nil 'eof)
23 (read-line in nil 'eof)))
24 ((eql line 'eof))
25 (mapc #'(lambda (pair)
26 (setf line (replace-substring line
27 (first pair)
28 (rest pair))))
29 substitutions)
30 (format out "~a~%" line)))))
32 (defun read-with-default (prompt default)
33 (format t "~a [~a]: " prompt default)
34 (terpri)
35 (let ((response (string-right-trim '(#\Return) (read-line))))
36 (if (string= response "") default response)))
39 ;;; This function (only) modified from CLOCC http://clocc.sourceforge.net
40 (defun default-directory-string ()
41 (string-right-trim
42 "\\" (string-right-trim
43 "/"
44 (namestring
45 #+allegro (excl:current-directory)
46 #+clisp (#+lisp=cl ext:default-directory
47 #-lisp=cl lisp:default-directory)
48 #+cmu (ext:default-directory)
49 #+scl (unix-namestring (ext:default-directory))
50 #+cormanlisp (ccl:get-current-directory)
51 #+lispworks (hcl:get-working-directory)
52 #+lucid (lcl:working-directory)
53 #-(or allegro clisp cmu scl cormanlisp lispworks lucid)
54 (truename ".")))))
56 (defun get-version ()
57 (with-open-file (in "configure.ac" :direction :input)
58 (do ((line (read-line in nil 'eof)
59 (read-line in nil 'eof))
60 (version "")
61 temp)
62 ((eq line 'eof)
63 (when (string= version "")
64 (format t "Warning: No version information found.~%~%"))
65 version)
66 (when (search "AC_INIT([maxima]," line)
67 (setq line (string-trim '(#\Return) line))
68 (setq temp
69 (replace-substring line "AC_INIT([maxima], [" ""))
70 (setq version
71 (replace-substring temp "])" ""))
72 (when (or (string= temp line)
73 (string= temp version))
74 ; Failed substitution
75 (format t "Warning: Problem parsing version information. ")
76 (format t "Found: \"~a\"~%~%" version))))))
78 (defvar *maxima-lispname* #+clisp "clisp"
79 #+cmu "cmucl"
80 #+scl "scl"
81 #+sbcl "sbcl"
82 #+gcl "gcl"
83 #+allegro "acl"
84 #+(and openmcl (not 64-bit-target)) "openmcl"
85 #+(and openmcl 64-bit-target) "ccl64"
86 #+abcl "abcl"
87 #+ecl "ecl"
88 #-(or clisp cmu scl sbcl gcl allegro ccl abcl ecl) "unknownlisp")
90 (defun configure (&key (interactive t) (verbose nil)
91 is-win32
92 maxima-directory
93 posix-shell
94 clisp-name
95 cmucl-name
96 scl-name
97 acl-name
98 openmcl-name
99 ccl64-name
100 sbcl-name
101 ecl-name
102 gcl-name)
103 (let ((prefix (if maxima-directory
104 maxima-directory
105 (default-directory-string)))
106 (win32-string (if is-win32 "true" "false"))
107 (shell (if posix-shell posix-shell "/bin/sh"))
108 (clisp (if clisp-name clisp-name "clisp"))
109 (cmucl (if cmucl-name cmucl-name "lisp"))
110 (scl (if scl-name scl-name "lisp"))
111 (acl (if acl-name acl-name "acl"))
112 (openmcl (if openmcl-name openmcl-name "mcl"))
113 (ccl64 (if ccl64-name ccl64-name "ccl64"))
114 (sbcl (if sbcl-name sbcl-name "sbcl"))
115 (ecl (if ecl-name ecl-name "ecl"))
116 (gcl (if gcl-name gcl-name "gcl"))
117 (files (list "maxima-local.in" "src/maxima.in" "src/maxima.bat.in"
118 "src/autoconf-variables.lisp.in"))
119 (substitutions))
120 (if interactive
121 (progn
122 (setf prefix (read-with-default "Enter the Maxima directory" prefix))
123 (setf win32-string
124 (read-with-default "Is this a Windows system? (true/false)"
125 win32-string))
126 (setf shell (read-with-default "Posix shell (optional)" shell))
127 (setf clisp
128 (read-with-default "Name of the Clisp executable (optional)"
129 clisp))
130 (setf cmucl
131 (read-with-default "Name of the CMUCL executable (optional)"
132 cmucl))
133 (setf scl
134 (read-with-default "Name of the SCL executable (optional)"
135 scl))
136 (setf acl
137 (read-with-default "Name of the Allegro executable (optional)"
138 acl))
139 (setf openmcl
140 (read-with-default "Name of the OpenMCL executable (optional)"
141 openmcl))
142 (setf ccl64
143 (read-with-default "Name of the OpenMCL (64-bit) executable (optional)"
144 ccl64))
145 (setf ecl
146 (read-with-default "Name of the ECL executable (optional)"
147 ecl))
148 (setf gcl
149 (read-with-default "Name of the GCL executable (optional)"
150 gcl))
151 (setf sbcl
152 (read-with-default "Name of the SBCL executable (optional)"
153 sbcl))))
154 (setf substitutions (list (cons "@prefix@"
155 (replace-substring prefix "\\" "\\\\"))
156 (cons "@PACKAGE@" "maxima")
157 (cons "@VERSION@" (get-version))
158 (cons "@host@" "unknown")
159 (cons "@win32@" win32-string)
160 (cons "@default_layout_autotools@" "false")
161 (cons "@POSIX_SHELL@" shell)
162 (cons "@expanded_top_srcdir@"
163 (replace-substring prefix "\\" "\\\\"))
164 (cons "@lisp_only_build@" "t")
165 (cons "@DEFAULTLISP@" *maxima-lispname*)
166 (cons "@CLISP_NAME@" clisp)
167 (cons "@CMUCL_NAME@" cmucl)
168 (cons "@SCL_NAME@" scl)
169 (cons "@ACL_NAME@" acl)
170 (cons "@OPENMCL_NAME@" openmcl)
171 (cons "@CCL64_NAME@" ccl64)
172 (cons "@ECL_NAME@" ecl)
173 (cons "@GCL_NAME@" gcl)
174 (cons "@SBCL_NAME@" sbcl)))
175 (if verbose
176 (mapc #'(lambda (pair) (format t "~a=~a~%" (first pair) (rest pair)))
177 substitutions))
178 (mapc #'(lambda (filename)
179 (let ((out-filename (replace-substring filename ".in" "")))
180 (process-file filename out-filename substitutions)
181 (format t "Created ~a~%" out-filename)))
182 files)))