Chinaunix首页 | 论坛 | 博客
  • 博客访问: 381982
  • 博文数量: 124
  • 博客积分: 2911
  • 博客等级: 少校
  • 技术积分: 1050
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-15 15:57
文章分类

全部博文(124)

文章存档

2012年(6)

2011年(26)

2010年(92)

我的朋友

分类:

2010-12-08 11:02:24

【转载请注明:codeplayer.cublog.cn】

一、Makefile 语法

二、Make 工具
三、Automake


一、【Makefile】语法
1. 基本语法
Targets : Dependency
Commands
注意:Makefile中只有Command行以键开始。

2. 变量
2.1 规则
1) 命名包括字符、数字、下划线,不应该含有“:“、“#“、“=“、空字符。
2) 大小写敏感。
3) 声明时需要给予初值。使用“$”引用其值。
2.2 预定义变量:
$@ 表示规则中的目标文件集合
$+ 所有的依赖文件。以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
$^ 所有的依赖文件。以空格分开,不包含重复的依赖文件。
$? 所有【比目标新】的依赖目标的集合。
$< 第一各依赖文件的名称。
$* 不包含扩展名的目标文件名称。
2.3 环境变量
Make支持设置环境变量。常见的环境变量有:
CFLAGS 编译器参数。
LDFLAGS 链接器参数。
3. 条件判断
3.1 表达
< ifdef | ifndef | ifeq | ifneq >
.....
else
.....
endif
注:条件表达前没有,否则被视为Commands执行。
3.2 ifeq/ifneq:比较参数值。
ifeq ($arg1, $arg2)
ifeq '$arg1' '$arg2'
ifeq "$arg1"" $arg2"
ifeq '$arg1' "$arg2"
4. 内置函数
4.1 使用规则
$(函数名 参数……)
4.2 内置函数
1) 字符串替换
$(substr "src","dst","text")
功能:将text中的src替换成dst。
2) 去空格
$(strip "string")
功能:去除string中的前后空格。
3) 字符串查找
$(findstring "dst","src")
功能:在src中查找dst子串。
返回值:查找成功返回dst指定的串,否则返回空串。
4) 排序
$(sort "list")
功能:对list制定的字符串集合进行排序。
注:sort会过滤重复的串。
5) 取目录
$(dir "path")
功能:从path中取出目录并返回。
6) 取前缀
$(basename "filename")
功能:从filename中取出"."前面的内容并返回。
7) 查找变量来源
$(orgin "VarName")
功能:返回变量来源。
5. 伪目标
all 所有目标的目标,功能为编译所有目标。
clean 删除所有被make创建的文件。
install 安装已经编译好的程序,即把目标执行文件复制到指定的目标中去。
print 输出改变过的源文件。
tar 将源程序打包。
dist 将tar文件压缩(Z/gz)
TAGS 更新所有目标,以备完整地重编译使用。
check 测试makefile的流程。
test 同上。

二、【Make】工具
1. 参数
-B、--always-make
强制重新编译所有目标。
-C "FileDir"、--directory="FileDir"
指定读取makefile的目录。
-debug[="options"]
输出make的调试信息。
options取值:
a all,输出所有的调试信息。
b basic,输出不需要重新编译的目标。
v verbose,比b更进一步的信息输出。
i implicit,输出隐含规则。
j jobs,输出执行规则中命令的详细信息,如命令进程标识、返回码等。
m makefile,输出对makefile一系列操作的信息。
2. 返回值
0 成功
1 错误
2 -q选项。

举例——一个通用的Makefile】
参考:http://blog.csdn.net/alenwelkin/archive/2007/06/22/1661787.aspx

HOST   = #(specify host type here, such as arm-linux or arm-uclibc-linux)
CC     = gcc
RANLIB = ranlib

ifneq ($(HOST),)
HOSTE  = $(addsuffix -,$(HOST))
CC     = $(addprefix $(HOSTE),gcc)
RANLIB = $(addprefix $(HOSTE),ranlib)
endif

#specify prefix here
PREFIX =

#specify your custmized compile flags here
CFLAGS  = -Wall 
LDFLAGS =  

makefile

include config.mk

CFLAGS += -I$(PREFIX)/usr/local/include/
LDFLAGS += -L$(PREFIX)/usr/local/lib

ifeq ($(TYPE),debug)
CFLAGS += -g3
else
ifeq ($(TYPE), release)
CFLAGS += -O2
else
CFLAGS += -g -O
endif
endif

SRC = $(notdir $(wildcard *.c))
OBJ = $(patsubst %.c,%.o,$(SRC))
EXE = $(notdir $(PWD))
LIB = lib$(EXE).a
DEPEND = $(notdir $(wildcard .depend))

all:.depend $(EXE)

.depend: $(SRC)
    $(CC) $(CFLAGS) -w -MM $^ > $@

$(EXE): $(OBJ)
    $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

$(LIB):$(LIB)($(OBJ))
    $(RANLIB) $@
lib: $(LIB)
clean:
    $(RM) $(EXE) $(OBJ) .depend $(LIB)

ifneq ($(DEPEND),)
include .depend
endif

三、【Automake】
0.结构

1. 项目实例
    $ ls $prog_DIR
        ./
            + Makefile.am

        lib/
            random_gen.c
            + Makefile.am

        include/
            simulate.h
            + Makefile.am

        src/
            simulate.c
            main.c
            + Makefile.am

2. Makefile.am
    2.1 $ cat ./Makefile.am
            SUBDIRS = include src        //指明子目录

        注:automake会按SUBDIRS变量中的目录顺序进入工作。

    2.2 $ cat ./lib/Makefile.am
            lib_LIBRARIES = librandom.a                // 2部分:lib指明install时放入lib目录;LIBRARIES=xxx.a 指明生成静态库
            librandom_a_SOURCES = random_gen.c    // 2部分:xxx_a指明这个变量用于生成xxx.a;SOURCES用空格分隔列出源文件
            注:
                类似还有:
                    librandom_a_CPPFLAGS =
                    librandom_a_LDFLAGS =
                等等
    2.3 $ cat ./include/Makefile.am
            EXTRA_DIST = simulate.h    //???

    2.4 $ cat ./src/Makefile.am
            bin_PROGRAMS = simulate                        // bin:指明automake将结果install在bin目录下。
            simulate_SOURCES = simulate.c main.c
            simulate_LDADD = $(top_builddir)/lib/librandom.a    //链接中包含的库。$(top_builddir) 将由configure脚本在运行时设置。
                                                        //如此Makefile就可以用相对路径方式引用源目录。
            simulate_CPPFLAGS = -I $(top_builddir)/include

2. autoscan
    2.1
        $ autoscan    //生成configure.scan
    2.2
        $ mv configure.scan configure.in
        $ gedit configure.in
            AC_PREREQ([2.65])
            AC_INIT([simulate], [1.0], [a@b])        //初始化autoconf
            AC_CONFIG_SRCDIR([src/main.c])
            AC_CONFIG_HEADERS([config.h])        //告诉autoconf所用的配置文件,一般为config.h

            AM_INIT_AUTOMAKE(simulate, 0.1.0)    //初始化automake,参数为软件名称及版本号。
                                            // 以AC开头的宏,表示是由autoconf提供;以AM开头,由automake提供。。

            # Checks for programs.
            AC_PROG_CC

            # Checks for libraries.
            AC_PROG_RANLIB                // 确保能够找到构建静态库所需要的工具。

            # Checks for header files.
            AC_CHECK_HEADERS([stdlib.h])

            # Checks for typedefs, structures, and compiler characteristics.

            # Checks for library functions.

            AC_CONFIG_FILES([Makefile
                             lib/Makefile
                             include/Makefile
                             src/Makefile])
            AC_OUTPUT

3. 生成 Makefile
    $ aclocal                    //生成 aclocal.m4,autom4te.cache
    $ autoconf                //生成 configure
    $ autoheader                //生成 config.h.in
    $ automake --add-missing    //生成 Makefile.in
    $ ./configure                //生成 Makefile
    $ make                    //在src下生成编译好的可执行文件。

注:在 automake --add-missing 时会出现AUTHOR之类的文件无法找到的信息。解决:手动添加这些信息文件,当然内容取决于你要遵守的License.

阅读(1356) | 评论(0) | 转发(0) |
0

上一篇:SVN_Server

下一篇:Windows_API

给主人留下些什么吧!~~