Makefile和Shell学习笔记
Makefile
makefile定義了一系列的規(guī)則來指定文件的編譯過程和一些復(fù)雜的功能操作。makefile帶來的好處就是——“自動化編譯”,通過make命令,整個工程完全自動編譯,極大的提高了軟件開發(fā)的效率。
makefile默認從第一個target開始執(zhí)行command命令,如果后面的target不是第一個target的子程序或者子程序的后續(xù)程序,就不會在make命令下執(zhí)行,需要使用make target命令執(zhí)行相應(yīng)的command的內(nèi)容。
ECHO = echo #將編譯器選項定義為變量,提高makefile文件的可移植性
GCC = gccedit: tar test #make命令默認執(zhí)行第一個target及其依賴項@$(ECHO) compiling is finished!
tar:@$(ECHO) compiling......
test: test.o$(GCC) -o test test.o
test.o: test.c$(GCC) -c test.cclean: #make clean執(zhí)行非第一個target子程序的clean target@$(ECHO) cleaning......rm test test.o
Makefile的分層執(zhí)行
執(zhí)行子目錄下makefile文件,在當前目錄下mkdir subdir,在subdir目錄下創(chuàng)建相應(yīng)的makefile文件和C程序文件edit.c,修改主目錄下makefile文件,包括編譯內(nèi)容、clean內(nèi)容。利用make -C 命令指定makefile的路徑。
主目錄下的makefile文件
ECHO = echo
GCC = gcc
SUBDIR = subdiredit: tar test then @$(ECHO) compiling is finished!
tar:@$(ECHO) The main program is compiling......
test: test.o$(GCC) -o test.o test
test.o: test.c$(GCC) -c test.c
then:
make -C $(SUBDIR) #執(zhí)行子目錄下makefile
clean: make -C $(SUBDIR) cleansubdir #執(zhí)行子目錄下makefile中cleansubdir命令
@$(ECHO) cleaning......rm test test.o
子目錄下的makefile文件
ECHO = echo
GCC = gccfirst: tar editedit: tar test @$(ECHO) compiling is finished!
tar:@$(ECHO) The subdirectory is compiling......
eidt: eidt.o$(GCC) -o edit.o edit
edit.o: edit.c
$(GCC) -c edit.ccleansubdir: @$(ECHO) The subdirectory is cleaning......rm edit edit.o
執(zhí)行makefile文件的make命令編譯主目錄和子目錄下的.c文件,得到可執(zhí)行程序;執(zhí)行makefile文件的make clean命令,清除可能存在的.o文件和可執(zhí)行文件。執(zhí)行過程:
如果有多個子目錄,且子目錄都有各自的makefile文件,可以使用語句:
?for dir in $(SUBDIRS) ; do make -C $$dir || exit 1; done
利用for循環(huán)遍歷所有子目錄,同樣clean也可以使用此方法進行遍歷所有子目錄makefile后執(zhí)行:
? ?for dir in $(SUBDIRS) ; do make -C $$dir clean; done
針對的的是各個子目錄下makefile文件和最后target為clean的情形。
Shell腳本
將多個shell命令按語法組合在一起,并保存在文本文件中即shell腳本。shell腳本可以方便地與系統(tǒng)交互,完成系統(tǒng)管理以及批處理任務(wù)。shell處于操作系統(tǒng)與應(yīng)用之間,起到橋梁的作用。
寫一個判斷當前目錄下所有子項類別的shell腳本:
#!/bin/sh
for file in `ls` #利用for循環(huán)遍歷目錄下所有子項if [ -f $file ] #利用[]測試子項是否為常規(guī)類型thenecho "$file is a regular file"elif [ -d $file ] #判斷子項是否為目錄thenecho "$file is a directory"elseecho "type of $file is unknown"fi
done
exit 0
執(zhí)行結(jié)果:
?
在某些情境下,shell腳本可以方便開發(fā)工作,例如,在串口模式下更新嵌入式設(shè)備eMMC分區(qū)中的版本軟件,可以利用wget、scp拷貝或者下載遠端服務(wù)器上的版本文件,寫一個簡單腳本來實現(xiàn):
#########################################################################
# File Name: get.sh
# Author: fupenzi
# Function: Getting version-software
# Created Time: 2019年09月21日 Saturday
# Usage:Excuting chmod u+x before the script
#########################################################################
#!/bin/shBOOT=BOOT.bin
F1=FILE_1.bin
F2=FILE_2.bin
F3=FILE_3.bin
IMA=image.ub
UP=upgrade.iniecho "Download $BOOT ..."
wget $1$BOOT -O $BOOT
echo "Download $F1 ..."
wget $1$F1 -O $F1
echo "Download $F2 ..."
wget $1$F2 -O $F2
echo "Download $F3 ..."
wget $1$F3 -O $F3
echo "Download $IMA ...."
wget $1$IMA -O $IMA
echo "Download $UP ..."
wget $1$UP -O $UP
將get.sh腳本寫入到版本文件分區(qū),執(zhí)行"./get.sh http鏈接"即可完成多個版本文件的一鍵更新(下載和覆蓋)。
?
總結(jié)
以上是生活随笔為你收集整理的Makefile和Shell学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 年费好还是1000星钻好?
- 下一篇: 洋葱头历险记的作者是谁啊?