调试通过的自动化 Makefile 参考

Makefile实现:

1 指定输出 *.o 和 target 路径,并且app下  *c *.cpp 文件目录映射 *.o 输出目录

2 c 和 c++ 源码混合编译

3 静态模式规则编译

# $(realpath $(dir $(lastword $(MAKEFILE_LIST))))  ->  /xxxx/unit_test/test_wirelessscan
CURR_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))

# $(realpath $(dir $(lastword $(MAKEFILE_LIST)))../../)  ->  /xxxx
FATH_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST)))../../)

# $(subst $(FATH_DIR)/, , $(CURR_DIR))  ->  unit_test/test_wirelessscan
RELA_DIR := $(strip $(subst $(FATH_DIR)/, , $(CURR_DIR)))
OBJ_DIR := $(strip $(OUTPUT)/objs/$(RELA_DIR))
TAR_DIR := $(OUTPUT)/bin

LOCAL_TARGET	:= test_wirelessscan

INCLUDE := -I$(CURR_DIR)/include
EXTLIBS := -Wl,-Bdynamic -L$(CURR_DIR)/lib -liw -lsqlite3 -lsqlitewrapper -liwscaninfo
EXTLIBS += -Wl,-Bdynamic -lstdc++ -ldl -lrt -lpthread
CFLAGS := -g -Wall -O2
LDFLAG := 
# for share lib (*.so) compile
#CFLAGS += -fPIC
#LDFLAG += -shared

SRC_DIR := . test

# $(foreach dir, $(SRC_DIR), $(wildcard $(CURR_DIR)/$(dir)/*.c $(CURR_DIR)/$(dir)/*.cpp))  ->  /xxxx/unit_test/test_wirelessscan/test1.cpp /xxxx/unit_test/test_wirelessscan/test/test2.cpp
# $(foreach dir, $(SRC_DIR), $(subst $(CURR_DIR)/, , $(wildcard $(CURR_DIR)/$(dir)/*.c $(CURR_DIR)/$(dir)/*.cpp)))  ->  test1.cpp test/test2.cpp
SRCS_ALL := $(foreach dir, $(SRC_DIR), $(subst $(CURR_DIR)/, , $(wildcard $(CURR_DIR)/$(dir)/*.c $(CURR_DIR)/$(dir)/*.cpp)))

OBJS_C := $(filter %.o, $(patsubst %.c, $(OBJ_DIR)/%.o, $(SRCS_ALL)))

# $(filter %.o, $(patsubst %.c, $(OBJ_DIR)/%.o, $(SRCS_ALL)))  ->  /xxxx/output/objs/unit_test/test_wirelessscan/test1.o /xxxx/output/objs/unit_test/test_wirelessscan/test/test2.o
OBJS_CPP := $(filter %.o, $(patsubst %.cpp, $(OBJ_DIR)/%.o, $(SRCS_ALL)))

$(OBJS_C): $(OBJ_DIR)/%.o : $(CURR_DIR)/%.c
	$(call create-dir, $(dir $@))
	$(Q)$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@

# $(Q)$(CP) $(CFLAGS) -std=gnu++11 $(INCLUDE) -c /xxxx/unit_test/test_wirelessscan/test1.cpp -o /xxxx/output/objs/unit_test/test_wirelessscan/test1.o
# $(Q)$(CP) $(CFLAGS) -std=gnu++11 $(INCLUDE) -c /xxxx/unit_test/test_wirelessscan/test/test2.cpp -o /xxxx/output/objs/unit_test/test_wirelessscan/test/test2.o
$(OBJS_CPP): $(OBJ_DIR)/%.o : $(CURR_DIR)/%.cpp
	@mkdir -p $(dir $@)
	$(Q)$(CP) $(CFLAGS) -std=gnu++11 $(INCLUDE) -c $< -o $@

$(LOCAL_TARGET): $(TAR_DIR)/$(LOCAL_TARGET)
$(TAR_DIR)/$(LOCAL_TARGET): $(OBJS_C) $(OBJS_CPP)
	$(call create-dir, $(TAR_DIR))
	$(Q)$(CP) $^ -o $@ $(EXTLIBS) $(LDFLAG)
	$(call info-g," Build $@ Done.")

$(call add-target-into-build, $(LOCAL_TARGET))

 

你可能感兴趣的:(调试通过的自动化 Makefile 参考)