最近由于项目要从windows平台移植到linux平台,对于一个只在windows平台,且借着IDE开发的程序员来说,任务着实艰巨。
网上一翻搜索,发现大家都在用g++编译器,借着Makefile,进行c++项目编译。由于每新建一个c++文件,都得把新规则加进Makefile文件,太麻烦。感觉应该有更好的方法,网上又一翻搜索,发现make本身就有这个功能,只可惜Makefile文件编写教程没有一两页的,少则十来页,多则二三十页,着实吓我一跳。于是萌发了利用bash shell生成Makefile文件的想法。由于对bash shell属于入门级别,所以花了一下午才写出来。所得结果还是比较满意。下面贴出脚本代码。
#!/bin/bash
#auto create Makefile
#Author:psl
#email:iampsl@qq.com
#Configure Start
TARGET_NAME="a.out"
MAKEFILE_NAME="Makefile"
#You must set for you
INCLUDE_PATH="-I /usr/include/ "
LIB_PATH="-L /usr/lib/ "
LIBS=" "
DEPEND_COMMAND="g++ -MM $INCLUDE_PATH "
#debug:g++ -g -Wall -c
#release:g++ -O3 -Wall -c
COMPILE="g++ -g -Wall -c "
#static g++ -static
#share g++ -share
LINK="g++ "
#Configure End
#Genarate Makefile file
echo -n "">$MAKEFILE_NAME
#Set Target Name
if test $1
then
TARGET_NAME=$1
fi
#Get all cpp files
CPP_FILES_COUNT=0
for TEMP_CPP_FILE in *.cpp
do
CPP_FILES[$CPP_FILES_COUNT]=`basename $TEMP_CPP_FILE .cpp`
CPP_FILES_COUNT=`expr $CPP_FILES_COUNT + 1`
done
#Link Rule
echo -n "${TARGET_NAME}:">>$MAKEFILE_NAME
i=0
while test $i -lt $CPP_FILES_COUNT
do
echo -n "${CPP_FILES[$i]}.o ">>$MAKEFILE_NAME
i=`expr $i + 1`
done
echo "">>$MAKEFILE_NAME
echo -n " $LINK -o ${TARGET_NAME} ${LIB_PATH} ${LIBS} ">>$MAKEFILE_NAME
i=0
while test $i -lt $CPP_FILES_COUNT
do
echo -n "${CPP_FILES[$i]}.o ">>$MAKEFILE_NAME
i=`expr $i + 1`
done
echo "">>$MAKEFILE_NAME
#Link End
#Compile Rule
i=0
while test $i -lt $CPP_FILES_COUNT
do
echo "`$DEPEND_COMMAND ${CPP_FILES[$i]}.cpp`">>$MAKEFILE_NAME
echo -n " $COMPILE ${INCLUDE_PATH} -o ${CPP_FILES[$i]}.o ${CPP_FILES[$i]}.cpp">>$MAKEFILE_NAME
echo "">>$MAKEFILE_NAME
i=`expr $i + 1`
done
#Compile End
#Clean Rule
echo "clean: ">>$MAKEFILE_NAME
echo -n " rm -f ">>$MAKEFILE_NAME
i=0
while test $i -lt $CPP_FILES_COUNT
do
echo -n "${CPP_FILES[$i]}.o ">>$MAKEFILE_NAME
i=`expr $i + 1`
done
echo " $TARGET_NAME">>$MAKEFILE_NAME
#Clean End
使用说明:
把一个项目的c++源代码放在一个目录里,拷贝上述脚本到一个sh文件(比如make.sh)中,通过chmod 700 ./make.sh添加执行权限
运行make.sh ./make.sh
就会发现当前目录下生成了一个Makefile文件
然后make就可以编译程序了。
如果想要给最终可执行程序命名,只需要在运行脚本时,把名字作为参数给传进去就可以了。(比如./make.sh main.exe 然后make,就会生成一个main.exe的程序了)