Linux - 通用Makefile文件

通过shell指令和Makfile命令,创建通用的C/C++ makefile。需在当前文件夹创建bin,obj,lib三个子文件夹。

makefile文件会自动搜索当前文件夹及其子文件夹中的C/C++文件。其中bin文件夹保存生成的可执行文件myapp,obj文件夹保存生成的中间文件*.o,lib保存需要的库文件。

###############################
# Should create dir bin,obj,lib
# Created by 
# 2016/06/14
###############################

DIR_INC=.
DIR_SRC=.
DIR_BIN=./bin
DIR_OBJ=./obj
DIR_LIB=./lib

sources_all := $(shell find . -name "*.c" -o -name "*.cpp" -o -name "*.h")
sources_c   := $(filter %.c, $(sources_all))
sources_h   := $(filter %.h, $(sources_all))

INC_HEADER := $(sort $(dir $(sources_h)))
DIR_INC := $(strip $(subst / ./,:./,$(INC_HEADER)))
DIR_INC += #add a NULL on trail
DIR_INC := $(strip $(subst / , ,$(DIR_INC)))

VPATH=$(DIR_INC)
VPATH_INC=$(patsubst %,-I%,$(subst :, ,${VPATH}))

SRC=$(sources_c)

CLRDIR=$(notdir ${SRC})
OBJ=$(patsubst %.c,${DIR_OBJ}/%.o,$(CLRDIR))

CC =ccache arm-linux-gnueabihf-gcc

LD =ccache arm-linux-gnueabihf-gcc

LDFLAGS = -v -lgcc -lstdc++ -lm -lc -lgcc_s 

LDFLAGS += -L${DIR_LIB} -Wl,-rpath,`pwd`/${DIR_LIB}

TARGET=myapp

BIN_TARGET=${DIR_BIN}/${TARGET}


.PHONY : clean rebuild all

all: $(BIN_TARGET) 

%.d:%.c 
    set -e; rm -f $@; \ $(CC) -MM $(VPATH_INC) $< > $@.$$$$; \ 
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ 
    rm -f $@.$$$$
    
include $(SOURCES:c=.d)
    
$(BIN_TARGET):$(OBJ)
    $(LD) $(LDFLAGS) -o $@ $^ -lpthread -lm
    

${DIR_OBJ}/%.o:${DIR_SRC}/%.c
    $(CC) $(VPATH_INC) -c $< -o $@ 



clean:
    rm -rf $(DIR_OBJ)/*.o $(BIN_TARGET)

rebuild: clean all