【转载请注明: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选项。
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.
阅读(1372) | 评论(0) | 转发(0) |