From 213ad2e9ce5aff9337234be84635e1a7ba22a598 Mon Sep 17 00:00:00 2001 From: Matthias Benkard Date: Sun, 10 Feb 2008 16:37:42 +0100 Subject: Revamp the system definition. darcs-hash:8060615b1741cadcf0296eb1ee36bd831a3043d3 --- objective-cl-libobjcl.asd | 148 ++++++++++++++++++++++++++++++++++++++++++++++ objective-cl.asd | 114 +---------------------------------- 2 files changed, 150 insertions(+), 112 deletions(-) create mode 100644 objective-cl-libobjcl.asd diff --git a/objective-cl-libobjcl.asd b/objective-cl-libobjcl.asd new file mode 100644 index 0000000..10047ea --- /dev/null +++ b/objective-cl-libobjcl.asd @@ -0,0 +1,148 @@ +;;;; Objective-CL, an Objective-C bridge for Common Lisp. +;;;; Copyright (C) 2007 Matthias Andreas Benkard. +;;;; +;;;; This program is free software: you can redistribute it and/or +;;;; modify it under the terms of the GNU General Public License as +;;;; published by the Free Software Foundation, either version 3 of the +;;;; License, or (at your option) any later version. +;;;; +;;;; This program is distributed in the hope that it will be useful, but +;;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;;; General Public License for more details. +;;;; +;;;; You should have received a copy of the GNU General Public License +;;;; along with this program. If not, see +;;;; . + +(defpackage objcl-asdf + (:use #:cl #:asdf) + (:export #:objc-source-file + #:*objc-obj-dir*)) +(in-package #:objcl-asdf) + +(defvar *objc-obj-dir*) + +(defclass objc-source-file (source-file) ()) +(defclass objcl-c-source-file (objc-source-file) () + (:documentation "An Objective-CL C source file")) + +(defmethod source-file-type ((c objc-source-file) (s module)) "m") +(defmethod source-file-type ((c objcl-c-source-file) (s module)) "c") + +(defmethod perform ((o compile-op) (c objc-source-file)) + (unless (or (operation-done-p o c) + (null (output-files o c))) + (zerop + ;; Run `make' at the top level of the directory tree. + (run-shell-command "make -C '~A'" + (namestring + (make-pathname + :directory + (pathname-directory + (merge-pathnames + (make-pathname :directory '(:relative "..")) + (first + (output-files + o + (find "libobjcl" + (module-components + (first + (module-components + (find-system "objective-cl-libobjcl")))) + :key #'component-name + :test #'string=))))))))))) + +(defmethod output-files :around ((o compile-op) (c objc-source-file)) + ;; If this doesn't get called at all, we're kind of screwed. + (let ((files (call-next-method))) + (when (string= (component-name c) "libobjcl") + (setq *objc-obj-dir* + (merge-pathnames #p"../" + (directory-namestring (first files))))) + files)) + +(defmethod output-files ((o compile-op) (c objc-source-file)) + (let ((relative-source-file + (enough-namestring (component-pathname c) + (merge-pathnames + (make-pathname :directory '(:relative "Objective-C")) + (component-pathname + (find-system "objective-cl-libobjcl")))))) + (list (merge-pathnames + (make-pathname :type "o") + (merge-pathnames + relative-source-file + (merge-pathnames + (make-pathname :directory '(:relative "Objective-C" "obj")) + (component-pathname (find-system "objective-cl-libobjcl")))))))) + +(defmethod operation-done-p ((o compile-op) (c objc-source-file)) + (and (every #'probe-file (output-files o c)) + (> (loop for file in (output-files o c) + minimizing (file-write-date file)) + (file-write-date (component-pathname c))))) + +(defmethod perform ((o load-op) (c objc-source-file)) + nil) + + +(defsystem "objective-cl-libobjcl" + :description "A portable Objective C bridge." + :version asdf::*objcl-version* + :author "Matthias Benkard " + :licence "GNU Lesser General Public License, version 3 or higher" + :depends-on () + :components ((:module "Objective-C" + :components + ((:objc-source-file "libobjcl") + (:objc-source-file "NSObject-ObjectiveCLWrapperLink") + (:module "PyObjC" + :components + ((:objc-source-file "libffi_support") + (:objc-source-file "objc_support") + (:objc-source-file "objc-runtime-apple") + (:objc-source-file "objc-runtime-compat") + (:objc-source-file "objc-runtime-gnu"))) + (:module "JIGS" + :components + ((:objc-source-file "ObjcRuntimeUtilities2") + (:objcl-c-source-file "ObjcRuntimeUtilities")))))) + :serial t) + + +(defmethod perform :before (o (c (eql (find-system "objective-cl-libobjcl")))) + ;; Copy the Objective-C sources to the target directory. + (unless (null (output-files o c)) + (let* ((source-dir (component-pathname (find-system "objective-cl-libobjcl"))) + (sources + (mapcar #'(lambda (x) + (enough-namestring x source-dir)) + (mapcan #'(lambda (x) + (directory (merge-pathnames x source-dir))) + '(#p"**/*.c" #p"**/*.m" #p"**/*.h" + #p"**/GNUmakefile.*" + #p"**/*.make" #p"**/GNUmakefile" + #p"**/*.in" #p"**/configure" #p"**/configure.ac" + #p"libffi/**/*" #p"libffi/**/*.*")))) + (output-dir + (merge-pathnames #p"../../" + (directory-namestring (first (output-files o c)))))) + (dolist (relative-source-file sources) + (let ((output-file (merge-pathnames relative-source-file output-dir)) + (source-file (merge-pathnames relative-source-file source-dir))) + (ensure-directories-exist output-file) + (unless (and (probe-file output-file) + (= (file-write-date source-file) + (file-write-date output-file))) + (ignore-errors ;; FIXME: We need to skip directories, so + ;; that IGNORE-ERRORS can go away. + (with-open-file (in source-file + :element-type '(unsigned-byte 8)) + (with-open-file (out output-file + :direction :output + :if-exists :supersede + :element-type '(unsigned-byte 8)) + (loop for byte = (read-byte in nil nil) + while byte + do (write-byte byte out))))))))))) diff --git a/objective-cl.asd b/objective-cl.asd index 0c15f8a..0598593 100644 --- a/objective-cl.asd +++ b/objective-cl.asd @@ -15,11 +15,11 @@ ;;;; along with this program. If not, see ;;;; . -(defvar *objcl-version* "0.0.4") +(defvar asdf::*objcl-version* "0.0.4") (defsystem "objective-cl" :description "A portable Objective C bridge." - :version *objcl-version* + :version asdf::*objcl-version* :author "Matthias Benkard " :licence "GNU Lesser General Public License, version 3 or higher" :depends-on (#:cffi #:trivial-garbage #:split-sequence #:objective-cl-libobjcl @@ -78,113 +78,3 @@ "method-invocation" "conditions"))))) :serial t) - - -(defpackage objcl-asdf - (:use #:cl #:asdf) - (:export #:objc-source-file - #:*objc-obj-dir*)) -(in-package #:objcl-asdf) - -(defvar *objc-obj-dir*) - -(defclass objc-source-file (source-file) ()) -(defclass objcl-c-source-file (objc-source-file) () - (:documentation "An Objective-CL C source file")) - -(defmethod source-file-type ((c objc-source-file) (s module)) "m") -(defmethod source-file-type ((c objcl-c-source-file) (s module)) "c") - -(defmethod perform :before (o (c objc-source-file)) - ;; Copy the Objective-C sources to the target directory. - (unless (null (output-files o c)) - (let* ((source-dir (component-pathname (find-system "objective-cl-libobjcl"))) - (sources - (mapcar #'(lambda (x) - (enough-namestring x source-dir)) - (mapcan #'(lambda (x) - (directory (merge-pathnames x source-dir))) - '(#p"**/*.c" #p"**/*.m" #p"**/*.h" - #p"**/GNUmakefile.*" - #p"**/*.make" #p"**/GNUmakefile" - #p"**/*.in" #p"**/configure" #p"**/configure.ac" - #p"libffi/**/*" #p"libffi/**/*.*")))) - (output-dir - (merge-pathnames #p"../../" - (directory-namestring (first (output-files o c)))))) - (dolist (relative-source-file sources) - (let ((output-file (merge-pathnames relative-source-file output-dir)) - (source-file (merge-pathnames relative-source-file source-dir))) - (ensure-directories-exist output-file) - (unless (and (probe-file output-file) - (= (file-write-date source-file) - (file-write-date output-file))) - (ignore-errors ;; FIXME: We need to skip directories, so - ;; that IGNORE-ERRORS can go away. - (with-open-file (in source-file - :element-type '(unsigned-byte 8)) - (with-open-file (out output-file - :direction :output - :if-exists :supersede - :element-type '(unsigned-byte 8)) - (loop for byte = (read-byte in nil nil) - while byte - do (write-byte byte out))))))))))) - -(defmethod perform ((o compile-op) (c objc-source-file)) - (unless (or (operation-done-p o c) - (null (output-files o c))) - (zerop - ;; Run `make' at the top level of the directory tree. - (run-shell-command "make -C '~A'" - (merge-pathnames #p"../../" - (directory-namestring - (first (output-files o c)))))))) - -(defmethod output-files :around ((o compile-op) (c objc-source-file)) - ;; If this doesn't get called at all, we're kind of screwed. - (let ((files (call-next-method))) - (setq *objc-obj-dir* - (merge-pathnames #p"../" - (directory-namestring (first files)))) - files)) - -#+(or) -(defmethod output-files ((o compile-op) (c objc-source-file)) - (print (list (merge-pathnames (make-pathname :directory '(:relative "Objective-C" "obj") - :type "o") - (merge-pathnames - (component-pathname (find-system "objective-cl-libobjcl")) - (component-pathname c)))))) - -(defmethod output-files ((o compile-op) (c objc-source-file)) - (list (merge-pathnames (make-pathname :directory '(:relative "obj") - :type "o") - (component-pathname c)))) - -(defmethod operation-done-p ((o compile-op) (c objc-source-file)) - (and (every #'probe-file (output-files o c)) - (> (loop for file in (output-files o c) - minimizing (file-write-date file)) - (file-write-date (component-pathname c))))) - -(defmethod perform ((o load-op) (c objc-source-file)) - nil) - - -(defsystem "objective-cl-libobjcl" - :description "A portable Objective C bridge." - :version *objcl-version* - :author "Matthias Benkard " - :licence "GNU Lesser General Public License, version 3 or higher" - :depends-on () - :components ((:module "Objective-C" - :components ((:objc-source-file "libobjcl") - (:objc-source-file "PyObjC/libffi_support") - (:objc-source-file "PyObjC/objc_support") - (:objc-source-file "PyObjC/objc-runtime-apple") - (:objc-source-file "PyObjC/objc-runtime-compat") - (:objc-source-file "PyObjC/objc-runtime-gnu") - (:objc-source-file "JIGS/ObjcRuntimeUtilities2") - (:objcl-c-source-file "JIGS/ObjcRuntimeUtilities")))) - :serial t) -- cgit v1.2.3