;;; ede-pmake.el --- EDE Generic Project Makefile code generator.
-;;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-;;; 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+;; Copyright (C) 1998-2005, 2007-2012 Free Software Foundation, Inc.
;; Author: Eric M. Ludlam <zappo@gnu.org>
;; Keywords: project, make
(goto-char (point-max))))
(put 'ede-pmake-insert-variable-shared 'lisp-indent-function 1)
+(defmacro ede-pmake-insert-variable-once (varname &rest body)
+ "Add VARNAME into the current Makefile if it doesn't exist.
+Execute BODY in a location where a value can be placed."
+ `(let ((addcr t) (v ,varname))
+ (unless (re-search-backward (concat "^" v "\\s-*=") nil t)
+ (insert v "=")
+ ,@body
+ (if addcr (insert "\n"))
+ (goto-char (point-max)))
+ ))
+(put 'ede-pmake-insert-variable-once 'lisp-indent-function 1)
+
;;; SOURCE VARIABLE NAME CONSTRUCTION
(defsubst ede-pmake-varname (obj)
;
; (oref this variables))
;
-; ;; Add in all variables from the configuration not allready covered.
+; ;; Add in all variables from the configuration not already covered.
; (mapc (lambda (c)
;
; (if (member (car c) conf-done)
(setq conf-done (cons (car c) conf-done))))
(insert (cdr c) "\n"))
(oref this variables))
- ;; Add in all variables from the configuration not allready covered.
+ ;; Add in all variables from the configuration not already covered.
(mapc (lambda (c)
(if (member (car c) conf-done)
nil
conf-table))
(let* ((top "")
(tmp this))
+ ;; Use relative paths for subdirs.
(while (ede-parent-project tmp)
(setq tmp (ede-parent-project tmp)
top (concat "../" top)))
- (insert "\ntop=" top))
+ ;; If this is the top, then use CURDIR.
+ (if (and (not (oref this metasubproject)) (string= top ""))
+ (insert "\ntop=\"$(CURDIR)\"/")
+ (insert "\ntop=" top)))
(insert "\nede_FILES=" (file-name-nondirectory (oref this file)) " "
(file-name-nondirectory (ede-proj-dist-makefile this)) "\n"))
this (oref proj configuration-default)))
(conf-done nil)
)
- ;; Add in all variables from the configuration not allready covered.
+ ;; Add in all variables from the configuration not already covered.
(mapc (lambda (c)
(if (member (car c) conf-done)
nil
(link (ede-proj-linkers this))
(name (ede-proj-makefile-target-name this))
(src (oref this source)))
+ (ede-proj-makefile-insert-object-variables (car comp) name src)
(dolist (obj comp)
(ede-compiler-only-once obj
(ede-proj-makefile-insert-variables obj)))
- (ede-proj-makefile-insert-object-variables (car comp) name src)
- (while link
- (ede-linker-only-once (car link)
- (ede-proj-makefile-insert-variables (car link)))
- (setq link (cdr link)))))
+ (dolist (linker link)
+ (ede-linker-only-once linker
+ (ede-proj-makefile-insert-variables linker)))))
(defmethod ede-proj-makefile-insert-automake-pre-variables
((this ede-proj-target))
(defmethod ede-proj-makefile-garbage-patterns ((this ede-proj-target))
"Return a list of patterns that are considered garbage to THIS.
These are removed with make clean."
- ;; Get the the source object from THIS, and use the specified garbage.
+ ;; Get the source object from THIS, and use the specified garbage.
(let ((src (ede-target-sourcecode this))
(garb nil))
(while src
(cond ((eq (cdr sv) 'share)
;; This variable may be shared between multiple targets.
(if (re-search-backward (concat "\\$(" (car sv) ")")
- (save-excursion
- (beginning-of-line)
- (point))
- t)
+ (point-at-bol) t)
;; If its already in the dist target, then skip it.
nil
(setq sv (car sv))))
(provide 'ede/pmake)
-;; arch-tag: 7ad8e19f-cdee-484c-8caf-f15cb0fc4df2
;;; ede/pmake.el ends here