在看過一點<跟我一塊兒makefile>以後,我買了一本<GNU make 項目管理> shell
寫下今天的成果: 編程
# 程序的名字 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怎麼輸出? 測試
有待學習 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}