在Android.mk中百分比符号(%)是什么意思?

在Android.mk中百分比符号(%)是什么意思?,android,makefile,android-ndk,Android,Makefile,Android Ndk,在大多数Android.mk文件中,我发现一行运行如下内容: LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) file name: /Users/Jeff/dev/path/to/program.c pattern: /Users/Jeff/dev/% 我知道此行采用:=右侧的表达式,并将其分配给符号LOCAL\u SRC\u FILES。我知道$(LOCAL\u PATH)采用LOCAL\u PATH符号的值。但我还有两个问题: %=

在大多数Android.mk文件中,我发现一行运行如下内容:

LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
file name: /Users/Jeff/dev/path/to/program.c
  pattern: /Users/Jeff/dev/%
我知道此行采用
:=
右侧的表达式,并将其分配给符号
LOCAL\u SRC\u FILES
。我知道
$(LOCAL\u PATH)
采用
LOCAL\u PATH
符号的值。但我还有两个问题:

  • %=%
    部分是关于什么的
  • 在更广泛的
    $(文件列表:…)
    表达式中嵌套符号
    $(本地路径)
    有什么意义
  • 这是一种普通的makefile语法(我对makefile不太熟悉)还是其他什么?在哪里可以找到这种语法的指南?(不要告诉我指南:它不处理%符号。)

    示例值可能有助于我们讨论这一点。假设
    $(本地路径)
    /Users/Jeff/dev/
    。假设
    $(文件列表)
    没有进一步复杂化,它是
    /Users/Jeff/dev/aaa.c/Users/Jeff/dev/bbb.c/Users/Jeff/dev/ccc
    。上述赋值如何为
    LOCAL\u SRC\u文件
    生成有用的值?

    这是一种语法,用于替换字符串变量的值。在本例中,获取一个字符串列表,对于以
    /Users/Jeff/dev/
    开头的每个字符串,请将前缀去掉


    这个技巧通常在Android.mk中使用,因为NDK希望本地_SRC_文件中的文件名与本地_路径相对。

    Android makefiles打算使用。该文档是可用的,并且应该随您的发行版一起提供

    你要问的语法是;基本上,
    %
    是一个匹配零个或多个字符的通配符,左侧的匹配项替换为右侧的匹配项

    因此
    $(文件列表:$(本地路径)/%=%)
    文件列表
    变量值的开头删除字符串
    $(本地路径)/
    (如果有;如果没有,则不进行更改)。

    如果查看
    make
    文档的部分,文档会向您介绍
    %
    字符。例如,这里有一条规则:

    %.o : %.c
         recipe
    
    该规则告诉
    make
    如何创建任何
    .o
    文件:make应该查找
    .c
    文件并对其应用配方。在配方中,您可以使用
    $
    
    foo = a.o b.o c.o
    bar := $(foo:%.o=%.c)
    
    $(patsubst pattern,replacement,text)   
    
    $(var:pattern=replacement)
    
    $(FILE_LIST:$(LOCAL_PATH)/%=%)
    
    var         => FILE_LIST
    pattern     => /Users/Jeff/dev/%   # $(LOCAL_PATH) is /Users/Jeff/dev/
    replacement => %
    
    /Users/Jeff/dev/path/to/program.c
    
    file name: /Users/Jeff/dev/path/to/program.c
      pattern: /Users/Jeff/dev/%