0
点赞
收藏
分享

微信扫一扫

shell脚本自动生成makefile

汤姆torn 2022-04-04 阅读 99

效果展示

生成的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}"
举报

相关推荐

0 条评论