[Fortran] 纯文本查看 复制代码
/bin/bash
#==================================== 参 数 设 置 ===========================================
Suff='f03' #源文件后缀
MkFile='makefile' #makefile文件名
TargetName='debug' #目标程序名
FortComp='gfortran' #编译器
FortFlag='-c -O2 -std=f2003' #编译器选项
#=================================================================================================
#检查有没有makefile文件。如有,删掉
if [ -e ${MkFile} ];then
rm -rf ${MkFile}
fi
#写入编译器和编译器选项信息到makefile
echo 'FC='${FortComp} > ${MkFile}
echo 'Flag='${FortFlag} >> ${MkFile}
#写入目标程序名称到makefile
echo '' >> ${MkFile}
echo 'target='${TargetName} >> ${MkFile}
#----------------------------------------------------------------------------------------------------------------
#读入所有的源文件名称,并写到源码目录里
NameTmp=Files.lst
ls *.${Suff} > ${NameTmp}
#扫描文件,获取所有的模块程序文件文件
All_Mods=""
while read lines
do
FileName=$(echo ${lines} | awk -F. '{print $1}') #从源文件目录中按扩展名提取文件名
FileType=$(echo ${FileName} | awk -F_ '{print $1}' ) #获取文件性质,mod还是其他
ModName=$(echo ${FileName} | awk -F_ '{print $2}' ) #获取模块名称
if [ x${ModName} != 'x' ];then
All_Mods=${All_Mods}mod_${ModName}.o" "
fi
done < ${NameTmp}
#写入所有依赖模块到makefile
echo "All="${All_Mods} >> ${MkFile}
echo "" >> ${MkFile}
#----------------------------------------------------------------------------------------------------------------
#写入主程序的依赖信息到makefile
if [ -e Main.${Suff} ];then
echo '$'{target}":Main.o "'$'{All} >> ${MkFile}
echo -e '\t''$'{FC} '$'^ -o '$'@ >> ${MkFile}
echo "" >> ${MkFile}
fi
#----------------------------------------------------------------------------------------------------------------
#依次打开原文件查找依赖的模块
while read Lines
do
Mod_Used=''
echo ""
echo "检查源文件《"${Lines}"》所依赖的模块文件:"
theName=$(echo ${Lines} | awk -F. '{print $1}') #提取本行源文件程序名(去除扩展名)
#打开原文件,逐行检查,发现use字眼,提取模块的名称
while read SrcLine
do
isUsed=$(echo ${SrcLine} | awk -F' ' '{print $1}')
if [ x${isUsed} == "xuse" ];then
WhichMod=$(echo ${SrcLine} | awk -F' ' '{print $2}')
#检查是否存在模块名称对应的源码文件,若存在源文件则统计记录
if [ -e ${WhichMod}.${Suff} ];then
echo " 找到源文件:"${WhichMod}.${Suff}
Mod_Used=${Mod_Used}${WhichMod}.o" "
else
echo " !!! 警告,未找到模块"${Mod_Used}"的源文件 -> "${Mod_Used}.${Suff}
fi
fi
done < ${Lines}
#写入本源文件和依赖关系到makefile
if [ x${Lines} != 'x' ];then
echo ${theName}.o : ${Lines} ${Mod_Used} >> ${MkFile}
echo -e '\t''$'{FC} '$'{Flag} '$''<' -o '$'@ >> ${MkFile}
echo "" >> ${MkFile}
fi
done < ${NameTmp}
#----------------------------------------------------------------------------------------------------------------
#写入makefile的命令部分
echo ".PHONY:" >> ${MkFile}
#make run 部分
echo "run:" >> ${MkFile}
echo -e "\t-./"'$'{target} >> ${MkFile}
#make Clean 部分
echo "clean:" >> ${MkFile}
echo -e "\trm -rf *.o" >> ${MkFile}
echo -e "\trm -rf *.mod" >> ${MkFile}
#make CleanAll 部分
echo "CleanAll:" >> ${MkFile}
echo -e "\trm -rf *.o" >> ${MkFile}
echo -e "\trm -rf *.mod" >> ${MkFile}
echo -e "\trm -rf "'$'{target} >> ${MkFile} #连目标程序一并铲除
#----------------------------------------------------------------------------------------------------------------
#清除临时文件:
rm -rf ${NameTmp}
echo ""
echo " =================================================================="
echo " = ="
echo " = 现在,可以执行make命令编译这个工程了。 ="
echo " = ="
echo " =================================================================="
echo ""