自动生成项目的Makefile文件

理论基础

跟我一起写 Makefile:   http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=408225

例解 autoconf 和 automake 生成 Makefile 文件:   http://www.ibm.com/developerworks/cn/linux/l-makefile/index.html

步骤

  1. 写好Makefile.am
  2. 运行 autoscan , 自动创建两个文件: autoscan.log configure.scan
  3. 将configure.scan 命名为configure.ac,修改某些内容,具体怎么修改后面再讲
  4. 运行aclocal,生成一个“aclocal.m4”文件和一个缓冲文件夹autom4te.cache,该文件主要处理本地的宏定义
  5. 运行 autoconf,目的是生成 configure
  6. 运行 autoheader,它负责生成config.h.in文件。该工具通常会从“acconfig.h”文件中复制用户附加的符号定义
  7. 运行automake,生成Makefile.in
  8. 运行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文件的更多相关文章

  1. webpack自动生成项目的html

    1 自动生成多个html页面 设置webpack.config.js中的plugins属性,多次调用plugin插件(new htmlWebpackPlugin()),同时设置对应数量的.js入口文件 ...

  2. 一个自动管理项目的Makefile(C语言)

    Linux 是所有嵌入式软件工程师绕不过去的坎, makefile 是在Linux系统中绕不过去的坎. 花了几天时间初步学习和了解了makefile 的作用以及功能,并且制作了一个通用型的makefi ...

  3. Eclipse+Axis自动生成Web Service WSDL文件

    JDK版本:1.5.0_22 Eclipse版本:Helios Service Release 2(3.6.2) 首先创建一个web工程,创建过程如下: 如果选择Apache Tomcat v5.5, ...

  4. 28nm工艺下,自动生成管脚排列文件,给设计加PAD,并在PAD上面打Label的流程(含Tcl脚本)

    本文转自:自己的微信公众号<数字集成电路设计及EDA教程> 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教程. 考虑到微信公众 ...

  5. .gitignore详解(附上eclipse的java项目的 .gitignore文件)

    今天讲讲Git中非常重要的一个文件――.gitignore. 首先要强调一点,这个文件的完整文件名就是“.gitignore”,注意最前面有个“.”.这样没有扩展名的文件在Windows下不太好创建, ...

  6. 如何生成项目的chm文档

    如何生成项目的chm文档 2014-11-30 Generate .chm based documentation of your project using SandCastle  tool

  7. 自动生成Mybatis的Mapper文件

    自动生成Mybatis的Mapper文件 工作中使用mybatis时我们需要根据数据表字段创建pojo类.mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作很琐碎和重复,myba ...

  8. Hibernate Tools 自动生成hibernate的hbm文件

    本文有待商榷 当我们在新增插件的时候发现会出现duplicate location,意思是所选的anchive所包含的zip路径已经复用,现象如下: 如上图所示黄色标记部分“Duplicate loc ...

  9. 如何快速编写大项目的Makefile文件

    在构建C++的后台服务时,经常需要自己来编写makefile文件,而如果没有合适的方法或模板时,编写makefile文件是一件很费时费力的事情.因此,为了帮助程序员高效准确的编写makefile文件, ...

随机推荐

  1. JMeter学习笔记(三)

    D. User Defined Variables:用户自定义的变量,在此我们可以定义后面原件需要引用的变量并对其进行赋值.jsessionid一般是服务器返回的,每个用户返回的都不一样,所以在此不应 ...

  2. web.py+fastcgi+nginx 502错误解决

    用web.py照着官网在服务器上搭好了后台.这次很奇怪地出现了一个Nginx 502 Bad Gateway的错误. 执行上面的kill `pgrep -f "python /path/to ...

  3. CentOS 6.2修改主机名

    写在前面的话:因为服务器要统一主机名,但是在安装的时候忘记设置了,所以需要修改主机名   需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会 ...

  4. widnows 使用WIN32 APi 实现修改另一打开程序的窗口显示方式

    1.GUI点击打开一个程序那边做一个判断. hwnd = 获取目标程序窗口句柄: if(hwnd == NULL /*不存在目标程序窗口句柄*/){     创建进程,打开目标程序: } else{ ...

  5. linux超级终端minicom的使用方法

    ===== 一.Minicom介绍 =====       Linux下的Minicom的功能与Windows下的超级终端功能相似,可以通过串口控制外部的硬件   设备.适于在linux通过超级终端对 ...

  6. git学习(一):git的版本库在哪儿

    查看版本 git --version # 查看git的版本 设置或者查看用户名和邮箱 git config --global user.name "tuhooo" // 如果后面没 ...

  7. Android——RelativeLayout(相对布局)

    一.相对于父容器 1.居中 2.同方向 <?xml version="1.0" encoding="utf-8"?> <RelativeLay ...

  8. supervisor配置详解

    原文:http://lixcto.blog.51cto.com/4834175/1539136 有阵子没写博客了,这段时间一直在研究python django框架和前端相关的东西.楼主学通信的,对we ...

  9. CentOS 7使用systemctl如何补全服务名称

    CentOS 7使用systemctl如何补全服务名称 因为CentOS7的默认安装类型是最小安装,所以默认没有自动补全的功能.要启用这个功能,你需要安装一个bash-completion包,然后退出 ...

  10. 【BZOJ】1053: [HAOI2007]反素数ant(贪心+dfs)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1053 约数个数等于分解出的质因数的(指数+1)的乘积这个就不用说了吧... 然后好神的题在于贪心.. ...