+ -
当前位置:首页 → 问答吧 → 学好嵌入式

学好嵌入式

时间:2011-08-09

来源:互联网

暂定名为 Automatic Dependencies Solving Makefile Generating Configure Script
代码: [ 下载 ] [ 隐藏 ]
代码: [ 下载 ] [ 显示 ]
使用 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 $*
 
格式化 0.023 秒, 使用 GeSHi 1.0.8.4

此脚本利用 g++ 自动生成 makefile 依赖规则,且能顺利处理好循环依赖问题
目前只适用于 C++,后缀名要求是 .cc/.h,主文件名在全局变量 MAIN 中指定

将其保存为 configure(这个名字我喜欢 ),加上 x 权限,然后
代码: [ 下载 ] [ 隐藏 ]
代码: [ 下载 ] [ 显示 ]
使用 bash 语法高亮
./configure
make
格式化 0.006 秒, 使用 GeSHi 1.0.8.4

即可

作者: cjxgm   发布时间: 2011-08-09

c++的阿。我说怎么会自动罗。

作者: eexpress   发布时间: 2011-08-09

C 也可以的嘛,改一下脚本里的后缀替换就好了(gcc 的都可以的吧)

作者: cjxgm   发布时间: 2011-08-09