configure 文件 check_cxxflags() 函数的注释

#!/bin/bash
#########################################################################
# title: configure 文件 check_cxxflags() 函数的注释
# author: hjjdebug
# date: 2023年 08月 28日 星期一 16:36:28 CST
# description: 鉴于configure 文件太大,所以特意提取出check_cxxflags 函数进行分析
# 程序注释请参考中文部分
#########################################################################

# 这里相较configure,直接添加,省略了推导过程
cxx=gcc
CXX_C='-c'
cflags_filter=echo

# 把传来的所有参数放入log文件
logfile="config.log"
log(){
    echo "$@" >> $logfile
}

# 这里我没有照搬configure 中的设置,而是截断了.
die(){
    log "$@"
    exit 1
}
#定义FFTMPDIR
: ${TMPDIR:=/tmp}
FFTMPDIR=$(mktemp -d "${TMPDIR}/ffconf.XXXXXXXX" 2> /dev/null) ||
    die "Unable to create temporary directory in $TMPDIR."


# 在FFTMPDIR 下创建一个tmpfile,名称为"test"$2,并赋值给$1
tmpfile(){
    tmp="${FFTMPDIR}/test"$2
    (set -C; exec > $tmp) 2> /dev/null ||
        die "Unable to create temporary file in $FFTMPDIR."
    eval $1=$tmp
}

# 记录传来的参数,并把参数作为命令执行,输出追加到logfile
test_cmd(){
    log "$@"
    "$@" >> $logfile 2>&1
}

#把$1 作为文件,读取其内容,追加到$logfile
log_file(){
    log BEGIN "$1"
    log_file_i=1
    while IFS= read -r log_file_line; do
        printf '%5d\t%s\n' "$log_file_i" "$log_file_line"
        log_file_i=$(($log_file_i+1))
    done < "$1" >> "$logfile"
    log END "$1"
}


# 定义TMPO,TMPCPP,
#例如 TMPO=/tmp/ffconf.ZI0lwmVZ/test.o
tmpfile TMPO   .o
tmpfile TMPCPP   .cpp
test_cxx(){
    # 参数记录到logfile
    log test_cxx "$@"
    #传递的内容生成 $TMPCPP
    cat > $TMPCPP
    #log_file中记录下文件内容
    log_file $TMPCPP
    #测试gcc 带CXXFLAGS的命令
    # test_cmd 是函数名称
    # $cxx 是命令, 此为gcc
    # $CPPFLAGS $CFLAGS $CXXFLAGS 初始都为空
    # "$@"是传来的额外flags, 例如 -std=c++11
    # $CXX_C 为 "-c", 只编译,不连接
    # $TMPO 为例如: TMPO=/tmp/ffconf.ZI0lwmVZ/test.o
    # $TMPCPP为例如: TMPCPP=/tmp/ffconf.ZI0lwmVZ/test.cpp
    # 整个语句的作用相当于,例如: gcc -std=c++11 -c -o tmp.o tmp.cpp
    test_cmd $cxx $CPPFLAGS $CFLAGS $CXXFLAGS "$@" $CXX_C -o $TMPO $TMPCPP
}

#为$1 参数追加内容
append(){
    var=$1
    shift
    eval "$var=\"\$$var $*\""
}
check_cxxflags(){
    log check_cxxflags "$@"
    # 把后面的输出设置为位置参数$1,$2...
    # 如果$cflags_filter 只是 echo, 那这条命令可以忽略.
    # 相当于$@还是设置为$@, $@ 并没有改变
    set -- $($cflags_filter "$@")
    # 把 int x 作为文件内容传递,测试test_cxx,成功则append CXXFLAGS
    test_cxx "$@" < int x;
EOF
}
# 实际是用 gcc -std=c++11 -c ... 来进行测试
# linux gcc9 应可以通过,返回成功
check_cxxflags -std=c++11 || check_cxxflags -std=c++0x

你可能感兴趣的:(#,config,configure,check_cxxflags)