简单⽬录结构Makefile
⼀直以来都没有写博客的习惯,这就算是⼀个简单的开始吧,记录下学习的点滴。
⾸先说明下⽤到的函数:
$(notdir &>)
从⽂件名序列<names>中取出⾮⽬录部分。⾮⽬录部分是指最后⼀个斜杠(“/”)之后的部分。返回⽂件名序列<names>的⾮⽬录部分。
⽰例: $(notdir src/hello.c girls)返回值是“hello.c girls”。
$(subst <from>,<to>,<text>)
text中和from中相同的字符⽤to中的字符代替
⽰例:$(subst do,don't,i do like you) 返回的值是i don't like you
$(var:<pattern>=<replacement>)相当于 $(patsubst <pattern>,<replacement>,$(var))
即var中满⾜pattern的部分⽤replacement部分代替
此makefile⽤于编译任意⽬录结构的源程序,使⽤时只需修改以下选项
⽰例⽬录结构:
#获得当前Makefile⽂件路径,这样就可以在其他路径中⽤make -f 调⽤此Makefile了
define current_path
$(patsubst %/,%, $(dir $(word $(words $(MAKEFILE_LIST)), $(MAKEFILE_LIST))))
endef
MODULE_PATH=$(call current_path)
#指定编译器
CC=g++
#⽂件类型为C⽂件,也可为cpp⽂件
makefile phony
SRCTYPE:=cpp
#存放⽬标⽂件的相对路径(当前⽬录为Makefile⽂件存放的⽬录),最后不要打斜杠
OBJDIR=$(MODULE_PATH)/obj
#⽣成的可执⾏⽂件
TARGET=$(OBJDIR)/
#源⽂件搜索路径,以冒号隔开
SRCDIR:= $(MODULE_PATH)/:$(MODULE_PATH)/src:
#头⽂件搜索路径,以冒号隔开
INCDIR:= $(MODULE_PATH)/inc
#编译器编译选项
CFLAGS=
#链接选项
LDFLAGS=
#静态库
STATIC_LIBS=
#---------------------------------------------------------------------------------------------------------------------------------
VPATH := $(SRCDIR):$(INCDIR)
#源⽂件集合
SRC_DIR:=$(subst :, ,$(SRCDIR))
SRC_FILES=$(SRC_DIR:%=%/*.$(SRCTYPE))
#指定编译器头⽂件路径
#subst⽤空格替换VPATH中的冒号,patsubst在subst返回的每个字符串前⾯加上-I,override 在FLAGS后⾯追加patsubst返回的字符串override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))
#把SRC_FILES下的⽂件全部展开并去掉⽂件路径
source= $(notdir $(wildcard $(SRC_FILES)))
#objs= $(patsubst %.c,$(OBJDIR)/%.o,$(source))
objs= $(source:%.$(SRCTYPE)=$(OBJDIR)/%.o)
$(TARGET): $(objs)
$(CC) -o $@ $^  $(STATIC_LIBS) $(LDFLAGS)
$(objs): $(OBJDIR)/%.o : %.$(SRCTYPE)
@mkdir -p $(OBJDIR)
$(CC) -c $(CFLAGS) $^ -o $@
.PHONY:clean
clean:
-rm -r $(OBJDIR)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。