讀書之--GNU make 項目管理

在看過一點<跟我一塊兒makefile>以後,我買了一本<GNU make 項目管理> shell

寫下今天的成果: 編程

我以前的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怎麼輸出? 測試

有待學習 ui

剛纔又仔細看了看書上的說明,發現其實我不用寫什麼 源文件集合,與不用寫什麼${C_COMPLIE},在make的內置規則中有: spa

%.o:%.c code

    ${COMPILE.c} ${OUTPUT_OPTION} $< ip

%:$.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}
相關文章
相關標籤/搜索