
FFMPEGPARTS_ALL = libavfilter libavformat libavcodec libswscale libswresample libavutil
###变量part 列表FFMPEGPARTS_ALL ,最后执行$(if $(wildcard $(DT_FFMPEG_ANDROID_DIR)/lib), $(part))
###$(if $(wildcard $(DT_FFMPEG_ANDROID_DIR)/lib), $(part)) 对于$(DT_FFMPEG_ANDROID_DIR)/lib路径下的所有文件(夹)存在,就返回$(part),因此这里是返回子目录
FFMPEGPARTS = $(foreach part, $(FFMPEGPARTS_ALL), $(if $(wildcard $(DT_FFMPEG_ANDROID_DIR)/lib), $(part)))
####返回每个子目录下的对应目录名.a的文件
FFMPEGLIBS = $(foreach part, $(FFMPEGPARTS), $(DT_FFMPEG_ANDROID_DIR)/lib/$(part).a)
=================================
四、foreach函数
foreach函数和别的函数非常的不一样。因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照于Unix标准Shell(/bin/sh)中的for语句,或是C-Shell(/bin/csh)中的foreach语句而构建的。它的语法是:
$(foreach<var>;,<list>;,<text>;)
这个函数的意思是,把参数<list>;中的单词逐一取出放到参数<var>;所指定的变量中,然后再执行<text>;所包含的表达式。每一次<text>;会返回一个字符串,循环过程中,<text>;的所返回的每个字符串会以空分隔,最后当整个循环结束时,<text>;所返回的每个字符串所组成的整个字符串(以空分隔)将会是foreach函数的返回。
所以,<var>;最好是一个变量名,<list>;可以是一个表达式,而<text>;中一般会使用<var>;这个参数来依次枚举<list>;中的单词。举个例子:
names:=abcd
files:=$(foreachn,$(names),$(n).o)
上面的例子中,$(name)中的单词会被挨个取出,并存到变量“n”中,“$(n).o”每次根据“$(n)”计算出一个,这些以空分隔,最后作为foreach函数的返回,所以,$(files)的是“a.ob.oc.od.o”。
注意,foreach中的<var>;参数是一个临时的局部变量,foreach函数执行完后,参数<var>;的变量将不在作用,其作用域只在foreach函数当中。
============
Makefile中使用foreach生成一类规则
CSDN上,有朋友发帖问了这样一个问题(我按自己的理解翻译一下):
当前目录下有四个静态库文件:liba.alibb.alibc.alibd.a。现在想将它们做成一个动态库libp.so。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-40637-1.html
美国不敢打
拿炮轰