在看过一点<跟我一起makefile>之后,我买了一本<GNU make 项目管理>
写下今天的成果:
# 程序的名字 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$
# 程序的名字 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}