一個簡單的通用Makefile模板

供寫小程序的時候使用

可以隨意的修改文件名稱

隨意的增刪文件、目錄

隨意的調整文件的目錄層次

不編譯某個.c文件時將其改個後綴名即可

不能有重複的文件名稱

 

# [email protected]

AS      = as
LD      = ld
CC      = gcc
CPP     = $(CC) -E
AR      = ar
NM      = nm

# 程序的默認名稱
TARGET = prog

# 命令行中使用p=X或P=X修改默認程序名稱
ifeq ("$(origin p)", "command line")
TARGET = $(p)
endif

ifeq ("$(origin P)", "command line")
TARGET = $(P)
endif

DIRS = $(shell find . -type d)

# 找出所有的.c .h .a .so文件及目錄
CFILES_DIR 	= $(shell find . -type f -name "*.c")
CFILES 		= $(notdir $(CFILES_DIR))

HFILES_DIR 	= $(shell find . -type f -name "*.h")
HFILES 		= $(notdir $(HFILES_DIR))
HDIRS		= $(sort $(dir $(HFILES_DIR)))

AFILES_DIR 	= $(shell find . -type f -name "lib*.a")
AFILES		= $(notdir $(AFILES_DIR))
ADIRS		= $(sort $(dir $(AFILES_DIR)))

SOFILES_DIR = $(shell find . -type f -name "lib*.so")
SOFILES		= $(notdir $(SOFILES_DIR))
SODIRS		= $(sort $(dir $(SOFILES_DIR)))

# 包含所有含有.h文件的目錄
INCLUDES += $(HDIRS:%=-I%)

$(warning INCLUDES : [ $(INCLUDES) ])

CFLAGS 	+= $(INCLUDES)

# 編譯標誌
CFLAGS 	+= -Wall -Werror
CFLAGS 	+= -g -MD -O2 -static

# 含有.a .so文件的目錄
LDFLAGS += $(ADIRS:%=-L%)
LDFLAGS += $(SODIRS:%=-L%)

# 引用庫文件
LDFLAGS += $(AFILES:lib%.a=-l%)
LDFLAGS += $(SOFILES:lib%.so=-l%)

LDFLAGS += -lpthread

$(warning LDFLAGS : [ $(LDFLAGS) ])

# 包含所有的目錄
VPATH = $(DIRS)

# 所有的.c文件
SOURCES = $(CFILES)

$(warning SOURCES : [ $(SOURCES) ])

# 目標及依賴
OBJS	= $(SOURCES:%.c=obj/%.o)
DEPS 	= $(SOURCES:%.c=obj/%.d)

###########################################################

.PHONY : all clean cleanall

all : $(TARGET)

$(TARGET) : $(OBJS)
	@echo
	@echo "Linking..."
	@echo
	$(CC) $(LDFLAGS) $^ -o $@
	@echo
	@echo "enjoy < $(TARGET) > Good Luck."
	@echo

obj/%.o : %.c
	@mkdir -p obj
	$(CC) $(CFLAGS) -c $< -o $@

clean :
	rm -rf $(OBJS) $(DEPS) obj

cleanall :
	rm -rf $(OBJS) $(DEPS) obj $(TARGET)

# 包含生成的依賴關係
sinclude $(DEPS)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章