开发者

C preprocessor defines not taken into account by Cedet/Semantic

I am trying to use Emacs as an IDE in my Linux kernel development projects. So I installed CEDET and GNU Global (gtags) with no problems.

When I open a C source code belonging to my Linux kernel source folder, the linux project is detected automatically. Functions, variables, headers and other keywords are highlighted correctly.

Through the ~/.emacs file I configured semantic's code completion and intellisense. So when I press C- the code completion menu appears and I can choose what's needed.

The issue is when I use preprocessor defines, the intellisense system shows the menu on the current location but doesn't detect the right things when invoked (C-). Even I close and restart emacs the same behavior is reproduced.

The test code is:

//----------------------------------------------------------------------------------------

typedef struct
{
     int p1;

        #ifdef __KERNEL__

            int p2;

        #endif

        #ifdef USE1

             char p3;

          #endif

#ifdef __LINUX_ARM_ARCH__

   int p4;

#endif

}OBJ;

OBJ g_obj;

//----------------------------------------------------------------------------------------

KERNEL , USE1 and LINUX_ARM_ARCH are already defined as follows:

__KERNEL__ : (add-to-list 'semantic-lex-c-preprocessor-symbol-map '("__KERNEL__" . "")) in .emacs
USE1 : defined in a header file included by the current C source file.
__LINUX_ARM_ARCH__ : (add-to-list 'semantic-lex-c-preprocessor-symbol-file "/home/abdellatif/kernel/include/generated/autoconf.h") in .emacs

In the .emacs file I also added all the needed includes and defines required by GCC cross compiler (GCC for ARM) to build the kernel project.

I also tried to force semantic to use GCC cross compiler command line in place of the system GCC to preprocess correctly but haven't found how to do that.

The "M-x semantic-c-describe-environment" command shows the right include paths and defines (set in .emacs). But the system GCC defines are also listed.

The .emacs file and the software versions a开发者_开发问答re shown below.

Any help or indication is welcomed :) Best regards

############# Software versions #############

- Emacs (23.2.1)
- Ubuntu machine (natty, 11.04)
- Cedet 1.0 (from http://cedet.sourceforge.net/)
############# .emacs #############

;load CEDET

(load-file "~/Documents/my_emacs/cedet-1.0/common/cedet.el")

(require 'ede)

(global-ede-mode t)
; turn on which-func support (plus all other code helpers)
(semantic-load-enable-gaudy-code-helpers)
(semantic-load-enable-excessive-code-helpers)

; turn on all "useful" features
(setq semantic-load-turn-useful-things-on t)

(setq-mode-local c-mode
         semanticdb-find-default-throttle
         '(project unloaded system recursive))

;init names completion, and displaying of information for tags & classes
(require 'semantic-ia)

;preprocessing of source code

(require 'semantic-c)

(semantic-reset-system-include 'c-mode)
(semantic-reset-system-include 'c++-mode)
(semantic-add-system-include "/home/abdellatif/toolchain/arm-eabi-4.4.3/lib/gcc/arm-eabi/4.4.3/include" 'c-mode)
(semantic-add-system-include "/home/abdellatif/kernel/arch/arm/include" 'c-mode)
(semantic-add-system-include "/home/abdellatif/kernel/include" 'c-mode)
(semantic-add-system-include "/home/abdellatif/kernel/arch/arm/mach-omap2/include" 'c-mode)
(semantic-add-system-include "/home/abdellatif/kernel/arch/arm/plat-omap/include" 'c-mode)
(add-to-list 'semantic-lex-c-preprocessor-symbol-file "/home/abdellatif/kernel/include/generated/autoconf.h")
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("__KERNEL__" . ""))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("__LINUX_ARM_ARCH__" . "7"))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("KBUILD_STR(s)" . "#s"))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("KBUILD_BASENAME" . "KBUILD_STR(main)"))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("KBUILD_MODNAME" . "KBUILD_STR(main)"))

;semantic integration with imenu (display of a menu with a list of functions, variables, and other tags)
(defun my-semantic-hook ()
  (imenu-add-to-menubar "TAGS"))
(add-hook 'semantic-init-hooks 'my-semantic-hook)

;names completion (semantic commands)
(defun my-cedet-hook ()
 (local-set-key [(control return)] 'semantic-ia-complete-symbol)
  (local-set-key "\C-x " 'semantic-ia-complete-symbol-menu)
   (local-set-key "\C-x\r" 'gtags-find-tag-from-here))
(add-hook 'c-mode-common-hook 'my-cedet-hook)

;navigating in source code
(semantic-mru-bookmark-mode 1)

;tell semantic to store its tags database between sessions here
(require 'semanticdb)
(setq-default semanticdb-default-save-directory "~/.semantic.cache")
(setq-default semanticdb-default-system-save-directory "~/.semantic.cache")

;allow Semanticdb use databases generated by global(gtags)
(require 'semanticdb-global)
(semanticdb-enable-gnu-global-databases 'c-mode)


  1. You should get cedet from mainline:
    bzr://cedet.bzr.sourceforge.net/bzrroot/cedet/code/trunk/
    there were several fixes for preprocessor handling recently.

  2. After changing the list of semantic-lex-c-preprocessor-symbol-file and similar stuff, you should remove semantic cache and allow it recreate it from scratch.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜