X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=contrib%2Fsb-grovel%2Fdef-to-lisp.lisp;h=01ff4d6669fe41d265b39174cc9b21bdcccc55f1;hb=4bc6b918bb99e8dcd17bbe6479a06e52b2d04a6c;hp=19e4107e2841ae002f46a27637ac8948c8480590;hpb=a7c8cdf31fd9f411452532084bebd267cbf75454;p=sbcl.git diff --git a/contrib/sb-grovel/def-to-lisp.lisp b/contrib/sb-grovel/def-to-lisp.lisp index 19e4107..01ff4d6 100644 --- a/contrib/sb-grovel/def-to-lisp.lisp +++ b/contrib/sb-grovel/def-to-lisp.lisp @@ -100,7 +100,6 @@ code: (printf "(sb-grovel::define-foreign-routine (\"~A\" ~A)" f-cname lispname) (printf "~{ ~W~^\\n~})" definition))) (:structure - ;; FIXME: structure slots should be auto-exportable as well. (c-for-structure lispname cname)) (otherwise ;; should we really not sprechen espagnol, monsieurs? @@ -120,6 +119,15 @@ code: (defclass grovel-constants-file (asdf:cl-source-file) ((package :accessor constants-package :initarg :package))) +(define-condition c-compile-failed (compile-failed) () + (:report (lambda (c s) + (format s "~@" + (error-operation c) (error-component c))))) +(define-condition a-dot-out-failed (compile-failed) () + (:report (lambda (c s) + (format s "~@" + (error-operation c) (error-component c))))) + (defmethod asdf:perform ((op asdf:compile-op) (component grovel-constants-file)) ;; we want to generate all our temporary files in the fasl directory @@ -140,14 +148,45 @@ code: (terpri) (funcall (intern "C-CONSTANTS-EXTRACT" (find-package "SB-GROVEL")) filename tmp-c-source (constants-package component)) - (and - (= (run-shell-command "gcc ~A -o ~S ~S" - (if (sb-ext:posix-getenv "EXTRA_CFLAGS") - (sb-ext:posix-getenv "EXTRA_CFLAGS") - "") - (namestring tmp-a-dot-out) - (namestring tmp-c-source)) 0) - (= (run-shell-command "~A >~A" - (namestring tmp-a-dot-out) - (namestring tmp-constants)) 0) - (compile-file tmp-constants :output-file output-file)))) + (let ((code (run-shell-command "gcc ~A -o ~S ~S" + (if (sb-ext:posix-getenv "EXTRA_CFLAGS") + (sb-ext:posix-getenv "EXTRA_CFLAGS") + "") + (namestring tmp-a-dot-out) + (namestring tmp-c-source)))) + (unless (= code 0) + (case (operation-on-failure op) + (:warn (warn "~@" + op component)) + (:error + (error 'c-compile-failed :operation op :component component))))) + (let ((code (run-shell-command "~A >~A" + (namestring tmp-a-dot-out) + (namestring tmp-constants)))) + (unless (= code 0) + (case (operation-on-failure op) + (:warn (warn "~@" + op component)) + (:error + (error 'a-dot-out-failed :operation op :component component))))) + (multiple-value-bind (output warnings-p failure-p) + (compile-file tmp-constants :output-file output-file) + (when warnings-p + (case (operation-on-warnings op) + (:warn (warn + (formatter "~@") + op component)) + (:error (error 'compile-warned :component component :operation op)) + (:ignore nil))) + (when failure-p + (case (operation-on-failure op) + (:warn (warn + (formatter "~@") + op component)) + (:error (error 'compile-failed :component component :operation op)) + (:ignore nil))) + (unless output + (error 'compile-error :component component :operation op))))) +