有段代码是这么写的:
function build_license_3_0(){
echo "build license_3.0 in ${work_dir}"
cat << END
cd ${work_dir} &&
"Building C object license.o"
gcc -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/license.o -c ${work_dir}/license.c &&
"Building C object hwinfo.o"
gcc -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/hwinfo.o -c ${work_dir}/hwinfo.c &&
"Linking hwinfo.o and license.o to C static library liblicense.a"
ar cr ${work_dir}/bin/liblicense.a ${work_dir}/bin/hwinfo.o ${work_dir}/bin/license.o && ranlib ${work_dir}/bin/liblicense.a &&
"Building C object verify_license.o"
gcc -DARCH_X86_64 -DBUILD_TIME=1410589555 -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/verify_license.o -c ${work_dir}/verify_license.c &&
"Linking C executable verify_license"
gcc -g -pthread -Wall -g -O0 verify_license.o -I${work_dir} -o ${work_dir}/bin/verify_license ${work_dir}/bin/liblicense.a -lcrypto &&
mkdir ${work_dir}/bin/shared
"Building C object shared/hwinfo.o"
gcc -DARCH_X86_64 -DBUILD_TIME=buildtime -Dlicense_shared_EXPORTS -g -pthread -Wall -g -O0 -fPIC -I${work_dir} -o ${work_dir}/bin/shared/hwinfo.o -c ${work_dir}/hwinfo.c &&
"Building C object shared/license.o"
gcc -DARCH_X86_64 -DBUILD_TIME=buildtime -Dlicense_shared_EXPORTS -g -pthread -Wall -g -O0 -fPIC -I${work_dir} -o ${work_dir}/bin/shared/license.o -c ${work_dir}/license.c &&
"Linking C shared library liblicense-shared.so"
gcc -fPIC -g -pthread -Wall -g -O0 -shared -Wl,-soname,liblicense-shared.so -o ${work_dir}/bin/liblicense-shared.so ${work_dir}/bin/shared/license.o ${work_dir}/bin/shared/hwinfo.o -lcrypto &&
"Building C object /generate_hwinfo.o"
gcc -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/generate_hwinfo.o -c ${work_dir}/generate_hwinfo.c &&
"Linking C executable generate_hwinfo"
gcc -g -pthread -Wall -g -O0 ${work_dir}/bin/generate_hwinfo.o -o ${work_dir}/bin/generate_hwinfo ${work_dir}/bin/liblicense.a -lcrypto
"clear .o files"
sudo rm ${work_dir}/bin/generate_hwinfo.o ${work_dir}/bin/verify_license.o
${work_dir}/bin/license.o
${work_dir}/bin/hwinfo.o &&
sudo rm -rf ${work_dir}/bin/shared
END
(
cd ${work_dir} && mkdir -p ${work_dir}/bin &&
echo "Building C object license.o"
gcc -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/license.o -c ${work_dir}/license.c &&
echo "Building C object hwinfo.o"
gcc -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/hwinfo.o -c ${work_dir}/hwinfo.c &&
echo "Linking hwinfo.o and license.o to C static library liblicense.a"
ar cr ${work_dir}/bin/liblicense.a ${work_dir}/bin/hwinfo.o ${work_dir}/bin/license.o && ranlib ${work_dir}/bin/liblicense.a &&
echo "Building C object verify_license.o"
gcc -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/verify_license.o -c ${work_dir}/verify_license.c &&
echo "Linking C executable verify_license"
gcc -g -pthread -Wall -g -O0 ${work_dir}/bin/verify_license.o -I${work_dir} -o ${work_dir}/bin/verify_license ${work_dir}/bin/liblicense.a -lcrypto &&
mkdir ${work_dir}/bin/shared
echo "Building C object shared/hwinfo.o"
gcc -DARCH_X86_64 -DBUILD_TIME=$buildtime -Dlicense_shared_EXPORTS -g -pthread -Wall -g -O0 -fPIC -I${work_dir} -o ${work_dir}/bin/shared/hwinfo.o -c ${work_dir}/hwinfo.c &&
echo "Building C object shared/license.o"
gcc -DARCH_X86_64 -DBUILD_TIME=$buildtime -Dlicense_shared_EXPORTS -g -pthread -Wall -g -O0 -fPIC -I${work_dir} -o ${work_dir}/bin/shared/license.o -c ${work_dir}/license.c &&
echo "Linking C shared library liblicense-shared.so"
gcc -fPIC -g -pthread -Wall -g -O0 -shared -Wl,-soname,liblicense-shared.so -o ${work_dir}/bin/liblicense-shared.so ${work_dir}/bin/shared/license.o ${work_dir}/bin/shared/hwinfo.o -lcrypto &&
echo "Building C object /generate_hwinfo.o"
gcc -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/generate_hwinfo.o -c ${work_dir}/generate_hwinfo.c &&
echo "Linking C executable generate_hwinfo"
gcc -g -pthread -Wall -g -O0 ${work_dir}/bin/generate_hwinfo.o -o ${work_dir}/bin/generate_hwinfo ${work_dir}/bin/liblicense.a -lcrypto
echo "clear .o files"
sudo rm ${work_dir}/bin/generate_hwinfo.o ${work_dir}/bin/verify_license.o &&
sudo rm ${work_dir}/bin/license.o ${work_dir}/bin/hwinfo.o
sudo rm -rf ${work_dir}/bin/shared
)
ret=$?; if [[ 0 -ne ${ret} ]]; then echo "build license_3.0 failed"; return $ret; fi
echo "license builded in "
echo " ${work_dir}/bin/generate_hwinfo";
echo " ${work_dir}/bin/verify_license";
echo " ${work_dir}/bin/liblicense-shared.so";
return 0;
}
这个bash代码是从cmake中翻译过来,一大堆的复杂逻辑其实就是编译两个binary和一个so文件,由于cmake的代码没有搞清楚,导致翻译过来的bash就巨复杂无比。
这个代码的问题:
- cmake代码没有搞清楚到底什么是最简单的方式,一大堆复杂的方式,编译.a然后删掉,然后创建个shared编译so。其实就直接编译就完了,可以用一样的参数。
- 没有检查错误,当gcc错误时还会继续。
其实可以改成这样:
function build_license_3_0(){
echo "build license_3.0 in ${work_dir}"
cd ${work_dir} && mkdir -p ${work_dir}/bin
echo "Building C object license.o" &&
gcc -fPIC -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/license.o -c ${work_dir}/license.c
ret=$?; if [[ 0 -ne ${ret} ]]; then echo "Building C object license.o failed"; return $ret; fi
echo "Building C object hwinfo.o" &&
gcc -fPIC -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/hwinfo.o -c ${work_dir}/hwinfo.c
ret=$?; if [[ 0 -ne ${ret} ]]; then echo "Building C object hwinfo.o failed"; return $ret; fi
echo "Linking C shared library liblicense-shared.so"
gcc -fPIC -g -pthread -Wall -g -O0 -shared -Wl,-soname,liblicense-shared.so -o ${work_dir}/bin/liblicense-shared.so \
${work_dir}/bin/license.o ${work_dir}/bin/hwinfo.o -lcrypto
ret=$?; if [[ 0 -ne ${ret} ]]; then echo "Building C object liblicense-shared.so failed"; return $ret; fi
echo "Linking C executable generate_hwinfo"
gcc -g -pthread -Wall -g -O0 ${work_dir}/generate_hwinfo.c -o ${work_dir}/bin/generate_hwinfo \
${work_dir}/bin/license.o ${work_dir}/bin/hwinfo.o -lcrypto
ret=$?; if [[ 0 -ne ${ret} ]]; then echo "Building C object generate_hwinfo failed"; return $ret; fi
echo "Linking C executable verify_license"
gcc -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall -g -O0 ${work_dir}/verify_license.c -I${work_dir} -o ${work_dir}/bin/verify_license \
${work_dir}/bin/license.o ${work_dir}/bin/hwinfo.o -lcrypto
ret=$?; if [[ 0 -ne ${ret} ]]; then echo "Building C object verify_license failed"; return $ret; fi
echo "license builded in "
echo " ${work_dir}/bin/generate_hwinfo";
echo " ${work_dir}/bin/verify_license";
echo " ${work_dir}/bin/liblicense-shared.so";
return 0;
}
简单的事情偏偏要复杂化,这种趋势不是只有c/c++/js/as中才有,bash也一样。
代码就是代码,没有区别。