#!/bin/bash
#compile.sh
cd `dirname $0`
currentPath=`pwd`
result=''
#设置生成的可执行文件名字,可以从外部传入 ./compile.sh start
appName=''
if [ "X$1" != 'X' ]
then
appName=$1
else
appName='Start.out'
fi
function ReadAllFileName()
{
if [ "X$1" != 'X' ]
then
cd "$1"
fi
files=`ls`
for filename in $files;do
if [ -d $filename ]
then
#echo "文件夹 $filename "
#递归
ReadAllFileName $filename
else
if [ ${filename##*.} = 'cpp' ] || [ ${filename##*.} = 'c' ] || [ ${filename##*.} = 'cxx' ]
then
#去除入口程序
# if [[ $filename =~ 'server' ]]
# then
# continue
#fi
# echo $filename
# echo `pwd`
tmp=`pwd`"/"$filename
result=${result}" "$tmp
fi
fi
done
cd ..
}
ReadAllFileName
echo '开始编译..........'
#下面用到相对,会以这个路径作为参考
cd $currentPath
#echo "result="$result
#把.c .cpp后缀的文件替换成同名的.o文件
resultofile=${result//.cpp/.o}
resultofile=${resultofile//.cxx/.o}
resultofile=${resultofile//.c/.o}
#去除 .o文件前面的路径,因为生成的.o文件和本脚本在同目录(没有cd $currentPath 到当前目录,结果也是一样)
current_o_file=''
for ofile in $resultofile
do
current_o_file=${current_o_file}" "${ofile##*/}
done
echo "生成的.o文件o_file= "$current_o_file
#第一种方式 Begin---------------------------
# 先把所有.c .cpp编译成 .o文件 在编译成可执行文件
#在当前目录currentPath 生成对应的.o文件
for item in $result
do
#因为入口程序server.cpp 需要加上包含的目录 -I ./depends/include -I ./depends/json -std=c++11 -pthread
# ,不单独编译入口程序server.cpp,所以都加上,省事
g++ -c $item -I ./depends/include -I ./depends/json -std=c++11 -pthread
#echo $item
done
#单独编译入口程序 server.cpp
#g++ -c server.cpp -I ./depends/include -I ./depends/json -std=c++11 -pthread
#把.o文件 链接成可执行文件
g++ $current_o_file -std=c++11 -pthread -o $appName
#----------------------------第一种方式 End--------------------------------
#第二种方式 Begin --------------------
#
#$result 所有的.c .cpp 文件
#-I ./depends/include ./depends/json 包含的头文件路径
#-std=c++11 -pthread 编译选项
# -o start 生成的可执行文件
#
#g++ \
#$result \
#-I ./depends/include \
#-I ./depends/json \
#-std=c++11 -pthread \
#-o $appName
#------------------------第二种方式 End-----------------------------------------------
# 删除目录下所有.o文件
find . -name '*.o' -delete