linux - C 预处理器定义未被 Cedet/Semantic 考虑

标签 linux emacs linux-kernel preprocessor emacs-semantic

我正尝试在我的 Linux 内核开发项目中使用 Emacs 作为 IDE。所以我毫无问题地安装了 CEDET 和 GNU Global (gtags)。

当我打开属于我的 Linux 内核源文件夹的 C 源代码时,会自动检测到 linux 项目。函数、变量、标题和其他关键字正确突出显示。

通过 ~/.emacs 文件,我配置了语义的代码完成和智能感知。因此,当我按下 C- 时,会出现代码完成菜单,我可以选择需要的内容。

问题是当我使用预处理器定义时,智能感知系统在当前位置显示菜单但在调用时没有检测到正确的东西 (C-)。即使我关闭并重新启动 emacs,也会重现相同的行为。

测试代码为:

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

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 和 LINUX_ARM_ARCH 已经定义如下:

__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

在 .emacs 文件中,我还添加了 GCC 交叉编译器(GCC for ARM)构建内核项目所需的所有包含和定义。

我还尝试强制语义使用 GCC 交叉编译器命令行代替系统 GCC 进行正确预处理,但还没有找到如何做到这一点。

“M-x semantic-c-describe-environment”命令显示正确的包含路径并定义 (在 .emacs 中设置)。但是 GCC 定义的系统也被列出。

.emacs 文件和软件版本如下所示。

欢迎任何帮助或指示:) 最好的问候

############# 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. 您应该从主线获取 cedet:
    bzr://cedet.bzr.sourceforge.net/bzrroot/cedet/code/trunk/
    最近有几个预处理器处理的修复。

  2. 更改 semantic-lex-c-preprocessor-symbol-file 和类似列表后 东西,你应该删除语义缓存并允许它从头开始重新创建它。

关于linux - C 预处理器定义未被 Cedet/Semantic 考虑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7300266/

相关文章:

emacs - emacs 中源代码的结构 View

emacs - 在运行的 Emacs Lisp 程序上设置断点

linux-kernel - uart_register_driver 和 platform_driver_register 的区别?

c - 相互依赖的TCL扩展

Linux shell - 创建多个文件夹,其中包含多个文本文件

linux - 在 Linux 中通过蓝牙访问 Neurosky Mindset 的串行数据

emacs - 如何使泥土轨道模式与彩色多行提示一起使用

linux - 在将数据从内核复制到用户期间,非阻塞I/O是否会进入休眠状态?

linux - 无法执行/初始化

c - strace如何读取系统调用sys_open的文件名?