makefile wildcard_makefile $< $! $^_if $(wildcard

电脑杂谈  发布时间:2017-04-11 04:02:14  来源:网络整理

if $(wildcard_makefile wildcard_makefile $< $! $^

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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...