Thread: [CEDET-devel] CEDET & QT issues
Brought to you by:
zappo
From: Camden N. <cn...@cd...> - 2012-01-13 14:47:47
|
Hi all, I was wondering if I could get some help fixing my CEDET configuration. I have two problems (that I know of) the first being that QT (4.7) and CEDET don't seem to play nice, I added the QT includes to the list of system includes as per: http://alexott.blogspot.com/2009/02/cedet-qt.html but even on that page it says it won't work with newer versions of cedet. I get errors such as (wrong-type-argument stringp (((0) "qint8"))) all the time, especially when trying to use the jump to definition functionality. The second issue is that my project is broken down into many smaller libraries (compiled by bjam/boost-build), and CEDET seems to be designed to have project source code included as "local" includes, not system includes which bjam uses. When I try and add all of my libs to the system includes everything runs very very slowly, and many includes cannot be found. Looking at what documentation I could find it looks like I should be making many smaller projects and then having them under a parent project, but I'm having severe difficulty understanding the existing documentation on how to do that. (I've been reading: http://cedet.sourceforge.net/projects.shtml and various pages around http://www.randomsample.de/cedetdocs/ede/ede/ede_002dcpp_002droot_002dprojec t.html#ede_002dcpp_002droot_002dproject ) I'll include my .emacs file at the bottom, for reference. I'd really appreciate any help I can get. It'd be really nice to get this working. Camden Narzt ;;--------------------------cedet stuff------------------------------------------------- (defun get-file (dir) (car (remove-nils (mapcar (function (lambda (file) (unless (null (string-prefix-p "Jam" file)) file))) (directory-files dir))))) (defun MY-FILE-FOR-DIR (&optional dir) "Return a full file name to the project file stored in DIR." (if (null dir) (expand-file-name (get-file (MY-ROOT-FCN)) (MY-ROOT-FCN)) (expand-file-name (get-file dir) dir))) (defun MY-ROOT-FCN () "Return the root fcn for `default-directory'" (getenv "CODEDIR")) (defun my-locate-fcn-recursor (files path) "find non nil entry in files, and append to path" (unless (null files) (if (null (car files)) (my-locate-fcn-recursor (cdr files) (cdr path)) (expand-file-name (car (car files)) (expand-file-name (car path) (MY-ROOT-FCN)))))) (defun my-locate-fcn (NAME DIR) "find NAME under DIR, with knowledge about BOBCAT projects" (let ((files (mapcar (function (lambda (DIRS) (member NAME DIRS))) (mapcar 'directory-files (mapcar (function (lambda (suffix) (expand-file-name suffix (MY-ROOT-FCN)))) (pathFunction))) )) (paths (pathFunction))) (my-locate-fcn-recursor files paths))) (defun pathFunction () "returns the dirs to look in for this project" (remove-nils (mapcar 'getPath (with-temp-buffer (insert-file-contents (expand-file-name "Jamroot" (getenv "CODEDIR"))) (split-string (buffer-string) "\n" t))))) (defun remove-nils (list) "remove nulls from a list" (unless (null list) (if (null (car list)) (remove-nils (cdr list)) (cons (car list) (remove-nils (cdr list)))))) (defun getPath (string) (unless (null string) (when (string-prefix-p "use-project " string) (cadddr (split-string string '() t))))) (defun system-include-recurser (DIRS) (unless (null DIRS) (if (or (equal "linux" (car DIRS)) (equal "include" (car DIRS))) (if (equal "linux" (car DIRS)) (concat (car DIRS) "/include") (car DIRS)) (system-include-recurser (cdr DIRS))))) (defun remove-dots (DIRS) "remove .s from a list" (unless (null DIRS) (if (null (string-prefix-p "." (car DIRS))) (cons (car DIRS) (remove-dots (cdr DIRS))) (remove-dots (cdr DIRS))))) (defun replace-nils (DIRS) (unless (null DIRS) (if (null (car DIRS)) (cons "/" (replace-nils (cdr DIRS))) (cons (car DIRS) (replace-nils (cdr DIRS)))))) (defun system-include-function () "include all third party libraries in project" (setq include-dir (expand-file-name "3rdparty" (getenv "CODEDIR"))) (setq libs (mapcar (function (lambda (DIR) (expand-file-name DIR include-dir))) (remove-dots (directory-files include-dir))));;list of libs (mapc (function (lambda (DIR) (semantic-add-system-include (expand-file-name DIR include-dir) 'c++-mode))) (merge libs (replace-nils (mapcar 'system-include-recurser (mapcar 'remove-dots (mapcar 'directory-files libs))))))) (defun MY-LOAD (dir) "Load a project of type `cpp-root' for the directory DIR. Return nil if there isn't one." ;; Use your preferred construction method here. (ede-cpp-root-project "Workspace" :file (MY-FILE-FOR-DIR dir) :locate-fcn 'my-locate-fcn :name (getenv "DEPOT_NAME");needs to be uniq for sub projects ;; :file (funcall 'MY-FILE-FOR-DIR) :include-path (funcall 'pathFunction) :system-include-path '("/usr/include/c++/4.1.2/"))) (load-file "~/.emacs.d/site-lisp/cedet-1.0/common/cedet.elc") ;(require 'cedet) (require 'semantic-decorate-include) (require 'semantic-ia) (require 'semantic-gcc) (global-ede-mode t) (semantic-load-enable-gaudy-code-helpers) (add-to-list 'ede-project-class-files (ede-project-autoload "cpp-root" :name (getenv "DEPOT_NAME") :file 'ede-cpp-root :proj-root 'MY-ROOT-FCN :proj-file 'MY-FILE-FOR-DIR :load-type 'MY-LOAD :class-sym 'ede-cpp-root) ; I also saw this called ede-cpp-root-project t) (defun sort-next-includes () (unless (null (search-forward-regexp "^\\(#include\\|\\(class\\|struct\\).*;\\)" nil t)) (beginning-of-line) (open-line 1) (next-line) (mark-paragraph) (sort-lines nil (marker-position (mark-marker)) (point-marker)) (delete-blank-lines))) ;; syntax-highlighting for Qt (defun cnarzt/c-mode-common-hook () "Set up c-mode and related modes. Includes support for Qt code (signal, slots and alikes)." (visit-tags-table (expand-file-name "/TAGS" (getenv "CODEDIR"))) ;; add knowledge of qt to emacs (setq qt4-base-dir (concat (getenv "QTDIR") "/include")) (add-hook 'before-save-hook '(lambda () (delete-trailing-whitespace) (save-excursion (progn (goto-char (point-min)) (sort-next-includes) (forward-paragraph) (sort-next-includes) (forward-paragraph) (sort-next-includes) (goto-char (point-max)) (delete-blank-lines))))) (mapc (function (lambda (DIR) (semantic-add-system-include (concat (concat qt4-base-dir "/") DIR) 'c++-mode))) (remove-dots (directory-files qt4-base-dir))) (defun merge (L S) "take two lists and concat the contents to make one list" (unless (or (null L) (null S)) (cons (expand-file-name (car S) (car L)) (merge (cdr L) (cdr S))))) (funcall 'system-include-function) (mapc (function (lambda (DIR) (semantic-add-system-include DIR 'c++-mode))) (pathFunction)) (add-to-list 'auto-mode-alist (cons qt4-base-dir 'c++-mode)) (add-to-list 'semantic-lex-c-preprocessor-symbol-file (concat qt4-base-dir "/Qt/qconfig.h")) (add-to-list 'semantic-lex-c-preprocessor-symbol-file (concat qt4-base-dir "/Qt/qconfig-large.h")) (add-to-list 'semantic-lex-c-preprocessor-symbol-file (concat qt4-base-dir "/Qt/qglobal.h")) ;; qt keywords and stuff ... ;; set up indenting correctly for new qt kewords (setq c-protection-key (concat "\\<\\(public\\|public slot\\|protected" "\\|protected slot\\|private\\|private slot" "\\)\\>") c-C++-access-key (concat "\\<\\(signals\\|public\\|protected\\|private" "\\|public slots\\|protected slots\\|private slots" "\\)\\>[ \t]*:")) ; (setq ff-search-directories (mapcar '(lambda (arg) (expand-file-name arg (getenv "CODEDIR"))) (pathFunction))) (progn ;; modify the colour of slots to match public, private, etc ... (font-lock-add-keywords 'c++-mode '(("\\<\\(slots\\|signals\\)\\>" . font-lock-type-face))) ;; make new font for rest of qt keywords (make-face 'qt-keywords-face) (set-face-foreground 'qt-keywords-face "BlueViolet") ;; qt keywords (font-lock-add-keywords 'c++-mode '(("\\<Q_OBJECT\\>" . 'qt-keywords-face))) (font-lock-add-keywords 'c++-mode '(("\\<SIGNAL\\|SLOT\\>" . 'qt-keywords-face))) (font-lock-add-keywords 'c++-mode '(("\\<Q[A-Z][A-Za-z]*" . 'qt-keywords-face))) ) (setq completion-at-point-functions 'semantic-ia-complete-symbol) (local-set-key "\C-c?" 'semantic-ia-complete-symbol-menu) (local-set-key "\C-c>" 'semantic-complete-analyze-inline) (local-set-key "\C-c=" 'semantic-decoration-include-visit) (local-set-key "\C-cj" 'semantic-ia-fast-jump) ; causes errors every time (local-set-key "\C-cq" 'semantic-ia-show-doc) (local-set-key "\C-cs" 'semantic-ia-show-summary) (local-set-key "\C-cp" 'semantic-analyze-proto-impl-toggle) ; works maybe half the time ) (add-hook 'c-mode-common-hook 'cnarzt/c-mode-common-hook) |
From: Eric M. L. <eri...@gm...> - 2012-01-18 03:38:02
|
On 01/13/2012 09:47 AM, Camden Narzt wrote: > Hi all, > > > > I was wondering if I could get some help fixing my CEDET configuration. > > > > I have two problems (that I know of) the first being that QT (4.7) and CEDET > don't seem to play nice, I added the QT includes to the list of system > includes as per: http://alexott.blogspot.com/2009/02/cedet-qt.html but even > on that page it says it won't work with newer versions of cedet. I get > errors such as (wrong-type-argument stringp (((0) "qint8"))) all the time, > especially when trying to use the jump to definition functionality. Hi, The error you quote above looks to me like something got confused in the C++ preprocessor support. ie - some macro somehow confused things. Once something bogus gets in, it can be hard to get it out again. You need to quit emacs, delete your ~/.semanticdb/ cache files associated with the problem and, perhaps, try again. Before that, however, use M-x toggle-debug-on-error, and get a stack trace. That might let you know which file used/introduced the bogus bit of data. That in turn might lead you to the offending code that got parsed wrong. I don't use Qt, so I won't be too much help here, but the stack might lead us to the right answer. > > The second issue is that my project is broken down into many smaller > libraries (compiled by bjam/boost-build), and CEDET seems to be designed to > have project source code included as "local" includes, not system includes > which bjam uses. When I try and add all of my libs to the system includes > everything runs very very slowly, and many includes cannot be found. Looking > at what documentation I could find it looks like I should be making many > smaller projects and then having them under a parent project, but I'm having > severe difficulty understanding the existing documentation on how to do > that. (I've been reading: http://cedet.sourceforge.net/projects.shtml and > various pages around > http://www.randomsample.de/cedetdocs/ede/ede/ede_002dcpp_002droot_002dprojec > t.html#ede_002dcpp_002droot_002dproject ) > > > > I'll include my .emacs file at the bottom, for reference. > Your .emacs is quite impressive for trying to get things bootstrapped as you describe. Remember that the longer things like an include path is, the slower anything being looked up there will be. I don't know quite how long that list is. You could try profiling to see where the time is spent before guessing too much. Also, if you are aggressive in parsing ALL the code in your project, you may just be running into a problem where Emacs is too big. Check your process list when things get slow to see if Emacs is swapping. If so, cut back to just the code you actually use, and skip the rest. Lastly, overcoming errors (as you mention above) slows things down, as there are many cases where errors are skipped, but they may still be impacting things performance wise. >(add-to-list 'ede-project-class-files > (ede-project-autoload "cpp-root" > :name (getenv "DEPOT_NAME") > :file 'ede-cpp-root > :proj-root 'MY-ROOT-FCN > :proj-file 'MY-FILE-FOR-DIR > :load-type 'MY-LOAD > :class-sym 'ede-cpp-root) ; I also saw this called ede-cpp-root-project > t) you are right in your comment, I think that is a typo in the comments for ede-cpp-root. I'm not sure how you might be successful with the type in there. Good Luck Eric |