Makefile 模板

Makefile 自动编译目录下的源文件,支持添加头文件子目录和源文件子目录

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

#
# A smart Makefile template for GNU/LINUX programming
#
# Author: wan.xp ( googoltech DOT com)
# Date:   2018/6/1
#
# Usage:
#   $ make           Compile and link (or archive)
#   $ make clean     Clean the objectives and target.
###############################################################################


CROSS_COMPILE =
OPTIMIZE := -g
WARNINGS := -Wall -Wno-unused -Wno-format -Wno-strict-aliasing
DEFS     :=
MINIDIR = ../
EXTRA_CFLAGS := -m32  
LDFLAGS += -lpthread 


INC_DIR   =  ../inc  inc
SRC_DIR   =  ../lzs  extctrl
OBJ_DIR   = out
EXTRA_SRC =
EXCLUDE_FILES =


SUFFIX       = c cpp cc cxx
TARGET       := main.app
TARGET_TYPE  := app


#####################################################################################
#  Do not change any part of them unless you have understood this script very well  #
#  This is a kind remind.                                                           #
#####################################################################################


#FUNC#  Add a new line to the input stream.
define add_newline
$1


endef


#FUNC# set the variable `src-x' according to the input $1
define set_src_x
src-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3))


endef


#FUNC# set the variable `obj-x' according to the input $1
define set_obj_x
obj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2))


endef


#VAR# Get the uniform representation of the object directory path name
ifneq ($(OBJ_DIR),)
prefix_objdir  = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::')
prefix_objdir := $(filter-out /,$(prefix_objdir)/)
endif


GCC      := $(CROSS_COMPILE)gcc
G++      := $(CROSS_COMPILE)gcc
SRC_DIR := $(sort . $(SRC_DIR))
inc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d)


#--# Do smart deduction automatically
$(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES))))
$(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir))))
$(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f))))
$(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d))))


all_objs = $(foreach i,$(SUFFIX),$(obj-$i))
all_srcs = $(foreach i,$(SUFFIX),$(src-$i))


CFLAGS       += $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS)
TARGET_TYPE := $(strip $(TARGET_TYPE))


ifeq ($(filter $(TARGET_TYPE),so ar app),)
$(error Unexpected TARGET_TYPE `$(TARGET_TYPE)')
endif


ifeq ($(TARGET_TYPE),so)
 CFLAGS  += -fpic -m32
 LDFLAGS += -fpic -shared -m32 -Wl,--version-script=export.map -Wl,--retain-symbols-file=ar.sym
endif


PHONY = all .mkdir clean


all: .mkdir $(TARGET)


define cmd_o
$$(obj-$1): $2%.o: %.$1  $(MAKEFILE_LIST)
$(GCC) $(inc_dir) -Wp,-MT,$$@ -Wp,-MMD,$$@.d $(CFLAGS) -c -o $$@ $$<


endef
$(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir))))


ifeq ($(TARGET_TYPE),ar)
$(TARGET): AR := $(CROSS_COMPILE)ar
$(TARGET): $(all_objs)
rm -f $@
$(AR) rcvs $@ $(all_objs)
else
$(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC))
$(TARGET): $(all_objs)
$(LD) $(all_objs) $(LDFLAGS) -o $@
endif


.mkdir:
@if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi


clean:
rm -f $(prefix_objdir)*.o $(prefix_objdir)*.d $(TARGET)


install:
cp *.so /lib


-include $(patsubst %.o,%.o.d,$(all_objs))


.PHONY: $(PHONY)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值