Makefile和Shell学习笔记

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链接"即可完成多个版本文件的一键更新(下载和覆盖)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值