]> asedeno.scripts.mit.edu Git - cl-protobufs.git/commitdiff
generate a list of imports for each .proto file
authorAlejandro R Sedeño <asedeno@google.com>
Tue, 4 Dec 2012 21:23:10 +0000 (16:23 -0500)
committerAlejandro R Sedeño <asedeno@google.com>
Wed, 5 Dec 2012 21:12:06 +0000 (16:12 -0500)
asdf-support.lisp

index c1f8f1be20f466f7c2d4f8947e13145688567e90..ae716d78ab32623cdfe2a3f30ad366d2c5f041ac 100644 (file)
   (list (protobuf-input-file component)))
 
 (defmethod output-files ((op proto-to-lisp) (component protobuf-file))
-  "The output file is a lisp file, stored where .fasl files are stored."
+  "The output file is a .lisp file and a .proto-imports file with dependency data,
+   stored where .fasl files are stored"
   (declare (ignorable op))
-  (values (list (lispize-pathname (component-pathname component))) nil))
+  (let ((lisp-file (lispize-pathname (component-pathname component))))
+    (values (list lisp-file
+                  (make-pathname :type "proto-imports"
+                                 :defaults lisp-file))
+            nil)))
 
 (defmethod input-files ((op compile-op) (component protobuf-file))
   "The input files are the .lisp and .proto-imports files."
 
 (defmethod perform ((op proto-to-lisp) (component protobuf-file))
   (let* ((input  (protobuf-input-file component))
-         (output (output-file op component))
+         (output (first (output-files op component)))
          (paths  (cons (directory-namestring input) (resolve-search-path component)))
          (proto-impl:*protobuf-search-path* paths)
          (proto-impl:*protobuf-output-path* output))
     (dolist (path paths (error 'compile-failed
                           :component component :operation op))
-      (let ((proto (make-pathname :type "proto" :defaults (merge-pathnames* path (pathname input))))
-            (lisp  (output-file op component)))
-        (when (probe-file proto)
-          (return-from perform
-            (proto-impl:parse-protobuf-file proto lisp
-                                            :conc-name (proto-conc-name component))))))))
+      (let ((proto (make-pathname :type "proto" :defaults (merge-pathnames* path (pathname input)))))
+        (destructuring-bind (lisp imports)
+            (output-files op component)
+          (when (probe-file proto)
+            (return-from perform
+              (proto-impl:parse-protobuf-file proto lisp imports
+                                              :conc-name (proto-conc-name component)))))))))
 
 (defmethod operation-description ((op proto-to-lisp) (component protobuf-file))
   (format nil (compatfmt "~@<proto-compiling ~3i~_~A~@:>")
 
 (in-package "PROTO-IMPL")
 
-(defun parse-protobuf-file (protobuf-file lisp-file &key (conc-name ""))
+(defun parse-protobuf-file (protobuf-file lisp-file imports-file &key (conc-name ""))
   (let ((schema (parse-schema-from-file protobuf-file :conc-name conc-name)))
     (with-open-file (stream lisp-file
                      :direction :output
                      :if-exists :supersede
                      :external-format :utf-8
                      :element-type 'character)
-      (write-schema schema :stream stream :type :lisp)))
+      (write-schema schema :stream stream :type :lisp))
+    (with-open-file (stream imports-file
+                     :direction :output
+                     :if-exists :supersede
+                     :external-format :utf-8
+                     :element-type 'character)
+      (with-standard-io-syntax
+        (format stream "~W~%" (proto-imports schema)))))
   lisp-file)
 
 ;; Process 'import' lines
                                 (make-pathname :name import-name
                                                :directory (pathname-directory output-path))
                                 base-path)))
+                 (imports-file (make-pathname :type "proto-imports"
+                                              :defaults lisp-file))
                  (fasl-file  (compile-file-pathname lisp-file))
                  (asdf:*asdf-verbose* nil)      ;for safe-file-write-date
                  (proto-date (asdf::safe-file-write-date proto-file))
                   (cond ((not proto-date)
                          (warn "Could not find the .proto file to be imported: ~A" proto-file))
                         ((or (not lisp-date)
-                             (< lisp-date proto-date))
-                         (parse-protobuf-file proto-file lisp-file)
+                            (< lisp-date proto-date))
+                         (parse-protobuf-file proto-file lisp-file imports-file)
                          (setq lisp-date (file-write-date lisp-file)))))
                 ;; Compile the .lisp file, if necessary
                 (cond ((not lisp-date)