use :PORT-FILE in the .asd
authorNikodemus Siivola <nikodemus@random-state.net>
Sun, 29 Apr 2012 10:52:22 +0000 (13:52 +0300)
committerNikodemus Siivola <nikodemus@random-state.net>
Sun, 29 Apr 2012 10:54:42 +0000 (13:54 +0300)
  Conditional compilation broken in ASDF since 2009, apparently,
  causing problems with the CCL support.

linedit.asd

index df26e34..4d298fa 100644 (file)
@@ -1,4 +1,4 @@
-;; Copyright (c) 2003 Nikodemus Siivola
+;; Copyright (c) 2003-2012 Nikodemus Siivola <nikodemus@random-state.net>
 ;;
 ;; Permission is hereby granted, free of charge, to any person obtaining
 ;; a copy of this software and associated documentation files (the
 
 (in-package :linedit-system)
 
+;;;; Loading specific files based on features.
+
+(defun featurep (x)
+  (typecase x
+    (cons
+     (case (car x)
+       ((:not not)
+        (cond
+          ((cddr x)
+           (error "Too many subexpressions in feature expression: ~S" x))
+          ((null (cdr x))
+           (error "Too few subexpressions in feature expression: ~S" x))
+          (t (not (featurep (cadr x))))))
+       ((:and and) (every #'featurep (cdr x)))
+       ((:or or) (some #'featurep (cdr x)))
+       (t
+        (error "Unknown operator in feature expression: ~S." x))))
+    (symbol
+     (not (null (member x *features* :test #'eq))))
+    (t
+      (error "Invalid feature expression: ~S" x))))
+
+(defclass port-file (cl-source-file)
+  ((test :initform nil)))
+
+(defmethod shared-initialize :after ((port port-file) slots &key when unless)
+  (setf (slot-value port 'test)
+        (cond ((and when unless)
+               `(:and ,when (:not ,unless)))
+              (when)
+              (unless)
+              (t
+               (error "~S has no feature conditionals." port)))))
+
+(defmethod perform :around ((op load-op) (port port-file))
+  (when (featurep (slot-value port 'test))
+    (call-next-method)))
+
+(defmethod perform :around ((op load-source-op) (port port-file))
+  (when (featurep (slot-value port 'test))
+    (call-next-method)))
+
+(defmethod perform :around ((op compile-op) (port port-file))
+  (when (featurep (slot-value port 'test))
+    (call-next-method)))
+
+;;;; C compiler
+
 (defvar *gcc* "/usr/bin/gcc")
 
 (defvar *gcc-options*
    #-sbcl
    (list "/usr/lib/bundle1.o" "-flat_namespace" "-undefined" "suppress")))
 
-;;; Separate class so that we don't mess up other packages
+;;;; Separate class so that we don't mess up other packages
 (defclass uffi-c-source-file (c-source-file) ())
 
 (defmethod output-files ((o compile-op) (c uffi-c-source-file))
   (list (make-pathname :name (component-name c)
-                      :type #-(or darwin macosx) "so" #+(or darwin macosx) "dylib"
-                      :defaults (component-pathname c))))
+                       :type #-(or darwin macosx) "so" #+(or darwin macosx) "dylib"
+                       :defaults (component-pathname c))))
 
 (defmethod perform ((o load-op) (c uffi-c-source-file))
   (let ((loader (intern (symbol-name '#:load-foreign-library) :uffi)))
 
 (defmethod perform ((o compile-op) (c uffi-c-source-file))
   (unless (zerop (run-shell-command "~A ~A ~{~A ~}-o ~A"
-                                   *gcc*
-                                   (namestring (component-pathname c))
-                                   *gcc-options*
-                                   (namestring (car (output-files o c)))))
+                                    *gcc*
+                                    (namestring (component-pathname c))
+                                    *gcc-options*
+                                    (namestring (car (output-files o c)))))
     (error 'operation-error :component c :operation o)))
 
 (defsystem :linedit
    (:file "buffer" :depends-on ("utility-macros"))
    (:file "command-keys" :depends-on ("packages"))
    (:file "editor" :depends-on ("backend" "rewindable"
-                               "line" "buffer" "command-keys"))
+                                "line" "buffer" "command-keys"))
    (:file "main" :depends-on ("editor"))
    (:file "complete" :depends-on ("utility-macros"))
    (:file "command-functions" :depends-on ("editor"))
             :components (;; This has definitions which signal an error, replaced
                          ;; by port-specific files below when possible.
                          (:file "generic")
-                         (:file "sbcl" :in-order-to ((compile-op (feature :sbcl))))
-                         (:file "ccl" :in-order-to ((compile-op (feature :ccl))))))))
+                         (:port-file "sbcl" :when :sbcl)
+                         (:port-file "ccl" :when :ccl)))))