changeset 104502:cdbbb89893d5

lisp/cedet/ede/pmake.el (ede-proj-makefile-create): Require ede/srecode. lisp/cedet/ede/srecode.el: New file.
author Chong Yidong <cyd@stupidchicken.com>
date Sun, 20 Sep 2009 22:05:17 +0000
parents b5dbdf25d1c5
children c433f076710b
files lisp/ChangeLog lisp/cedet/ede/pmake.el lisp/cedet/ede/srecode.el
diffstat 3 files changed, 113 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sun Sep 20 21:48:30 2009 +0000
+++ b/lisp/ChangeLog	Sun Sep 20 22:05:17 2009 +0000
@@ -1,5 +1,8 @@
 2009-09-20  Chong Yidong  <cyd@stupidchicken.com>
 
+	* cedet/ede/pmake.el (ede-proj-makefile-create): Require
+	ede/srecode.
+
 	* cedet/srecode/compile.el (srecode-compile-split-code)
 	(srecode-compile-parse-inserter): Fix compiler warning.
 
--- a/lisp/cedet/ede/pmake.el	Sun Sep 20 21:48:30 2009 +0000
+++ b/lisp/cedet/ede/pmake.el	Sun Sep 20 22:05:17 2009 +0000
@@ -48,10 +48,14 @@
 (require 'ede/proj-obj)
 (require 'ede/proj-comp)
 
+(declare-function ede-srecode-setup "ede/srecode")
+(declare-function ede-srecode-insert "ede/srecode")
+
 ;;; Code:
 (defmethod ede-proj-makefile-create ((this ede-proj-project) mfilename)
   "Create a Makefile for all Makefile targets in THIS.
 MFILENAME is the makefile to generate."
+  (require 'ede/srecode)
   (let ((mt nil)
 	(isdist (string= mfilename (ede-proj-dist-makefile this)))
 	(depth 0)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/cedet/ede/srecode.el	Sun Sep 20 22:05:17 2009 +0000
@@ -0,0 +1,106 @@
+;;; ede-srecode.el --- EDE utilities on top of SRecoder
+
+;; Copyright (C) 2008 Free Software Foundation, Inc.
+
+;; Author: Eric M. Ludlam <eric@siege-engine.com>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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.
+
+;; GNU Emacs 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 GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; EDE utilities for using SRecode to generate project files, such as
+;; Makefiles.
+
+(require 'srecode)
+
+(declare-function srecode-create-dictionary "srecode/dictionary")
+(declare-function srecode-dictionary-set-value "srecode/dictionary")
+(declare-function srecode-load-tables-for-mode "srecode/find")
+(declare-function srecode-table "srecode/find")
+(declare-function srecode-template-get-table "srecode/find")
+(declare-function srecode-insert-fcn "srecode/insert")
+(declare-function srecode-resolve-arguments "srecode/map")
+(declare-function srecode-map-update-map "srecode/map")
+
+;;; Code:
+(defun ede-srecode-setup ()
+  "Update various paths to get SRecode to identify our macros."
+  (let* ((lib (locate-library "ede.el" t))
+	 (ededir (file-name-directory lib))
+	 (tmpdir (file-name-as-directory
+		  (expand-file-name "templates" ededir))))
+    (when (not tmpdir)
+      (error "Unable to location EDE Templates directory"))
+
+    ;; Rig up the map.
+    (require 'srecode/map)
+    (require 'srecode/find)
+    (add-to-list 'srecode-map-load-path tmpdir)
+    (srecode-map-update-map t)
+
+    ;; We don't call this unless we need it.  Load in the templates.
+    (srecode-load-tables-for-mode 'makefile-mode)
+    (srecode-load-tables-for-mode 'makefile-mode 'ede)
+
+    ;; @todo - autoconf files.
+
+    ))
+
+(defmacro ede-srecode-insert-with-dictionary (template &rest forms)
+  "Insert TEMPLATE after executing FORMS with a dictionary.
+TEMPLATE should specify a context by using a string format of:
+  context:templatename
+Locally binds the variable DICT to a dictionary which can be
+updated in FORMS."
+  `(let* ((dict (srecode-create-dictionary))
+	  (temp (srecode-template-get-table (srecode-table)
+					    ,template
+					    nil
+					    'ede))
+	  )
+     (when (not temp)
+       (error "EDE template %s for %s not found!"
+	      ,template major-mode))
+     (srecode-resolve-arguments temp dict)
+
+     ;; Now execute forms for updating DICT.
+     (progn ,@forms)
+
+     (srecode-insert-fcn temp dict)
+     ))
+
+(defun ede-srecode-insert (template &rest dictionary-entries)
+  "Insert at the current point TEMPLATE.
+TEMPLATE should specify a context by using a string format of:
+  context:templatename
+Add DICTIONARY-ENTRIES into the dictionary before insertion.
+Note: Just like `srecode-insert', but templates found in 'ede app."
+  (require 'srecode/insert)
+  (ede-srecode-insert-with-dictionary template
+
+    ;; Add in optional dictionary entries.
+    (while dictionary-entries
+      (srecode-dictionary-set-value dict
+				    (car dictionary-entries)
+				    (car (cdr dictionary-entries)))
+      (setq dictionary-entries
+	    (cdr (cdr dictionary-entries))))
+
+    ))
+
+(provide 'ede-srecode)
+
+;;; ede-srecode.el ends here