Function: project-am-scan-for-targets

project-am-scan-for-targets is a byte-compiled function defined in project-am.el.gz.

Signature

(project-am-scan-for-targets CURRPROJ DIR)

Documentation

Scan the current Makefile.am for targets.

CURRPROJ is the current project being scanned. DIR is the directory to apply to new targets.

Source Code

;; Defined in /usr/src/emacs/lisp/cedet/ede/project-am.el.gz
(defun project-am-scan-for-targets (currproj dir)
  "Scan the current Makefile.am for targets.
CURRPROJ is the current project being scanned.
DIR is the directory to apply to new targets."
  (let* ((otargets (oref currproj targets))
	 ;; `ntargets' results in complete targets list
	 ;; not only the new targets by diffing.
	 (ntargets nil)
	 (tmp nil)
	 )

    (mapc
     ;; Map all the different types
     (lambda (typecar)
       (let ((macro (nth 2 typecar))
	     (class (nth 1 typecar))
	     (indirect (nth 3 typecar))
	     )
	 (if indirect
	     ;; Map all the found objects
	     (mapc (lambda (lstcar)
		     (setq tmp (object-assoc lstcar 'name otargets))
		     (when (not tmp)
		       (setq tmp (apply class lstcar :name lstcar
					:path dir nil)))
		     (project-rescan tmp)
		     (setq ntargets (cons tmp ntargets)))
		   (makefile-macro-file-list macro))
	   ;; Non-indirect will have a target whose sources
	   ;; are actual files, not names of other targets.
	   (let ((files (makefile-macro-file-list macro)))
	     (when files
	       (setq tmp (object-assoc macro 'name otargets))
	       (when (not tmp)
		 (setq tmp (apply class macro :name macro
				  :path dir nil)))
	       (project-rescan tmp)
	       (setq ntargets (cons tmp ntargets))
	       ))
	   )
	 ))
     project-am-type-alist)

    ;; At now check variables for meta-target regexp
    ;; We have to check ntargets to avoid useless rescan.
    ;; Also we have check otargets to prevent duplication.
    (mapc
     (lambda (typecar)
       (let ((class (nth 0 typecar))
	     (metaregex (nth 1 typecar))
	     (indirect (nth 2 typecar)))
	 (if indirect
	     ;; Map all the found objects
	     (mapc
	      (lambda (lstcar)
		(unless (object-assoc lstcar 'name ntargets)
		  (or
		   (setq tmp (object-assoc lstcar 'name otargets))
		   (setq tmp (apply class lstcar :name lstcar
				    :path dir nil)))
		  (project-rescan tmp)
		  (setq ntargets (cons tmp ntargets))))
	      ;; build a target list to map over
	      (let (atargets)
		(dolist (TAG
			 (semantic-find-tags-by-name-regexp
			  metaregex (semantic-find-tags-by-class
				     'variable (semantic-fetch-tags))))
		  ;; default-value have to be a list
		  (when (cadr (assoc ':default-value TAG))
		    (setq atargets
			  (append
			   (nreverse (cadr (assoc ':default-value TAG)))
			   atargets))))
		(nreverse atargets)))

	   ;; else not indirect, TODO: FIX various direct meta type in a sane way.
	   (dolist (T (semantic-find-tags-by-name-regexp
		       metaregex (semantic-find-tags-by-class
				  'variable (semantic-fetch-tags))))
	     (unless (setq tmp (object-assoc (car T) 'name ntargets))
	       (or (setq tmp (object-assoc (car T) 'name otargets))
		   ;; we are really new
		   (setq tmp (apply class (car T) :name (car T)
				    :path dir nil)))
	       (project-rescan tmp)
	       (setq ntargets (cons tmp ntargets))))
	   )))
     project-am-meta-type-alist)
    ntargets))