-;; 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)))))