自动生成Makefile 流程

一:自动生成Makefile 流程
(1) 首先在源代码目录autoscan 扫描源文件
(2)将configure.scan 改名为configure.ac(configure.in),修改该文件
(3)编写自定义宏(*.m4),可以省略
(4)执行aclocal 生成aclocal.m4
(5)执行autoconfig 生成configure
(6)编写Makefile.am 文件
(7)执行automake –add-missing 生成 Makefile.in
(8)执行./configure 生成Makefile
(9)make
具体流程图
二:configure.ac 相关宏定义 和编写规则
(1)

# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59)                                       # 这里是工具版本号,不关心
AC_INIT(ir_tree, 1.0, ********@gmail.com)     # AC_INIT:指示可执行名称 + 版本号 + BUG-report            
AC_CONFIG_SRCDIR([src/test.c])               # AC_CONFIG_SRCDIR:为了检验源文件是否缺失,你可以检测所有的                                                                       # 文件,这里为了示意,检查一个

AM_CONFIG_HEADER(config.h)                 # 这里为了检查头文件config.h,如果你不需要,就不需要检查
AM_INIT_AUTOMAKE(ir_tree,1.0)                # 这一句可以不需要,也是指示可执行名称 + 版本号 


# Checks for programs.                                # 下面检验一些系统程序是否存在
AC_PROG_CC                                             # 检验CC(就是c语言编译程序)是否存在
# 如果你是要的C++,那么AC_PROG_CXX,所有你需要什么,到uanfang手册去查找就OK了!

# Checks for libraries.                                  # 检查一些库(包括系统库和你引入的库)
AC_CHECK_LIB([m], [sqrt])                         # 这里检查数学库-lm
# 其实AC_CHECK_LIB的完整格式是:AC_CHECK_LIB([lib], [func],[if_exist_action], [not_exist_action])
# 后面的func是你使用到的函数名  

AC_PROG_RANLIB                                    # 这里的意义是:当你使用了静态库的时候,需要这一句
                                                                    # 如果你使用了共享库,那么使用AC_PROG_LIBTOOL

# Checks for header files.                           # 下面检查一些头文件,只检查你认为需要检查的即可!然后查手册!
#AC_HEADER_STDC                                
#AC_CHECK_HEADERS([float.h malloc.h stdlib.h])

# Checks for typedefs, structures, and compiler characteristics.    # 下面检查一些类型定义是否允许
#AC_C_CONST

# Checks for library functions.                  # 下面检查一些库函数是否合理
#AC_FUNC_MALLOC                              # 检查malloc函数
AC_CHECK_FUNCS([pow sqrt])             # 检查pow和sqrt函数
                                                                 # 哪些你需要的你自己肯定知道,然后查手册,放进了检查就OK了~

# 下面是很重要的!
# 就是最终输出哪些文件,由上面的结构知道,有几个Makefile.am就几个Makefile,那么输出文件自然如下!
#
AC_OUTPUT([
  Makefile 
  src/Makefile 
  lib/Makefile
])

(2)给configure 配置参数
AC_ARG_WITH 应用
BUILD_UNITTEST=no
AC_ARG_WITH([unittest],
[AS_HELP_STRING([–with-unittest],[build unittest(default is no)])],
[BUILD_UNITTEST=yes],
[BUILD_UNITTEST=no])
if test “x$BUILD_UNITTEST” = “xyes”;then #判断是否加上了该参数
AC_DEFINE(UNITTESTS,1,单元测试) #向头文件中定义某个宏
fi
该处比较加“Xyes”妙用 如果 BUILD_UNITTEST忘了定义那么也不出现语法错误等现象比较某个处理结果的返回值时最好这么做

(3)用 AS_IF代替语句 if test 语句
AS_IF(“x$BUILD_UNITTEST” = “xyes”,AC_DEFINE(UNITTESTS,1,单元测试) , ,)

AS_IF宏与C语言中的if语句功能相似,格式为:
AS_IF (test1, [run-if-true1], … , [run-if-false])
例:
AS_IF([test “x foo=xyes],[HANDLEFOO([yes])],[testx foo” != xno], [HANDLE_FOO([maybe])],
[echo foo not specified])

AS_IF的行为是:首先检查第一个条件,如果成立,执行相应操作;如果第一个条件不成立,继续检查下一个条件;如果所有条件都不成立,则执行run-if-false。

(4)
AC_ARG_ENABLE宏的格式为:
AC_ARG_ENABLE(feature, help-string, [action-if-given], [action-if-not-given])

AC_ARG_ENABLE(debug, AS_HELP_STRING([–enable-debug], [enable DEBUG mode(default=no)]),
[],
[enable_debug=no])
AS_IF([test “x enabledebug=xyes],[CXXFLAGS=g2O0DDEBUGWall],[testx enable_debug” = “xno”], [CXXFLAGS=”-O2 -Wall”],
[])
上面配置的意思是:给最后生成的configure脚本添加一个–enable-debug选项,如果指定了此选项,则CXXFLAGS=”-g2 -O0 -DDEBUG -Wall”,否则CXXFLAGS=”-O2 -Wall”。
每一个enable选项都有一个enable_feature变量与之对应,可以通过此变量取得用户指定的值。以上面的场景为例:
(a)如果指定–enable-debug,不带参数,则enable_debug变量值为”yes”。
(b)如果指定–enable-debug=no,则enable_debug变量值为”no”。
(c)如果指定–disable-debug,则与–enable-debug=no效果相同。
三:Makefile.am中的规则

可执行文件
bin_PROGRAMS = foo
foo_SOURCES = xxx.c xxxx.c
foo_LDADD =
foo_LDFLAGS =
foo_DEPENDENCIES =
静态库
lib_LIBRARIES = foo.a
foo_a_SOURCES = xxx.c xxxx.c
foo_a_LDADD =
foo_a_LIBADD =
foo_a_LDFLAGS =
动态库
lib_LTLIBRARIES = foo.la
foo_la_SOURCES = xxx.c xxxx.c
foo_la_LDADD =
foo_la_LIBADD =
foo_la_LDFLAGS =
头文件
include_HEADERS = foo.h
noinst_HEADERS = foo2.h
数据文件
data_DATA = data1 data2
其中,生成动态库的同时还会自动生成一个静态库,所以在一般情况下都不直接使用静态库规则。
Makefile.am中的变量的含义

INCLUDES 编译时所需头文件
LDADD 链接时所需链接的库文件
LDFLAGS 链接时的选项
AM_CXXFLAGS 编译.cpp文件时的选项
AM_CFLAGS 编译.c文件时的选项
EXTRA_DIST 除源代码和一些默认的文件以外,其它需要打如发布包.tar.gz中的文件
SUBDIRS 在处理本目录之前要递归处理的子目录
top_srcdir 工程源码的最顶层目录
top_builddir 工程目标文件的最顶层目录

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值