效果展示
生成的makefile
是这样的效果:
# automake version 1.0
CC = gcc
BIN = pkg
OBJ = pkg.o
LIB =
INC =
FLAGS = $(INC) -Wall
pkg: pkg.o
$(CC) $(OBJ) -o $(BIN) $(LIB)
pkg.o: pkg.c err.h color.h
$(CC) -c pkg.c -o pkg.o $(FLAGS)
.PHONY: clean
clean:
rm $(OBJ) $(BIN)
使用示例
会自动处理依赖关系(额外库库和头文件路径要手动添加)。
额外库(LIB
)和头文件路径(INC
)会留空,不需要请手动移除对应代码。
$automake
Usage: automake <target.c>
<target.c>
是你的main()
函数所在文件,生成的可执行程序名为main()
所在.c
文件的文件名去掉后缀名。
源代码
#!/bin/bash
RED="\033[0;31m"
GREEN="\033[0;32m"
NONE="\033[0m"
if [ $# != 1 ]
then
printf "${RED}Usage: automake <target.c>\n${NONE}"
exit 0
fi
makefile="makefile"
target=$(echo $1|sed 's/.c$//g')
allCFiles=$(ls *.c)
needCFiles="$(gcc -MM ${target}.c | grep -o *.c)"
OBJ=$(echo ${needCFiles} | sed 's/.c/.o/g')
INC=""
CC="gcc"
LIB=""
BIN=${target}
FLAGS="-Wall"
echo "# automake version 1.0" > ${makefile}
echo "CC = ${CC}" >> ${makefile}
echo "BIN = ${BIN}" >> ${makefile}
echo "OBJ = ${OBJ}" >> ${makefile}
echo "LIB = ${LIB}" >> ${makefile}
echo "INC = ${INC}" >> ${makefile}
echo "FLAGS = \$(INC) ${FLAGS}" >> ${makefile}
echo "" >> ${makefile}
echo "${target}: ${OBJ}" >> ${makefile}
echo -e "\t\$(CC) \$(OBJ) -o \$(BIN) \$(LIB)" >> ${makefile}
for file in ${needCFiles}
do
echo $(gcc -MM ${file}) >> ${makefile}
file=$(echo ${file} | sed 's/.c//g')
echo -e "\t\$(CC) -c ${file}.c -o ${file}.o \$(FLAGS)" >> ${makefile}
done
echo "" >> ${makefile}
echo ".PHONY: clean" >> ${makefile}
echo "clean:" >> ${makefile}
echo -e "\trm \$(OBJ) \$(BIN)" >> ${makefile}
printf "${GREEN}Succeed!\n${NONE}"