(in-package :asdf)
-(export '*dso-extension*)
+(export '(*absolute-paths-as-default* *dso-extension*
+ *operation* *system* *component* library shared-object))
(defparameter *dso-extension*
#-(or darwin win32)"so" #+darwin"dylib" #+win32"dll")
+(defparameter *absolute-paths-as-default* nil)
;;; The following code is more or less copied from sb-bsd-sockets.asd,
;;; but extended to allow flags to be set in a general way. The class
(defclass shared-object (module)
((ldflags :initform nil :initarg :ldflags)
- (absolute :initform nil :initarg :absolute :reader absolute-p)))
+ (absolute :initform *absolute-paths-as-default*
+ :initarg :absolute :reader absolute-p)))
(defun ensure-namestring (pathname)
(namestring
(setf (cdr shared-object) name+type))))
#+clisp
(progn
+ #?-(pkg-config:clisp>= 2 45)
(ffi::foreign-library namestring)
+ #?(pkg-config:clisp>= 2 45)
+ (ffi:open-foreign-library namestring)
(pushnew
(if absolute-p namestring name+type)
*loaded-libraries* :test #'string=))))
(defmethod perform ((op compile-op) (c c-source-file))
(unless
- (= 0 (run-shell-command "gcc ~A~{ ~A~} -o ~S -c ~S"
+ (= 0 (run-shell-command "gcc -Wall ~A~{ ~A~} -o ~S -c ~S"
#-win32 "-fPIC"
#+win32 "-DBUILD_DLL"
(nconc
(defclass library (component)
((libdir :initarg :libdir :initform nil)
(libname :initarg :libname :initform nil)
- (absolute :initform nil :initarg :absolute :reader absolute-p)))
+ (absolute :initform *absolute-paths-as-default*
+ :initarg :absolute :reader absolute-p)))
(defun split-path (path)
- (labels ((split (path)
- (unless (zerop (length path))
- (let ((slash (position #\/ path)))
- (if slash
- (cons (subseq path 0 slash) (split (subseq path (1+ slash))))
- (list path))))))
- (if (and (not (zerop (length path))) (char= (char path 0) #\/))
- (cons :absolute (split (subseq path 1)))
- (cons :relative (split path)))))
-
+ (when path
+ (labels ((split (path)
+ (unless (zerop (length path))
+ (let ((slash (position #\/ path)))
+ (if slash
+ (cons (subseq path 0 slash) (split (subseq path (1+ slash))))
+ (list path))))))
+ (if (and (not (zerop (length path))) (char= (char path 0) #\/))
+ (cons :absolute (split (subseq path 1)))
+ (cons :relative (split path))))))
+
(defmethod component-pathname ((lib library))
- (make-pathname :type *dso-extension*
- :name (or (slot-value lib 'libname) (component-name lib))
- :directory (split-path (slot-value lib 'libdir))))
+ (or
+ (when (slot-value lib 'libname)
+ (let ((filename (format nil "~A~A" (namestring (make-pathname :directory (split-path (slot-value lib 'libdir)))) (slot-value lib 'libname))))
+ (when (probe-file filename)
+ (pathname filename))))
+
+ (make-pathname
+ :type *dso-extension*
+ :name (or (slot-value lib 'libname) (component-name lib))
+ :directory (split-path (slot-value lib 'libdir)))))
(defmethod perform ((o load-op) (lib library))
(load-shared-object (component-pathname lib) (absolute-p lib)))
(defmethod operation-done-p ((o operation) (lib library))
t)
+
+
+;;; Binding of dynamic variables during perform
+
+(defvar *operation* nil)
+(defvar *system* nil)
+(defvar *component* nil)
+
+(defmethod perform :around ((operation operation) (c component))
+ (let ((*operation* operation)
+ (*component* c)
+ (*system* (component-system c)))
+ (call-next-method)))