(defun escape-for-string (string)
(c-escape string))
+(defun split-cflags (string)
+ (remove-if (lambda (flag)
+ (zerop (length flag)))
+ (loop
+ for start = 0 then (if end (1+ end) nil)
+ for end = (and start (position #\Space string :start start))
+ while start
+ collect (subseq string start end))))
+
(defun c-escape (string &optional (dangerous-chars '(#\")) (escape-char #\\))
"Escape DANGEROUS-CHARS in STRING, with ESCAPE-CHAR."
(coerce (loop for c across string
(terpri)
(funcall (intern "C-CONSTANTS-EXTRACT" (find-package "SB-GROVEL"))
filename tmp-c-source (constants-package component))
- (let ((code (sb-ext:process-exit-code
- (sb-ext:run-program "gcc"
- (append
- (sb-ext:posix-getenv "EXTRA_CFLAGS")
- (list "-o"
- (namestring tmp-a-dot-out)
- (namestring tmp-c-source)))
- :search t
- :input nil
- :output *trace-output*))))
+ (let* ((cc (or (sb-ext:posix-getenv "CC")
+ ;; It might be nice to include a CONTINUE or
+ ;; USE-VALUE restart here, but ASDF seems to insist
+ ;; on handling the errors itself.
+ (error "The CC environment variable has not been set in SB-GROVEL. Since this variable should always be set during the SBCL build process, this might indicate an SBCL with a broken contrib installation.")))
+ (code (sb-ext:process-exit-code
+ (sb-ext:run-program
+ cc
+ (append
+ (split-cflags (sb-ext:posix-getenv "EXTRA_CFLAGS"))
+ #+(and linux largefile)
+ '("-D_LARGEFILE_SOURCE"
+ "-D_LARGEFILE64_SOURCE"
+ "-D_FILE_OFFSET_BITS=64")
+ (list "-o"
+ (namestring tmp-a-dot-out)
+ (namestring tmp-c-source)))
+ :search t
+ :input nil
+ :output *trace-output*))))
(unless (= code 0)
(case (operation-on-failure op)
(:warn (warn "~@<C compiler failure when performing ~A on ~A.~@:>"