目录
一、自动生成Makefile
step1 : autoscan
step2 :aclocal
step3 : autoheader
step4 : 创建Makefile.am并编辑
step5:Makefile.in
step6 : autoconf
step7 : ./configure
二、Makefile脚本封装
2.1 脚本使用
2.2 Shell命令小结
(1) shell参数获取
(2) 修改文件中的指定内容
(3) 向文件写入内容
三、总结
脚本下载链接
由于Makefile的各种显式,隐式规则,导致我们手动写一个Makefile文件变得更加困难了,但我们可以autotools自动生成Makefile。该工具可以通过扫描源文件,自动生成一个Makefile文件。其流程大致如下:
在我们编写好源文件后,我们就可以通过autoscan命令对该目录进行扫描,生成
configure.scan文件。如下图所示:
这里configure.scan其实是一个模板文件,我们需要手动修改一下其内容,并将其改名为
configure.ac。修改后的内容如下图所示。
直接执行aclocal命令即可生成aclocal.m4文件,如下图所示。
aclocal.m4是一个宏定义文件,该文件内容的生成依赖于configure.ac文件。aclocal会根据
confgure.ac文件的内容,搜索本地m4文件,然后生成一个在本目录下面使用的aclocal.m4文件。
可直接利用autoheader生成config.h.in文件,该文件也是一个模板文件,后面会利用该文件生
成config.h文件。
利用automake --add-missing生成,如下图所示。
利用autoconf生成configure文件
我们完成了生成Makefile的所有准备工作,然后我们在该目录下面运行configure脚本,即可生
成Makefile文件。
至此,Makefile自动创建完毕。
最后我们可以验证一下,如下图所示。
本部分将上述的七个步骤封装在了一个.sh中,只需要执行一个.sh文件便可自动完成真正意义上的自动生成Makefile文件了。
假设脚本名称为test.sh,需要编译的文件名称为test.c,则只需要在当前目录下执行"./test.sh
test.c"即可,脚本的具体代码如下图所示:
#! /bin/bash
var_c=$1
var=${var_c%%.c}
version=1.0
varMail="[email protected]"
# Step1
rm -rf configure.ac
autoscan
sed -i "s/\[FULL-PACKAGE-NAME\]/${var}/g" configure.scan
sed -i "s/\[VERSION\]/${version}/g" configure.scan
sed -i "s/\[BUG-REPORT-ADDRESS\]/${varMail}/g" configure.scan
varLine1=$(sed -n -e "/AC_CONFIG_SRCDIR/=" configure.scan)
varLine2=$(sed -n -e "/AC_CONFIG_HEADERS/=" configure.scan)
sed -i "${varLine1}cAC_CONFIG_SRCDIR($var_c)" configure.scan
sed -i "${varLine2}aAM_INIT_AUTOMAKE(${var}, ${version})" configure.scan
sed -i "s/^AC_CONFIG_FILES/#&/g" configure.scan
sed -i "s/AC_OUTPUT/AC_OUTPUT(Makefile)/g" configure.scan
mv configure.scan configure.ac
# Step2
aclocal
# Step3
autoheader
# Step4
rm -rf Makefile.am
touch Makefile.am
src=$(ls *.c)
echo "AUTOMAKE_OPTIONS=foreign" >> Makefile.am
echo "bin_PROGRAMS=${var}" >> Makefile.am
echo -n "${var}_SOURCES=" >> Makefile.am
echo ${src} >> Makefile.am
# Step5
automake --add-missing
# Step6
autoconf
# Step7
./configure
由于本人也是第一次正式学习shell编程,所以接下来对shell的常用指令进行简单总结。具体的教程读者可参考Shell 教程 | 菜鸟教程进行系统学习。
shell使用"$"读取参数,新建一个test.sh文件,如下所示
#!/bin/bash
echo "shell 名称 = $0"
echo "参数1 = $1"
echo "参数2 = $2"
执行脚本:”sh test.sh 1 2“,则输出结果为:
shell 名称 = test.sh
参数1 = 1
参数2 = 2
【注】$0为脚本本身,$n为第n个参数 。
若想将test.txt文件中的oldString修改为newString,则执行命令:
sed -i "s/oldString/newString/g" test.txt.
实例:对于一个test.txt文件,执行:sed -i "s/Airoha/ZixiangXu/g" test.txt。
执行前test.txt内容:
执行后test.txt内容:
若想向test.txt写入内容,使用echo命令即可。
实例:向test.txt写入”Hello World!“,则执行:echo "Hello World!" >> test.txt.
执行前test.txt内容为:
执行后test.txt内容为:
在整个过程中我们只需要手动修改或者创建2个文件,而且修改的内容很少。最后我们就可以
得到一个完整的Makefile文件。对于大型的软件项目,这种方法无疑是非常有效的。