最近在编写Android编译系统时,需要遍历每一个目录下每一个文件夹下的makefile,网上的方法有些繁琐 ;就直接贴上自己遍历子目录深度为1;(for temporary)(之后会继续更新)
下面是我的一个简单实例工程:
文件夹目录层次:
1 #获取当前目录下的子目录名字
2 subdir = $(shell ls -l | grep ^d | awk '{print $$9}')
3
4 .PHONY : all clean ${subdir} NULL
5
6 all: ${subdir}
7 ${subdir} : NULL
8 make -C $@ clean
9 make -C $@
10
11 #make clean可以直接去掉各层目录下的*.o文件,而在Android编译系统中会直接删除out路径就可以了
12 clean:
13 find ./ -name '*.o' | xargs -I{} rm -f {}
14 NULL:
15 #:为空语句
16 @:
1 #PWD = "shell pwd"
2 CC := gcc
3 #shell pwd是比较好一点的
4 INC_DIR := $(shell pwd)/inc/
5 SRC_DIR := $(shell pwd)/src/
6 OBJ_DIR := $(shell pwd)/obj/
7 BIN_DIR := $(shell pwd)/bin/
8 LIB_DIR := $(shell pwd)/lib/
9
10 #目标文件名
11 TARGET := $(BIN_DIR)/main
12
13
14 CFLAGS := -g
15 CFLAGS += -Wall
16 CFLAGS += -D_FORTIFY_SOURCE=2
17
18
19 #patsubst 是替换通配符,会把第一个%.c替换成第二个参数的%.c,
20 #wildcard 是把指定目录 $(SRC_DIR)下面的.c文件全部展开
21 #notdir 是把展开的文件去掉路径信息
22 SOURCES := $(patsubst %.c,%.c,$(notdir $(wildcard $(SRC_DIR)/*.c))) \
23
24 OBJECTS := $(addprefix $(OBJ_DIR)/, $(SOURCES:.c=.o))
25
26
27 .PHONY : clean all $(TARGET) $(OBJECTS)
28
29 INCPATHS := \
30 -I. \
31
32 LIBDIRS := \
33 -L. \
34
35 LIBS := \
36 -lpthread \
37
38 $(TARGET) : $(OBJECTS)
39 @mkdir -p $(LIB_DIR) $(BIN_DIR) 2> /dev/null
40 $(CC) $(CFLAGS) -o $@ $(OBJECTS)
41 $(OBJECTS) : $(OBJ_DIR)/%.o : $(SRC_DIR)/%.c
42 @mkdir -p $(OBJ_DIR) 2> /dev/null
43 $(CC) -c $(CFLAGS) $< -o $@
44
45 all: $(OBJECTS) $(TARGET)
46
47 clean:
48 find ./ -name '*.*.swp' | xargs -I{} rm -f {}
49 rm -f $(OBJECTS) $(TARGET)
Reference: