来自这里 Makefile遍历编译示例_makefile 遍历文件-CSDN博客
记录给自己,避免以后搜索太花时间
简要的遍历编译方法:
使用for语句进入当前目录的各个子目录,然后使用make -C $(CUR_PATH),进行编译各个子目录。
假设工程如下
--/
-./time
-time.c
-./gip
-gip.c
整个工程要编译出来两个可执行文件time和gip,一次性编译完成。
在工程根目录下创建Makefile文件,内容如下:
这个Makefile会遍历当前目录下的所有第一级子目录,然后循环进入各个子目录,调用子目录里面的Makefile,全部跑一遍。 如果想遍历更深一点通过-maxdepth 的参数进行控制。
CUR_PATH := $(shell pwd)
PRJ_PATH := $(CUR_PATH)/..
SRC_FOLDER := $(shell find $(CUR_PATH) -maxdepth 1 -type d)
BASE_SRC_FOLDER := $(basename $(patsubst $(CUR_PATH)/%, %, $(SRC_FOLDER)))
BASE_SRC_FOLDER := $(filter-out $(CUR_PATH), $(BASE_SRC_FOLDER))
BASE_SRC_FOLDER := $(filter-out lib, $(BASE_SRC_FOLDER))
BASE_SRC_FOLDER := $(filter-out obj, $(BASE_SRC_FOLDER))
.PHONY:default clean
default:
echo $(SRC_FOLDER)
echo $(BASE_SRC_FOLDER)
@for dir in ${BASE_SRC_FOLDER}; do make -C $(CUR_PATH)/$$dir ||exit; done
@echo build project done!
clean:
@for dir in ${BASE_SRC_FOLDER}; do make -C $(CUR_PATH)/$$dir clean ||exit; done
@echo clean project done!
然后进入time文件夹,创建Makefile:
time:$(subst .c,.o,$(wildcard *.c))
gcc $^ -o $@
%.o:%.c
gcc -c $< -o $@
clean:
rm $(subst .c,.o,$(wildcard *.c))
再进入gip文件夹,创建Makefile:
gip.c这个文件用到了pthread_create, 所以编译参数比time的参数要多链接一个lib,使用了-lpthread
LIBS += -lpthread
gip:$(subst .c,.o,$(wildcard *.c))
gcc $^ $(LIBS) -o $@
%.o:%.c
gcc -c $< -o $@
clean:
rm $(subst .c,.o,$(wildcard *.c))
看一下编译的过程:
make[1]: 进入目录“/home/qq/code/test/time”
gcc -c time.c -o time.o
gcc time.o -o time
make[1]: 离开目录“/home/qq/code/test/time”
make[1]: 进入目录“/home/qq/code/test/gip”
gcc -c gip.c -o gip.o
gcc gip.o -lpthread -o gip
make[1]: 离开目录“/home/qq/code/test/gip”
build project done!
精炼的遍历遍历方案模板,可根据需要添加内容