简单目录结构Makefile

来源:互联网 发布:网络信息安全大会 编辑:程序博客网 时间:2024/06/16 18:27

一直以来都没有写博客的习惯,这就算是一个简单的开始吧,记录下学习的点滴。

首先说明下用到的函数:

$(notdir <names...>)  

从文件名序列<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))))endefMODULE_PATH=$(call current_path)#指定编译器CC=g++#文件类型为C文件,也可为cpp文件SRCTYPE:=cpp#存放目标文件的相对路径(当前目录为Makefile文件存放的目录),最后不要打斜杠OBJDIR=$(MODULE_PATH)/obj#生成的可执行文件TARGET=$(OBJDIR)/enc.exe#源文件搜索路径,以冒号隔开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:cleanclean:-rm -r $(OBJDIR)


0 0
原创粉丝点击