自动生成项目的Makefile文件
自动生成项目的Makefile文件
理论基础
跟我一起写 Makefile: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=408225
步骤
- 写好Makefile.am
- 运行 autoscan , 自动创建两个文件: autoscan.log configure.scan
- 将configure.scan 命名为configure.ac,修改某些内容,具体怎么修改后面再讲
- 运行aclocal,生成一个“aclocal.m4”文件和一个缓冲文件夹autom4te.cache,该文件主要处理本地的宏定义
- 运行 autoconf,目的是生成 configure
- 运行 autoheader,它负责生成config.h.in文件。该工具通常会从“acconfig.h”文件中复制用户附加的符号定义
- 运行automake,生成Makefile.in
- 运行configure,通过运行自动配置设置文件configure,把Makefile.in变成了最终的Makefile。
注意到,在前面介绍的步骤中,只有两处需要对文件内容进行修改:Makefile.am和configure.ac。
编写Makefile.am
假如安装目录如下:
. ├── echo_server # 打包生成动态链接库(so文件) ├── etc # 配置文件 ├── script # 启动、停止等脚本文件 ├── src # 源文件 └── tools # 工具文件
主目录的Makefile.am:
# Process this file with automake to produce Makefile.in SUBDIRS = etc src script tools echo_server DIST_SUBDIRS = etc src script tools echo_server
etc目录的Makefile.am:
# Makefile.am不能有空格,必须是tab才行,这个Makefile.am主要作用是把framework.json这个配置文件安装到相应的目录中 # Process this file with automake to produce Makefile.in DEFAULT_CONFIG_DIR = $(sysconfdir) # more configs can be separated by a space DEFAULT_GLB_CONFIG_DIR = $(sysconfdir)/glb FRAMEWORK_CONFS = framework.json install-data-local: @if test ! -d $(DESTDIR)$(DEFAULT_CONFIG_DIR); then \ $(mkinstalldirs) $(DESTDIR)$(DEFAULT_CONFIG_DIR); \ fi @if test ! -d $(DESTDIR)$(DEFAULT_GLB_CONFIG_DIR); then \ $(mkinstalldirs) $(DESTDIR)$(DEFAULT_GLB_CONFIG_DIR); \ fi $(INSTALL_DATA) $(srcdir)/$(FRAMEWORK_CONFS) $(DESTDIR)$(DEFAULT_GLB_CONFIG_DIR)/$(FRAMEWORK_CONFS);
echo_server目录的Makefile.am:
# Process this file with automake to produce Makefile.in CXX = g++ -std=c++0x LIBS = -ljsoncpp -lrt -lpthread -levent # 依赖的库 lib_LTLIBRARIES = libecho_server.la # 动态链接库名称 libecho_server_la_SOURCES = \ # 生成动态链接库的源文件 echo.cc libecho_server_la_LIBADD = \ # 依赖于src/libframework_tool.so $(top_srcdir)/src/libframework_tool.la # $(top_srcdir)实际就是主目录 # $(prefix)这个是从./configure --prefix=/home/yjr/framework中传进来 AM_CPPFLAGS = \ -I$(prefix)/modules/include \ -I$(top_srcdir)/src AM_CXXFLAGS = -Wall -Wextra -pedantic AM_LDFLAGS = \ # 安装目录 -L$(prefix)/modules/lib \ # 动态链接库将会安装到$(prefix)/modules/lib -I$(top_srcdir)/src # 依赖的源文件 clean-local: # 执行make clean时,执行的命令 $(RM) -r genpy # 执行make clean时,删除genpy这个目录
src下Makefile.am:
# Process this file with automake to produce Makefile.in CXX = g++ -std=c++0x LIBS = -ljsoncpp -lpthread -levent -DUSE_JEMALLOC -ljemalloc -ldl -L$(prefix)/modules/lib -I$(prefix)/modules/include # 依赖的库 lib_LTLIBRARIES = libframework_tool.la # 生成动态链接库 libframework_tool_la_SOURCES = \ logging/debug.cc \ base/CUtil.cc \ config/config_module.cc libframework_tool_la_LIBADD = \ $(prefix)/modules/lib/libevent.la noinst_LTLIBRARIES = libdfrpcif.la # 生成库,但无需安装 nodist_libdfrpcif_la_SOURCES = \ protocol/rpc_handler.cc \ protocol/rpc_types.cc \ base/set_proc_title.c libdfrpcif_la_LIBADD = \ $(prefix)/modules/lib/libevent.la sbin_PROGRAMS = framework framework_gdb # 生成两个bin文件,如果生成一个,则把其中一个去掉即可 framework_SOURCES = \ # 第一个bin文件,主文件 main.cc framework_LDADD = \ # 依赖的第三方库 -lboost_system -lboost_filesystem -ldl -L$(prefix)/modules/lib\ libdfrpcif.la \ libframework_tool.la framework_gdb_SOURCES = \ # 第二个bin文件 main.cc framework_gdb_LDADD = \ -lboost_system -lboost_filesystem -ldl -L$(prefix)/modules/lib\ libdfrpcif.la \ libframework_tool.la framework_gdb_LDFLAGS = -g -Ddebug include_HEADERS = \ # 需要安装的头文件 framework.h base_includedir = $(includedir)/base # 需要安装的头文件 base_include_HEADERS = \ base/CUtil.h config_includedir = $(includedir)/config # 需要安装的头文件 config_include_HEADERS = \ config/config_module.h logging_includedir = $(includedir)/logging # 需要安装的头文件 logging_include_HEADERS = \ logging/debug.h AM_CPPFLAGS = \ $(BOOST_CPPFLAGS) \ $(LIBEVENT_CPPFLAGS) \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/base \ -I$(top_srcdir)/src/config \ -I$(top_srcdir)/src/debug \ -I$(top_srcdir)/src/protocol \ -I$(prefix)/modules/include AM_CXXFLAGS = -Wall -Wextra -pedantic AM_LDFLAGS = $(BOOST_LDFLAGS) $(LIBEVENT_LDFLAGS) clean-local: $(RM) -r protocol/cpp install-exec-hook: # 安装可执行文件 $(INSTALL) $(top_srcdir)/script/start_server.sh $(DESTDIR)$(sbindir)/start_server.sh $(INSTALL) $(top_srcdir)/script/stop_server.sh $(DESTDIR)$(sbindir)/stop_server.sh
其它的就不再细说
编写configure.ac
AC_INIT([df_framework], [1.0], [http://www.yejinru.com])
AC_CONFIG_SRCDIR([src/main.cc]) # main函数文件
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_LIBTOOL
AC_CONFIG_FILES([Makefile # 包含有Makefile文件的目录
etc/Makefile
src/Makefile
script/Makefile
tools/Makefile])
除了前面修改的内容以外,还可以增加第三方库的安装检查。比如判断boost_filesystem是否已经安装,可在configure.ac中增加:
# FIXME: Replace `main' with a function in `-lboost_filesystem': AC_CHECK_LIB([boost_filesystem], [main])
假如我们想在安装前执行某个shell脚本,我们也可以在configure.ac中增加相关命令。
cd src/protocol && ./update_proto.sh && cd -
注意
1. 如果在confiugre.ac中定义了宏AC_PROG_LIBTOOL,
1)automake时可能提示提示“required file `build/ltmain.sh' not found”。可运行如下命令自动copy到当前工程:
libtoolize --automake --copy --debug --force
2) 如果出现如下提示:
configure.ac: required file `./install-sh' not found
configure.ac: required file `./missing' not found
Makefile.am: required file `./depcomp' not found
可使用命令automake --add-missing,或将/usr/share/automake-1.X/目录下的depcomp等文件拷贝到本目录下
2. 如果引用第三方的库需要先解压和编译,也可以将对应的configure & make & make install写在configure.ac中
自动生成项目的Makefile文件的更多相关文章
- webpack自动生成项目的html
1 自动生成多个html页面 设置webpack.config.js中的plugins属性,多次调用plugin插件(new htmlWebpackPlugin()),同时设置对应数量的.js入口文件 ...
- 一个自动管理项目的Makefile(C语言)
Linux 是所有嵌入式软件工程师绕不过去的坎, makefile 是在Linux系统中绕不过去的坎. 花了几天时间初步学习和了解了makefile 的作用以及功能,并且制作了一个通用型的makefi ...
- Eclipse+Axis自动生成Web Service WSDL文件
JDK版本:1.5.0_22 Eclipse版本:Helios Service Release 2(3.6.2) 首先创建一个web工程,创建过程如下: 如果选择Apache Tomcat v5.5, ...
- 28nm工艺下,自动生成管脚排列文件,给设计加PAD,并在PAD上面打Label的流程(含Tcl脚本)
本文转自:自己的微信公众号<数字集成电路设计及EDA教程> 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教程. 考虑到微信公众 ...
- .gitignore详解(附上eclipse的java项目的 .gitignore文件)
今天讲讲Git中非常重要的一个文件――.gitignore. 首先要强调一点,这个文件的完整文件名就是“.gitignore”,注意最前面有个“.”.这样没有扩展名的文件在Windows下不太好创建, ...
- 如何生成项目的chm文档
如何生成项目的chm文档 2014-11-30 Generate .chm based documentation of your project using SandCastle tool
- 自动生成Mybatis的Mapper文件
自动生成Mybatis的Mapper文件 工作中使用mybatis时我们需要根据数据表字段创建pojo类.mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作很琐碎和重复,myba ...
- Hibernate Tools 自动生成hibernate的hbm文件
本文有待商榷 当我们在新增插件的时候发现会出现duplicate location,意思是所选的anchive所包含的zip路径已经复用,现象如下: 如上图所示黄色标记部分“Duplicate loc ...
- 如何快速编写大项目的Makefile文件
在构建C++的后台服务时,经常需要自己来编写makefile文件,而如果没有合适的方法或模板时,编写makefile文件是一件很费时费力的事情.因此,为了帮助程序员高效准确的编写makefile文件, ...
随机推荐
- U盘 格式化 ext3 ext4
[root@ok Desktop]# mkfs.ext3 /dev/sdc mke2fs 1.41.12 (17-May-2010) /dev/sdc is entire device, not ju ...
- 线程相关函数(4)-pthread_mutex_lock(), pthread_mutex_unlock() 互斥锁
互斥锁实例: #include <pthread.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;int pthread_mutex ...
- weblogic管理服务器密码相关
安全控制weblogic,我们可以为weblogic Administrator服务器设置密码 1.administrator服务器或受管服务器启动时,需要认证,方法有三种: (1)command启动 ...
- cocos2dx场景切换的坑
有一个类可以使用不同的数据源,每个数据源对应一个对象. 我在类里保存了对象的实例,由于要在其它地方使用所以做成了静态,并在每次初始化时 重新设置,析构时删除. 现在我打开了A,切换到B,结果这个静态的 ...
- [初学WPF]控件大小自适应
想在Win上自己写点小工具用,GUI自然是免不了的,于是决定学一学WPF,直接拖控件是很方便啊.控件拖出来以后发现运行时改变窗口大小控件不会重绘,搜索了一下发现了解决办法:使用Viewbox控件. V ...
- vsftpd 服务移植出现 500 oops : socket 解决
一开始, 在vsftpd 打印的错误是 500 oops : socket 在 vsftpd 源码里面找到 buildroot-2016.05/output/build/vsftpd-3.0.3/sy ...
- nodejs入门开发与常用模块
npm:NodeJs包管理器 express:服务器端比较流行的MVC框架,处理服务请求,路由转发,逻辑处理 http://socket.io:实现服务端和客户端socket通信解决方案 ); // ...
- C++ 类的继承一(访问控制)
//类的继承 #include<iostream> using namespace std; /* 面向对象中的继承类之间的父子关系 1.子类拥有父类所有的成员属性和成员函数(包括私有成员 ...
- MapReduce总体架构分析
转自:http://blog.csdn.net/Androidlushangderen/article/details/41051027 继前段时间分析Redis源码一段时间之后,我即将开始接下来的一 ...
- imx6 uboot splash image
跟踪uboot代码,了解imx6 splash image的生成过程. 涉及文件: ./cpu/arm_cortexa8/start.S ./board/freescale/mx6q_sabresd/ ...