Makefile通用模板-浪浪的第一个版本

说明:

此Makefile是我为了以后而写的,并不是Makefile的详解,不合适收藏作为命令查询工具,但是我觉得可以以“Makefile通用模板”的方式作为收藏。我并没写过多少Makefile,只是看了一下资料写出来的,大家可以认为此Makefile是一个新手作品,但是我的测试结果,我觉得是一个不错的通用模板。虽然还有待改进,因为缺少遍历整个目录下子文件夹列表的能力,无法自动将子文件夹目录自动生成,导致必须手动输入每一个makefile路径,放入Makefile的include所调用的变量中。这是我的一个遗憾。我找过找寻过一些方法,也的确有方法可自动生成子文件夹目录,因为调用的其它命令,所以并未采用。如果大家有好的方法,可以一起探讨。

代码及文件说明

从文件夹来说,分三层。第一层所拥有文件:test.c、Makefile,文件夹fun。其中fun文件夹内为第二层,有文件fun.c、fun.h、theboy.c、theboy.h、Makefile以及文件夹thefun。其中thefun文件夹内为第三层,有文件thefun.c、thefun.h、Makefile

当前目录下

Makefile

TARGET:=test#最终生成的目标文件“test”
ALL_CP=./fun/ ./fun/thefun/#包含所有子文件路径
ALL_P=./ ${ALL_CP}#包含所有路径
ALL_M=${ALL_CP:%=%Makefile}#包含所有Makefile(我所有的子文件内都是Makefile这个名字)
ALL_C=$(wildcard ${ALL_P:%=%*.c})#包含所有.c文件(这个变量可以不要,是给"ALL_O"用的)
ALL_O=${ALL_C:%.c=%.o}#包含所有.o
ALL_D=-DDEBUG#包含所有编译时需要的宏
ALL_L=#包含所有编译时需要的库
ALL_T=#本人测试时用的,目的是为了告诉大家能够找到子文件夹中的“Makefile”
ALL_=#包含所有其他类型文件的后缀类型名
CC:=gcc #编译方式
LINK:= -g -o#链接选项
COMPILE= -c -o#编译选项
RM=rm -rf#删除命令及选项
include ${ALL_M}#包含所有makefile
vpath ${ALL_} ${ALL_P%./=%}#通过vpath让编译器在当前目录找不到想要类型文件时到设定的目录去找
TARGET:${ALL_O}
	@echo ${ALL_T}#演示include用
	${CC} ${ALL_D} ${LINK} ${TARGET} ${ALL_O} ${ALL_L}
%.o:%.c
	${CC} ${ALL_D} ${COMPILE} $@ $<
.PHONY clean clean_o
clean: #删除所有 
	${RM} *.o test
clean_o:#只删除“.o”文件
	${RM} *.o	

test.c

#include <stdio.h>
#include "fun/fun.h"
int main (int argc, char **argv[])
{
	printf("hello world from ./test.c\n");
	fun();
	return 0;
}

fun目录下

Makefile(fun文件夹内)

ALL_T+=./fun/Makefile#给大家测试变量用,每个文件用到的宏可以放在ALL_D变量中,由主Makefile包含进去

fun.h

#include <stdio.h>
#include "thefun/thefun.h"
#include "theboy.h"
void fun();

fun.c

#include "fun.h"
void fun ()
{
	printf ("hello world from ./fun/fun.c\n");
	thefun();
	theboy();
}

theboy.h

#include<stdio.h>
void theboy();

theboy.c

#include"theboy.h"
void theboy()
{
	printf("hello world from ./fun/theboy.c\n");
}

thefun目录下

Makefile(thefun文件夹内)

ALL_T+=./fun/thefun/Makefile

thefun.h

#include<stdio.h>
void thefun();                 

thefun.c

#include"thefun.h"
void thefun()
{
	printf("hello world from ./fun/thefun.c\n");
#if defined DEBUG
	printf("hello world from ./fun/thefun.c:DEBUG\n");
#endif
}

结果

测试结果图

模板

主Makefile

TARGET:=test#最终生成的目标文件“test”
ALL_CP=#包含所有子文件路径
ALL_P=./ ${ALL_CP}#包含所有路径
ALL_M=${ALL_CP:%=%Makefile}#包含所有Makefile(我所有的子文件内都是Makefile这个名字)
ALL_C=$(wildcard ${ALL_P:%=%*.c})#包含所有.c文件(这个变量可以不要,是给"ALL_O"用的)
ALL_O=${ALL_C:%.c=%.o}#包含所有.o
ALL_D=#包含所有编译时需要的宏
ALL_L=#包含所有编译时需要的库
ALL_=#包含所有其他类型文件的后缀类型名
CC:=#编译方式
LINK:=#链接选项
COMPILE=#编译选项
RM=#删除命令及选项
include ${ALL_M}#包含所有makefile
vpath ${ALL_} ${ALL_P%./=%}#通过vpath让编译器在当前目录找不到想要类型文件时到设定的目录去找
TARGET:${ALL_O}
		${CC} ${ALL_D} ${LINK} ${TARGET} ${ALL_O} ${ALL_L}
%.o:%.c
	${CC} ${ALL_D} ${COMPILE} $@ $<
.PHONY clean clean_o
clean: #删除所有 
	${RM} ${ALL_O} ${TARGET}
clean_o:#只删除“.o”文件
	${RM} ${ALL_O}	

子Makefile

ALL_CP+=#追加主Makefile中没有的子路径
ALL_D+=#追加编译时需要的宏
ALL_L+=#追加编译时需要的库
ALL_+=#追加其他类型文件的后缀类型名

欢迎大家提出更好的修改方法。

最好能帮我想出一个更好的自动识别主文件夹下的所有子文件夹路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值