学好嵌入式
时间:2011-08-09
来源:互联网
暂定名为 Automatic Dependencies Solving Makefile Generating Configure Script 
此脚本利用 g++ 自动生成 makefile 依赖规则,且能顺利处理好循环依赖问题
目前只适用于 C++,后缀名要求是 .cc/.h,主文件名在全局变量 MAIN 中指定
将其保存为 configure(这个名字我喜欢
),加上 x 权限,然后
即可

代码: [ 下载 ] [ 隐藏 ]
使用 bash 语法高亮
#!/bin/bash
# Automatic Dependencies Solving Makefile Generating Configure Script
# Written by eXerigumo Clanjor
# CUSTOMIZE
MAIN="main"
LIBS="-lglut -lGL -lGLU"
# GLOBAL VARS
CXXFLAGS="-s"
CXXOPTIMIZE="-O2"
DEPS=()
OBJS=()
# -- void main(argv)
main()
{
# parse arguments
while ! [ -z "$1" ]; do
case $1 in
"--help") show_help
;;
"-h") show_help
;;
"--enable-debug") CXXFLAGS="-g -DDEBUG"
CXXOPTIMIZE="" # No optimization
shift ;;
"-Ofast") CXXOPTIMIZE="-Ofast"
shift ;;
"--clean") make cleanall
rm -f makefile
exit 0
;;
*) error "unknown argument: $1"
;;
esac
done
generate_makefile
}
# -- void generate_makefile(void)
generate_makefile()
{
echo -e "# Generated by ADSMGCS." > makefile
echo >> makefile
echo -e "CXXFLAGS = -Wall $CXXFLAGS $CXXOPTIMIZE $LIBS" >> makefile
echo >> makefile
echo -e "all: $MAIN" >> makefile
echo -e "clean:" >> makefile
echo -e "\trm -f *.o" >> makefile
echo -e "cleanall: clean" >> makefile
echo -e "\trm -f $MAIN" >> makefile
echo -e "rebuild: clean all" >> makefile
echo -e "debug: all" >> makefile
echo -e "\t./$MAIN" >> makefile
echo >> makefile
generate_dep "${MAIN}.cc"
echo -e "$MAIN:" ${OBJS[*]} >> makefile
echo -e '\t$(CXX) $(CXXFLAGS) -o $@ $^' >> makefile
cat .makefile >> makefile
echo >> makefile
rm -f .makefile
}
# -- void show_help(void)
show_help()
{
echo
echo -e "OPTIONS:"
echo -e "\t--help, -h"
echo -e "\t\tShow this help"
echo -e "\t--enable-debug"
echo -e "\t\tEnable debug mode"
echo -e "\t-Ofast"
echo -e "\t\tUse -Ofast instead of -O2"
echo
exit 0
}
# -- void error(string err)
error()
{
echo -e "\e[1;31merror:\e[m $1"
exit 1
}
# -- void generate_dep(string file)
generate_dep()
{
echo -e "Solving dependencies of $1..."
if ! g++ -MM "$1" > .dep; then
error "unexpected failure of g++."
fi
cat .dep >> .makefile
echo -e '\t$(CXX) $(CXXFLAGS) -c -o $@ $<' >> .makefile
local dep="`cat .dep|awk '{sub(/\\\\/, ""); printf $0}' \
|sed 's/[^ ]\+: [^ ]\+ \?//g'`"
local obj="`cat .dep|head -n 1|awk -F: '{printf $1}'`"
rm -f .dep
OBJS[${#OBJS[*]}]="$obj"
local d
for d in $dep; do
if need_recursive_dep "$d"; then
d="`echo $d|sed 's/\\.h$/.cc/g'`"
generate_dep "$d"
fi
done
}
# -- bool need_recursive_dep(string file)
need_recursive_dep()
{
local d
for d in ${DEPS[*]}; do
[[ "$d" == "$1" ]] && return 1
done
DEPS[${#DEPS[*]}]="$1"
return 0
}
main $*
# Automatic Dependencies Solving Makefile Generating Configure Script
# Written by eXerigumo Clanjor
# CUSTOMIZE
MAIN="main"
LIBS="-lglut -lGL -lGLU"
# GLOBAL VARS
CXXFLAGS="-s"
CXXOPTIMIZE="-O2"
DEPS=()
OBJS=()
# -- void main(argv)
main()
{
# parse arguments
while ! [ -z "$1" ]; do
case $1 in
"--help") show_help
;;
"-h") show_help
;;
"--enable-debug") CXXFLAGS="-g -DDEBUG"
CXXOPTIMIZE="" # No optimization
shift ;;
"-Ofast") CXXOPTIMIZE="-Ofast"
shift ;;
"--clean") make cleanall
rm -f makefile
exit 0
;;
*) error "unknown argument: $1"
;;
esac
done
generate_makefile
}
# -- void generate_makefile(void)
generate_makefile()
{
echo -e "# Generated by ADSMGCS." > makefile
echo >> makefile
echo -e "CXXFLAGS = -Wall $CXXFLAGS $CXXOPTIMIZE $LIBS" >> makefile
echo >> makefile
echo -e "all: $MAIN" >> makefile
echo -e "clean:" >> makefile
echo -e "\trm -f *.o" >> makefile
echo -e "cleanall: clean" >> makefile
echo -e "\trm -f $MAIN" >> makefile
echo -e "rebuild: clean all" >> makefile
echo -e "debug: all" >> makefile
echo -e "\t./$MAIN" >> makefile
echo >> makefile
generate_dep "${MAIN}.cc"
echo -e "$MAIN:" ${OBJS[*]} >> makefile
echo -e '\t$(CXX) $(CXXFLAGS) -o $@ $^' >> makefile
cat .makefile >> makefile
echo >> makefile
rm -f .makefile
}
# -- void show_help(void)
show_help()
{
echo
echo -e "OPTIONS:"
echo -e "\t--help, -h"
echo -e "\t\tShow this help"
echo -e "\t--enable-debug"
echo -e "\t\tEnable debug mode"
echo -e "\t-Ofast"
echo -e "\t\tUse -Ofast instead of -O2"
echo
exit 0
}
# -- void error(string err)
error()
{
echo -e "\e[1;31merror:\e[m $1"
exit 1
}
# -- void generate_dep(string file)
generate_dep()
{
echo -e "Solving dependencies of $1..."
if ! g++ -MM "$1" > .dep; then
error "unexpected failure of g++."
fi
cat .dep >> .makefile
echo -e '\t$(CXX) $(CXXFLAGS) -c -o $@ $<' >> .makefile
local dep="`cat .dep|awk '{sub(/\\\\/, ""); printf $0}' \
|sed 's/[^ ]\+: [^ ]\+ \?//g'`"
local obj="`cat .dep|head -n 1|awk -F: '{printf $1}'`"
rm -f .dep
OBJS[${#OBJS[*]}]="$obj"
local d
for d in $dep; do
if need_recursive_dep "$d"; then
d="`echo $d|sed 's/\\.h$/.cc/g'`"
generate_dep "$d"
fi
done
}
# -- bool need_recursive_dep(string file)
need_recursive_dep()
{
local d
for d in ${DEPS[*]}; do
[[ "$d" == "$1" ]] && return 1
done
DEPS[${#DEPS[*]}]="$1"
return 0
}
main $*
格式化 0.023 秒, 使用 GeSHi 1.0.8.4
此脚本利用 g++ 自动生成 makefile 依赖规则,且能顺利处理好循环依赖问题
目前只适用于 C++,后缀名要求是 .cc/.h,主文件名在全局变量 MAIN 中指定
将其保存为 configure(这个名字我喜欢

即可
作者: cjxgm 发布时间: 2011-08-09
c++的阿。我说怎么会自动罗。
作者: eexpress 发布时间: 2011-08-09
C 也可以的嘛,改一下脚本里的后缀替换就好了(gcc 的都可以的吧)
作者: cjxgm 发布时间: 2011-08-09
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28