鉴于自己一直都是在做客户端开发方面的工作,服务端很多知识都随着时间淡忘了,最近有一个计划,用一些时间补一下基础.所以早上很早就起床,花了一点时间大致浏览了一下BSD socket的相关API,然后用GNU C写了一个简单的多线程,阻塞EchoServer.工程的代码倒是不多,就是基于原生API开发,总是有很多的errcode需要处理,比较的烦.所以我干脆就直接写了个宏去处理,简单的输出strerrno(errno)和errno就好.虽然这个宏实现起来比较的简单,但是还是感觉比较的值,节省了不少的代码.而且整体的流程更简单明了.

本来是在写代码的,我是用CMake写的项目组织,当然,就几个文件,用CMake简直就是大材小用.但是也正是在这种情况下,更能体验CMake的强大.我用emacs收邮件的时候就想到了emacs的cedet插件中有个ede工程管理模块,所以就上手折腾了一下.期间浪费了一点时间,浪费在我国伟大的天朝上面,没办法,就是不给下载,后来干脆去github clone了1.1版本的插件包.

可能有一些新手在编译cedet包的时候会遇到一些问题,在编译文档的时候,如果确实需要的话,那么可以 sudo apt-get install texinfo.如果不需要,那么就直接make makeinfo=echo就好了.主要是你有没有在编译之前先查看一下文档,这个就不多说了,是常识.下面是我的cedet配置,很简单,只是配置了一些快捷键,其他的都还没弄,有时间再算吧.

  1 ;;------------------------------------------------------------------
  2 ;;%% 打开显示行,列模式(行号显示为4位数)
  3 ;;------------------------------------------------------------------
  4 (global-linum-mode t)
  5 (column-number-mode t)
  6 (setq linum-format "%4d\u2502")
  7
  8 ;;------------------------------------------------------------------
  9 ;;%% 关闭图标工具栏,打开ido模式
 10 ;;------------------------------------------------------------------
 11 (tool-bar-mode -1)
 12 (ido-mode t)
 13
 14 ;;------------------------------------------------------------------
 15 ;;%% 关闭自动备份设置,关闭自动保存
 16 ;;------------------------------------------------------------------
 17 (setq-default make-backup-files nil)
 18 (setq auto-save-default nil)
 19
 20 ;;------------------------------------------------------------------
 21 ;;%% 使用简单的y/n应答模式
 22 ;;------------------------------------------------------------------
 23 (fset 'yes-or-no-p 'y-or-n-p)
 24
 25 ;;------------------------------------------------------------------
 26 ;;%% 高亮显示拷贝,括号配对
 27 ;;------------------------------------------------------------------
 28 (global-font-lock-mode 1)
 29 (transient-mark-mode 1)
 30 (show-paren-mode 1)
 31 (mouse-wheel-mode t)
 32
 33 ;;------------------------------------------------------------------
 34 ;;%% 设置默认字体,字体大小
 35 ;;------------------------------------------------------------------
 36 (set-default-font "Ubuntu Mono-11")
 37
 38 ;;------------------------------------------------------------------
 39 ;;%% 设置tab缩进格式
 40 ;;-----------------------------------------------------------------
 41 (setq indent-tabs-mode nil)
 42 (setq tab-width 4)
 43 ;;------------------------------------------------------------------
 44 ;;%% 加载配置color-theme插件
 45 ;;------------------------------------------------------------------
 46 (add-to-list 'load-path "~/.emacs.d/color-theme-6.6.0")
 47 (require 'color-theme)
 48 (color-theme-initialize)
 49
 50 ;;------------------------------------------------------------------
 51 ;;%% 加载配置auto-complete插件
 52 ;;------------------------------------------------------------------
 53 (add-to-list 'load-path "~/.emacs.d/auto-complete-1.3.1")
 54 (require 'auto-complete-config)
 55 (add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict")
 56 (ac-config-default)
 57
 58 ;;------------------------------------------------------------------
 59 ;;%% 加载配置yasnippet插件
 60 ;;------------------------------------------------------------------
 61 (add-to-list 'load-path "~/.emacs.d/yasnippet")
 62 (require 'yasnippet)
 63 (yas-global-mode 1)
 64
 65 ;;------------------------------------------------------------------
 66 ;;%% 默认启动多窗口调试
 67 ;;------------------------------------------------------------------
 68 (setq gdb-many-windows t)
 69 ;;------------------------------------------------------------------
 70 ;;%% 加载配置tabbar插件,定义快捷键
 71 ;;------------------------------------------------------------------
 72 (add-to-list 'load-path "~/.emacs.d/tabbar/")
 73 (require 'tabbar)
 74 (tabbar-mode)
 75
 76 (global-set-key (kbd "<M-up>")       'tabbar-backward-group)
 77 (global-set-key (kbd "<M-down>")     'tabbar-forward-group)
 78 (global-set-key (kbd "<M-left>")     'tabbar-backward)
 79 (global-set-key (kbd "<M-right>")    'tabbar-forward)
 80
 81 (set-face-attribute 'tabbar-default nil
 82                     :family "Ubuntu Mono"
 83                     )
 84 (set-face-attribute 'tabbar-button nil
 85                     :inherit 'tabbar-default
 86                     :box '(:line-width 1 :color "yellow")
 87                     )
 88 (set-face-attribute 'tabbar-selected nil
 89                          :inherit 'tabbar-default
 90                     :foreground "blue"
 91                     :background "gray"
 92                     :box '(:line-width 1 :color "yellow")
 93                     )
 94 (set-face-attribute 'tabbar-unselected nil
 95                     :inherit 'tabbar-default
 96                     :box '(:line-width 1 :color "yellow")
 97                     )
 98
 99 ;;------------------------------------------------------------------
100 ;;%% 加载配置cedet插件
101 ;;------------------------------------------------------------------
102 (add-to-list 'load-path "~/.emacs.d/cedet-1.1/common")
103 (require 'cedet)
104 (global-ede-mode 1)
105 ;;(semantic-load-enable-code-helpers)
106 (global-srecode-minor-mode 1)
107
108 ;;(semantic-load-enable-minimum-features)
109 (semantic-load-enable-code-helpers)
110 ;;(semantic-load-enable-gaudy-code-helpers)
111 ;;(semantic-load-enable-excessive-code-helpers)
112 (semantic-load-enable-semantic-debugging-helpers)
113
114 (require 'semantic-gcc)
115 (require 'semantic-ia)
116
117 (defun my-cedet-hook()
118
119   (local-set-key [(control tab)] 'semantic-ia-complete-symbol-menu)
120
121   (local-set-key "\C-c?" 'semantic-ia-complete-symbol-menu)
122   (local-set-key (kbd "M-/") 'semantic-ia-complete-symbol)
123
124   (local-set-key "\C-c>" 'semantic-complete-analyze-inline)
125   (local-set-key (kbd "M-n") 'semantic-complete-analyze-inline)
126
127   (local-set-key "\C-cp" 'semantic-analyze-proto-impl-toggle)
128   (local-set-key "\C-cd" 'semantic-ia-fast-jump)
129   (local-set-key "\C-cr" 'semantic-symref-symbol)
130   (local-set-key "\C-cR" 'semantic-symref))
131 (add-hook 'c-mode-common-hook 'my-cedet-hook)
132
133 ;;%% 配置项目解析tag路径
134 ;; (setq semanticdb-project-roots (list (expand-file-name "/")))
135 (defconst cedet-user-include-dirs
136   (list ".." "../include" "../inc" "../common" "../public"
137         "../.." "../../include" "../../inc" "../../common" "../../public"))
138 (defconst cedet-win32-include-dirs
139   (list "C:/MinGW/include"
140         "C:/MinGW/include/c++/3.4.5"
141         "C:/MinGW/include/c++/3.4.5/mingw32"
142         "C:/MinGW/include/c++/3.4.5/backward"
143         "C:/MinGW/lib/gcc/mingw32/3.4.5/include"
144         "C:/Program Files/Microsoft Visual Studio/VC98/MFC/Include"))
145 (require 'semantic-c nil 'noerror)
146 (let ((include-dirs cedet-user-include-dirs))
147   (when (eq system-type 'windows-nt)
148     (setq include-dirs (append include-dirs cedet-win32-include-dirs)))
149   (mapc (lambda (dir)
150           (semantic-add-system-include dir 'c++-mode)
151           (semantic-add-system-include dir 'c-mode))
152         include-dirs))
153 ;;------------------------------------------------------------------
154 ;; 加载配置ecb插件
155 ;;------------------------------------------------------------------
156 (add-to-list 'load-path "~/.emacs.d/ecb")
157 (require 'ecb)
158 (setq stack-trace-on-error nil)
159 (setq  ecb-tip-of-the-day nil)
160
161 ;;-------------------------------------------------------------------

下面就来说说ede插件该如何用,首先就是M-x ede- TAB TAB 会弹出buffer 查看ede-*命令,这些命令还是比较容易懂的.先创建一个ede工程项目 : M-x ede-new RET, 按照要求输入,在选择项目类型的时候可以看到提供了好多种的选择,其中需要关注的就是两种:Make,Automake,其他的不属于本文范畴,可以自己去了解.

作为一个例子,我选择的是Automake,并在AutomakePrj下面创建了一个源文件main.c,里面就是一个简单的main入口方法.,输入项目名称也为:AutomakePrj.做完这些之后,还没有生成automake相关的配置,用过automake的都知道,一般都是在Makefile.am和configure.ac中书写配置,用来生成configure,然后生成Makefile.

执行M-x ede-proj-regenerate或者是在emacs menu-bar上面的project中选择->project options->regenerate makefiles.之后由于automake的规范要求还会提示你创建AUTHOR MISSING等一系列的文件,其中有些配置是根据系统变量或者是emacs配置变量自动填充的,需要修改的话自己去改吧.执行的过程是这样子的:

这里也就是automake执行的过程,通常我们也会将前面一些繁琐的步骤写成一个auto_gen.sh的脚本,在一些开发包中也是可以见得到的,这个就顺便提一下.现在是创建了模板,但是还没有添加我们需要编译的target, 相应的也是可以执行M-x ede-add-target, 可供选择的类型也是很多:

这里我就直接选择了生成program.接下来就可以直接执行M-x ede-compile-project了.另外,ede也提供了debug/release模式的选择,很容易切换 M-x ede-project-configuration-set debug|release.如果是启用了debug模式,那么ede还可以直接debug我们的target,我将emacs的debug模式默认设置成为启动gdb-many-windows,所以debug就很容易了.

使用emacs ede工程组织插件的这种管理方式,不推荐直接使用在实际的项目中,更好的选择是自己去使用automake/cmake去组织,二者之间,我倾向的选择是cmake.随便下载一个开源库,搜索其中的CMakeLists.txt就能知道使用cmake是多么的简单了.我这样选择,是因为经常会用C去写一些小项目(或者是算不上项目的散碎程序),自己不喜欢写Makefile,cmake倒是使用的还不错,只是喜欢使用emacs编码慢悠悠的节奏感,这是我的出发点,可能有点荒唐,我也不期望被大多数同行理解.

转载于:https://www.cnblogs.com/respawn/p/4214576.html

emacs工程管理,cedet ede插件自动构建Make,Automake相关推荐

  1. Devops之Gradle SpringBoot构建打包工程jar、搭建jenkins自动发布

    本文逐渐涉及当前敏捷开发中非常火的DevOps相关的技术,也就是自动化开发运维.整体偏向于环境搭建,整体学习路线为: (1)SpringBoot+Gradle+Nexus远程仓库构建打包工程jar ( ...

  2. jenkins的安装配置,插件配置,安装插件,配置maven,jdk路径,配置安装插件,项目配置,自动构建配置

    1.下载jenkins,下载地址: https://jenkins.io/ 2.运行命令,启动jenkins 将jenkins上传到:/home/tuzq/software 安装JDK,maven ( ...

  3. jenkins插件更换源_jenkins快速入门,自动构建一个hello world项目(devops,ci/cd)

    jenkins是一个非常老牌的ci/cd工具,它是一款使用Java写的开源自动化应用.可以通过界面或Jenkinsfile告诉它执行什么任务,何时执行,理论上,可以让它执行任何事,一般用来做ci/cd ...

  4. 怎么把项目推到gitlab上_Gitlab利用Webhook+jenkins实现自动构建与部署

    之前部署了Gitlab的代码托管平台和Jenkins的代码发布平台.通常是开发后的代码先推到Gitlab上管理,然后在Jenkins里通过脚本构建代码发布. 这种方式每次在发版的时候,需要人工去执行j ...

  5. 实战:向GitHub提交代码时触发Jenkins自动构建

    当我们提交代码到GitHub后,可以在Jenkins上执行构建,但是每次都要动手去执行略显麻烦,今天我们就来实战Jenkins的自动构建功能,每次提交代码到GitHub后,Jenkins会进行自动构建 ...

  6. 【完整示例】采用jenkins pipeline实现自动构建并部署至k8s

    前言 在日常开发中,经常会有发布的需求,而且经常会碰到各种环境,比如:开发环境.测试环境.生产环境.虽然可以使用手动构建.上传服务器部署的方式,但在微服务架构下一个项目经常包含多个微服务的部署,如果用 ...

  7. gitlab 自动推送代码到gitee_Gitlab 利用 Webhook+jenkins 实现自动构建与部署

    之前部署了Gitlab的代码托管平台和Jenkins的代码发布平台.通常是开发后的代码先推到Gitlab上管理,然后在Jenkins里通过脚本构建代码发布. 这种方式每次在发版的时候,需要人工去执行j ...

  8. .net 基于Jenkins的自动构建系统开发

    先让我给描述一下怎么叫一个自动构建或者说是持续集成 : 就拿一个B/S系统的合作开发来说,在用SVN版本控制的情况下,每个人完成自己代码的编写,阶段性提交代码,然后测试-修改,最后到所有代码完工,进行 ...

  9. 手动特征工程已经OUT了!自动特征工程才是改进机器学习的方式

    作者 | William Koehrsen 译者 | linstancy 编辑 | Jane 出品 | AI科技大本营 [导读]近年来,我们在自动模型选择和超参数调优方面取得了进展,但机器学习流程中最 ...

  10. Jenkins构建之常用的触发器和Git Hook自动构建

    Jenkins项目构建细节之常用的构建触发器 Jenkins内置4种构建触发器: 触发远程构建 其他工程构建后触发(Build after other projects are build) 定时构建 ...

最新文章

  1. seo说_百度指数看世间沉浮_如何快速排名-互点快速排名_网站关键词排名常见问题 - 搜狗快速排名...
  2. (转)---再说卷积
  3. 您的UX库不只是书籍
  4. ntko 发生错误:保存html到临时文件目录发生错误,【ntko文件存取错误】_如何处理OA系统在线阅读或编辑文档时提示“文件存取错误”的问题...
  5. 机器学习(五)——机器视觉从入门到精通只要简单这3步
  6. c51单片机矩阵键盘1602计算器_基于AT89C51单片机的十进制计算器系统设计
  7. 教师测评系统php,校无忧教师评价系统 v2.6
  8. MapAbc使用体验
  9. 那些年Android面试官常问的知识点,快来收藏!
  10. 项目管理心得--第一篇
  11. Qt错误 error: C2228: “.exec”的左边必须有类/结构/联合 的解决方法
  12. 酷睿i7 12700h参数 i712700h属于什么级别
  13. 路由器AP、中继、桥接等模式区别
  14. 关于host文件、IE代理和nginx的关系
  15. 程序员面试备战篇:69个经典Spring面试专题解析(干货分享答案)
  16. 分布式任务编排调度框架设计
  17. R语言离群值处理分析
  18. Java字节码技术(二)字节码增强之ASM、JavaAssist、Agent、Instrumentation
  19. 怎么快速获取复杂json的结构
  20. 用JAVA获取文件的MD5哈希码

热门文章

  1. 智能优化算法:头脑风暴优化算法-附代码
  2. EXCEL 选中单元格并拖动等操作。
  3. 基于Lua语言的wireshark插件编写
  4. Flutter之Align和AlignmentGeometry
  5. 再见,2016,你好,2017
  6. 服务器上的数据库文件夹下,服务器怎么打开数据库文件夹下
  7. mysql if没用_关于MySql中使用IFNULL()函数失效的问题。
  8. 面试相关——计算机网络基础
  9. cad相对坐标快捷键_CAD里面绝对、相对、极坐标是什么?如何区别
  10. java展开式的菜单_ListView点击Item展开菜单实现代码详解