define BUILD_LIBRARY $(if $(wildcard $@),@$(RM) $@) $(if $(wildcard ar.mac),@$(RM) ar.mac) $(if $(filter %.a, $^), @echo CREATE $@ > ar.mac @echo SAVE >> ar.mac @echo END >> ar.mac @$(AR) -M < ar.mac ) $(if $(filter %.o,$^),@$(AR) -q $@ $(filter %.o, $^)) $(if $(filter %.a, $^), @echo OPEN $@ > ar.mac $(foreach LIB, $(filter %.a, $^), @echo ADDLIB $(LIB) >> ar.mac ) @echo SAVE >> ar.mac @echo END >> ar.mac @$(AR) -M < ar.mac @$(RM) ar.mac ) endef $(TargetDir)/$(TargetFileName):$(OBJS) $(BUILD_LIBRARY)
这是一段生成静态库的makefile脚本。
入口在最后两行, $(TargetDir) 和 $(TargetFileName) 分别指出了目标目录和目标文件名称,即我们要生成的库文件的存放目录和库文件的名字。
$(OBJS)是库文件所依赖的obj文件,$(BUILD_LIBRARY)则是定义了一个相当于C语言的宏。生成目标库文件时会执行这一段命令。这段宏定义从 define BUILD_LIBRARY开始,到endef结束。
$(if $(wildcard $@),@$(RM) $@)这一句查找目标名称相同的文件,找到则删除。
$(if $(wildcard ar.mac),@$(RM) ar.mac)查找ar.mac文件,找到删除。
$(if $(filter %.a, $^), @echo CREATE $@ > ar.mac @echo SAVE >> ar.mac @echo END >> ar.mac @$(AR) -M < ar.mac )
在依赖目标中找后缀名是.a的文件,如果找到则创建名称为目标库文件的空文件。
$(if $(filter %.o,$^),@$(AR) -q $@ $(filter %.o, $^))在依赖目标中找后缀名是.o的文件,并利用ar命令逐个加入到目标库文件。