Makefile
makefile定义了一系列的规则来指定文件的编译过程和一些复杂的功能操作。makefile带来的好处就是——“自动化编译”,通过make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
makefile默认从第一个target开始执行command命令,如果后面的target不是第一个target的子程序或者子程序的后续程序,就不会在make命令下执行,需要使用make target命令执行相应的command的内容。
ECHO = echo #将编译器选项定义为变量,提高makefile文件的可移植性
GCC = gcc
edit: tar test #make命令默认执行第一个target及其依赖项
@$(ECHO) compiling is finished!
tar:
@$(ECHO) compiling......
test: test.o
$(GCC) -o test test.o
test.o: test.c
$(GCC) -c test.c
clean: #make clean执行非第一个target子程序的clean target
@$(ECHO) cleaning......
rm test test.o
Makefile的分层执行
执行子目录下makefile文件,在当前目录下mkdir subdir,在subdir目录下创建相应的makefile文件和C程序文件edit.c,修改主目录下makefile文件,包括编译内容、clean内容。利用make -C 命令指定makefile的路径。
主目录下的makefile文件
ECHO = echo
GCC = gcc
SUBDIR = subdir
edit: 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) #执行子目录下makefile
clean:
make -C $(SUBDIR) cleansubdir #执行子目录下makefile中cleansubdir命令
@$(ECHO) cleaning......
rm test test.o
子目录下的makefile文件
ECHO = echo
GCC = gcc
first: tar edit
edit: 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.c
cleansubdir:
@$(ECHO) The subdirectory is cleaning......
rm edit edit.o
执行makefile文件的make命令编译主目录和子目录下的.c文件,得到可执行程序;执行makefile文件的make clean命令,清除可能存在的.o文件和可执行文件。执行过程:
如果有多个子目录,且子目录都有各自的makefile文件,可以使用语句:
for dir in $(SUBDIRS) ; do make -C $$dir || exit 1; done
利用for循环遍历所有子目录,同样clean也可以使用此方法进行遍历所有子目录makefile后执行:
for dir in $(SUBDIRS) ; do make -C $$dir clean; done
针对的的是各个子目录下makefile文件和最后target为clean的情形。
Shell脚本
将多个shell命令按语法组合在一起,并保存在文本文件中即shell脚本。shell脚本可以方便地与系统交互,完成系统管理以及批处理任务。shell处于操作系统与应用之间,起到桥梁的作用。
写一个判断当前目录下所有子项类别的shell脚本:
#!/bin/sh
for file in `ls` #利用for循环遍历目录下所有子项
if [ -f $file ] #利用[]测试子项是否为常规类型
then
echo "$file is a regular file"
elif [ -d $file ] #判断子项是否为目录
then
echo "$file is a directory"
else
echo "type of $file is unknown"
fi
done
exit 0
执行结果:
在某些情境下,shell脚本可以方便开发工作,例如,在串口模式下更新嵌入式设备eMMC分区中的版本软件,可以利用wget、scp拷贝或者下载远端服务器上的版本文件,写一个简单脚本来实现:
#########################################################################
# 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/sh
BOOT=BOOT.bin
F1=FILE_1.bin
F2=FILE_2.bin
F3=FILE_3.bin
IMA=image.ub
UP=upgrade.ini
echo "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脚本写入到版本文件分区,执行"./get.sh http链接"即可完成多个版本文件的一键更新(下载和覆盖)。