Linux工程的编译要用到make工具,平台不一样,只是工具链不同,但Makefile是编译系统的关键所在,因此掌握Makefile的编写规则是非常重要的。尽管有了cmake这样更容易使用的编译工具,但这并不意味着就不需要学习Makefile了。
最近本人在研究ffmpeg的编译系统Makefile时,看到里面有一个$(1)的变量,一时没明白是什么,总觉得有点似曾相识,这和shell脚本中的$0、$1、$2很像,是传递的参数?但Makefile调用的时候不能传递参数,因为会被当成make的目标。经过一番琢磨,终于明白这是Makefile中定义的函数的参数传递形式。
这是ffmpeg/fftools/Makefile中的截取片段:
define DOFFTOOL
OBJS-$(1) += fftools/cmdutils.o fftools/opt_common.o fftools/$(1).o $(OBJS-$(1)-yes)
ifdef HAVE_GNU_WINDRES
OBJS-$(1) += fftools/fftoolsres.o
endif
$(1)$(PROGSSUF)_g$(EXESUF): $$(OBJS-$(1))
$$(OBJS-$(1)): | fftools
$$(OBJS-$(1)): CFLAGS += $(CFLAGS-$(1))
$(1)$(PROGSSUF)_g$(EXESUF): LDFLAGS += $(LDFLAGS-$(1))
$(1)$(PROGSSUF)_g$(EXESUF): FF_EXTRALIBS += $(EXTRALIBS-$(1))
-include $$(OBJS-$(1):.o=.d)
endef
$(foreach P,$(AVPROGS-yes),$(eval $(call DOFFTOOL,$(P))))
这里面调用了定义的DOFFTOOL函数,$(1)是函数的第一个参数,$(2)是其第二个参数,依此类推,
而$(0)是函数本身。
如果还看不明白,就自己写一个Makefile试试吧,下面是一个Makefile的例子:
define DOFFTOOL
@echo $(0)
@echo $(1)
@echo $(2)
endef
all:
$(call DOFFTOOL,ffmpeg,ffplay)
把它保存为Makefile文件,执行make,看看打印出来什么,就明白了这是怎么一回事了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)