读书之--GNU make 项目管理

在看过一点<跟我一起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}






你可能感兴趣的:(读书之--GNU make 项目管理)