您的位置:首页 > 其它

一个通用的makefile(一)

2017-07-21 16:44 411 查看

最近在编写Android编译系统时,需要遍历每一个目录下每一个文件夹下的makefile,网上的方法有些繁琐 ;就直接贴上自己遍历子目录深度为1;(for  temporary)(之后会继续更新)

下面是我的一个简单实例工程:

文件夹目录层次:

1、根目录(相对于项目而言)的makefile

#获取当前目录下的子目录名字
subdir = $(shell ls -l | grep ^d | awk '{print $$9}')

.PHONY : all clean ${subdir} NULL

all: ${subdir}
${subdir} : NULL
make -C $@ clean
make -C $@

#make clean可以直接去掉各层目录下的*.o文件,而在Android编译系统中会直接删除out路径就可以了
clean:
find ./ -name '*.o' | xargs -I{} rm -f {}
NULL:
#:为空语句
@: 

2、子目录下的makefile:

#PWD = "shell pwd"
CC := gcc
#shell pwd是比较好一点的
INC_DIR := $(shell pwd)/inc/
SRC_DIR := $(shell pwd)/src/
OBJ_DIR := $(shell pwd)/obj/
BIN_DIR := $(shell pwd)/bin/
LIB_DIR := $(shell pwd)/lib/

#目标文件名
TARGET  := $(BIN_DIR)/main

CFLAGS := -g
CFLAGS += -Wall
CFLAGS += -D_FORTIFY_SOURCE=2

#patsubst 是替换通配符,会把第一个%.c替换成第二个参数的%.c,
#wildcard 是把指定目录 $(SRC_DIR)下面的.c文件全部展开
#notdir 是把展开的文件去掉路径信息
SOURCES := $(patsubst %.c,%.c,$(notdir $(wildcard $(SRC_DIR)/*.c))) \

OBJECTS := $(addprefix $(OBJ_DIR)/, $(SOURCES:.c=.o))

.PHONY : clean all $(TARGET)  $(OBJECTS)

INCPATHS := \
-I. \

LIBDIRS :=  \
-L. \

LIBS := \
-lpthread \

$(TARGET) : $(OBJECTS)
@mkdir -p  $(LIB_DIR) $(BIN_DIR) 2> /dev/null
$(CC) $(CFLAGS)  -o $@ $(OBJECTS)
$(OBJECTS) : $(OBJ_DIR)/%.o : $(SRC_DIR)/%.c
@mkdir -p $(OBJ_DIR) 2> /dev/null
$(CC) -c $(CFLAGS) $< -o $@

all: $(OBJECTS) $(TARGET)

clean:
find ./ -name '*.*.swp' | xargs -I{} rm -f {}
rm -f $(OBJECTS) $(TARGET)

 

Reference:

 https://www.geek-share.com/detail/2615307442.html

https://www.geek-share.com/detail/2611663163.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: