在看过一点<跟我一起makefile>之后,我买了一本<GNU make 项目管理>
写下今天的成果:
我之前的Makefile:
# 程序的名字
PROGRAM=test
# 程序源代码集
C_SOURCES=test.c sum.c
# .o文件
# ${C_SOURCES:.c=.o} 是一个变量替换语法
# 把所有的.c替换为.o
C_OBJS=${C_SOURCES:.c=.o}
# CC 指定 gcc 为编译器
# CCFLAGS 指定编译选项
CC=gcc
CCFLAGS=-c -Wall
# 默认目标
all:${PROGRAM}
# 创建主程序
${PROGRAM}:${C_OBJS}
${CC} -o $@ ${C_OBJS}
# 生成各.o文件
test.o:test.c sum.h
sum.o:sum.c sum.h
.PHNOY:clean run rebuild
# 清除文件
clean:
-rm ${C_OBJS} ${PROGRAM}
# 运行程序
run:
@echo "运行程序\n"
./${PROGRAM}
# 重新构建
rebuild:
@echo "重新构建\n"
make clean && make
我之前的源代码布局:
laolang@laolang-Lenovo-G470:~/code/c/makefile/staticLibraryTest$ tree
.
├── a.out
├── Makefile
├── mk
│ ├── makefile
│ └── Makefile
├── sum.c
├── sum.h
├── sum.o
├── test
├── test.c
├── test.o
└── testone
├── Makefile
├── sum.h
├── sum.o
├── test
├── test.c
└── test.o
2 directories, 16 files
laolang@laolang-Lenovo-G470:~/code/c/makefile/staticLibraryTest$
看到<GNU make项目管理>中的第二章关于代码的布局问题,于是我也把我源代码布局修改了一下:
我现在的代码布局
laolang@laolang-Lenovo-G470:~/code/makefile/gnumake/vpath$ tree
.
├── include
│ └── sum.h
├── Makefile
├── src
│ ├── sum.c
│ └── test.c
├── sum.o
├── test
├── test.o
└── tmp
└── Makefile
3 directories, 8 files
laolang@laolang-Lenovo-G470:~/code/makefile/gnumake/vpath$
我的Makefile文件也变成了:
# 程序的名字
PROGRAM=test
# 程序源代码集
C_SOURCES=test.c sum.c
# .o文件
# ${C_SOURCES:.c=.o} 是一个变量替换语法
# 把所有的.c替换为.o
C_OBJS=${C_SOURCES:.c=.o}
# CC 指定 gcc 为编译器
# CCFLAGS 指定编译选项
# C_COMPLIE 指定编译命令
# vpath 可以指定在什么目录中寻找什么文件,即指定搜索文件的模式
CC=gcc
CCFLAGS=-c -Wall -I include
C_COMPLIE=${CC} ${CCFLAGS} $<
# VPATH=src include
vpath %.c src
vpath %.h include
# 默认目标
all:${PROGRAM}
# 创建主程序
${PROGRAM}:${C_OBJS}
@echo "--------生成主程序"
${CC} -o $@ $^
# 生成各.o文件
test.o:test.c sum.h
@echo "--------主程序模块"
${CC} ${CCFLAGS} $<
sum.o:sum.c sum.h
@echo "--------计算模块"
${C_COMPLIE}
.PHNOY:clean run rebuild
# 清除文件
clean:
@echo "--------清除文件"
-rm ${C_OBJS} ${PROGRAM}
# 运行程序
run:
@echo "--------运行程序\n"
./${PROGRAM}
# 重新构建
rebuild:
@echo "--------重新构建\n"
make clean && make
运行效果是:
laolang@laolang-Lenovo-G470:~/code/makefile/gnumake/vpath$ make -f ./tmp/Makefile
--------主程序模块
gcc -c -Wall -I include src/test.c
--------计算模块
gcc -c -Wall -I include src/sum.c
--------生成主程序
gcc -o test test.o sum.o
laolang@laolang-Lenovo-G470:~/code/makefile/gnumake/vpath$
使用默认的模式规则
如果再把其中的显示编译命令删除,使用默认的模式规则,则是:
laolang@laolang-Lenovo-G470:~/code/makefile/gnumake/vpath$ grep -v ^# Makefile | grep -v ^$ #去除Makefile文件中以#开关的行以及空行
PROGRAM=test
C_SOURCES=test.c sum.c
C_OBJS=${C_SOURCES:.c=.o}
CC=gcc
CCFLAGS=-c -Wall -I include
C_COMPLIE=${CC} ${CCFLAGS} $<
vpath %.c src
vpath %.h include
all:${PROGRAM}
${PROGRAM}:${C_OBJS}
test.o:test.c sum.h
sum.o:sum.c sum.h
.PHNOY:clean run rebuild
clean:
@echo "--------清除文件"
-rm ${C_OBJS} ${PROGRAM}
run:
@echo "--------运行程序\n"
./${PROGRAM}
rebuild:
@echo "--------重新构建\n"
make clean && make
laolang@laolang-Lenovo-G470:~/code/makefile/gnumake/vpath$ make
gcc -c -o test.o src/test.c
gcc -c -o sum.o src/sum.c
gcc test.o sum.o -o test
laolang@laolang-Lenovo-G470:~/code/makefile/gnumake/vpath$ make run
--------运行程序
./test
输入两个整数:
3 4
3 + 4 = 7
laolang@laolang-Lenovo-G470:~/code/makefile/gnumake/vpath$
相对于上一个没有删除显示的编译命令,只是少了两行,但是输出和Makefile的书写已经变的非常方便,只是又回到了之前的问题,echo怎么输出?
有待学习
刚才又仔细看了看书上的说明,发现其实我不用写什么 源文件集合,与不用写什么${C_COMPLIE},在make的内置规则中有:
%.o:%.c
${COMPILE.c} ${OUTPUT_OPTION} $<
%:$.c
${LINK.c} $^ ${LOADLIBS} ${LDLIBS} -o $@
于是我的Makefile是:
laolang@laolang-Lenovo-G470:~/code/makefile/gnumake/two/test$ grep -v ^# Makefile | grep -v ^$
PROGRAM=test
vpath %.h include
vpath %.c src
CC=gcc
CFLAGS=-Wall -I include
all:${PROGRAM}
rebuild:clean all
${PROGRAM}:test.o sum.o
test.o:sum.o sum.h
sum.o:sum.c sum.h
.PHNOY:clean run
clean:
-rm ${PROGRAM} *.o
run:
./${PROGRAM}
laolang@laolang-Lenovo-G470:~/code/makefile/gnumake/two/test$ grep -v ^# Makefile | grep -v ^$ | wc -l
15# 才十五行
laolang@laolang-Lenovo-G470:~/code/makefile/gnumake/two/test$
完整内容:
# makefile 模式测试
#
# 时间:2014年 11月 13日 星期四 18:34:21 CST
# 作者:小代码
# 程序名称
PROGRAM=test
# 指定文件搜索路径
vpath %.h include
vpath %.c src
# 指定编译器名称
CC=gcc
#指定编译选项
CFLAGS=-Wall -I include
# 默认目标,生成主程序
all:${PROGRAM}
# 重新构建
rebuild:clean all
# 生成主程序
${PROGRAM}:test.o sum.o
test.o:sum.o sum.h
sum.o:sum.c sum.h
.PHNOY:clean run
# 清除中间文件及程序文件
clean:
-rm ${PROGRAM} *.o
# 运行程序
run:
./${PROGRAM}
宏:
今天看了make的宏定义.再之后的内容,对shell script编程能力的要求就比较高了.看来我要又要看另外一本书了
现在的makefile[我最后还是没有写命令执行时的提示,办法我想到了一个,就是在test.o:bolan.h 后面添加一个依赖,比如:test-o,这个依赖作为一个目标或伪目标,输出提示,如:编译主程序,但是这样的话,在修改Makefile的时候,比较麻烦,所以我放弃这个了]:
# 逆波兰实现表达式求值
#
#时间:2014年 11月 13日 星期四 18:20:56 CST
#
# 作者:小代码
#
#程序名称
PROGRAM=bolan
# 源文件目录
vpath %.c src
# 头文件目录
vpath %.h include
# 指定编译器
CC=gcc
#指定编译选项
CFLAGS=-Wall -I include
# 指定删除命令
RM=rm -rf
define HELP_OUT
echo "#make\t\t\t\t生成主程序"
echo "#make rebuilid\t\t\t删除中间文件和程序文件,再重新编译"
echo "#make clean\t\t\t清除中间文件程序文件"
echo "#make run\t\t\t运行程序"
echo "#make help\t\t\t打印此帮助信息"
endef
# 默认目标,生成主程序
all:${PROGRAM}
# 重新编译
rebuild:clean all
# 生成主程序
${PROGRAM}:test.o bolan.o stack.o
test.o:bolan.h
bolan.o:bolan.h stack.h
stack.o:stack.h
.PHONY:clean run help
# 清除中间文件和程序文件
clean:
-${RM} ${PROGRAM} *.o
# 运行程序
run:
./${PROGRAM}
# 输出帮助列表
help:
@${HELP_OUT}