#!/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 "$@" <
EOF
}
# 实际是用 gcc -std=c++11 -c ... 来进行测试
# linux gcc9 应可以通过,返回成功
check_cxxflags -std=c++11 || check_cxxflags -std=c++0x