zoukankan      html  css  js  c++  java
  • GNU make manual 翻译(八十六)

    继续翻译

    4.4.3 The Function `wildcard'                        
    -----------------------------                        
                            
    Wildcard expansion happens automatically in rules.  But wildcard expansion does not normally take place when a variable is set, or inside the arguments of a function.  If you want to do wildcard expansion in such places, you need to use the `wildcard' function, like  this:                        
                            
         $(wildcard PATTERN...)                        
                            
    This string, used anywhere in a makefile, is replaced by a space-separated list of names of existing files that match one of the given file name patterns.  If no existing file name matches a pattern,then that pattern is omitted from the output of the `wildcard' function.  Note that this is different from how unmatched wildcards
    behave in rules, where they are used verbatim rather than ignored (*note Wildcard Pitfall::).                        
                            
       One use of the `wildcard' function is to get a list of all the C source files in a directory, like this:                        
                            
         $(wildcard *.c)                        
                            
       We can change the list of C source files into a list of object files by replacing the `.c' suffix with `.o' in the result, like this:                        
                            
         $(patsubst %.c,%.o,$(wildcard *.c))                          
    (Here we have used another function, `patsubst'.  *Note Functions for String Substitution and Analysis: Text Functions.)                        
                            
       Thus, a makefile to compile all C source files in the directory and then link them together could be written as follows:  
         objects := $(patsubst %.c,%.o,$(wildcard *.c))                        
                            
         foo : $(objects)                        
                 cc -o foo $(objects)                        
                            
    (This takes advantage of the implicit rule for compiling C programs, so 
    there is no need to write explicit rules for compiling the files. *Note The Two Flavors of Variables: Flavors, for an explanation of `:=', which is a variant of `='.)                        

    4.4.3 wildcard 函数      
    -----------------------------
    通配符扩展自动地在规则中发生。但是通配符扩展在变量被设置的时候,不会正常发生,通配符在函数的参数中时,扩展也不会发生。如果你想在此种场合下执行 通配符扩展,你需要使用 wildcard 函数,像下面这样:

    $(wildcard PATTERN...)
    以上的函数字符串,可以用在makefile的任何一个地方,将会被替换成为 用空格分隔的已存在文件的名称列表,只要它符合某种名称模式。如果没有可以匹配模式的文件,那么此模式被省略。请注意这个和 直接在规则里使用通配符时找不到匹配是的行为不同,那时将会不是被忽略,而是留下一字不差地保留下来。(*note Wildcard Pitfall::)

    有一个对 wildcard 函数的用法就是,获得一个 某目录下所有C 源程序的名字列表

    如下:
    $(wildcard *.c)

    我们可以改变 C 源程序文件的列表,使其转化为目标文件的列表,这要通过把 .c的后缀换成 .o 后缀来实现,像如下: 

    $(patsubst %.c,%.o,$(wildcard *.c))

    (这里我们用到了另一个函数, `patsubst'. *Note Functions for
    String Substitution and Analysis: Text Functions.)

    因此,我们可以用一个 makefile来编译一个目录下的所有的 C 源程序,并把它们链接起来,像如下:

    objects := $(patsubst %.c,%.o,$(wildcard *.c))

    foo : $(objects)
    cc -o foo $(objects)

    (这种做法,获得了隐式规则编译C 程序的好处, 因此此处也就不需要写编译文件的显式规则了。      
    *Note The Two Flavors of Variables: Flavors, for an explanation of
    `:=', which is a variant of `='.)

    后文待续

  • 相关阅读:
    PNG文件格式具体解释
    opencv2对读书笔记——使用均值漂移算法查找物体
    Jackson的Json转换
    Java实现 蓝桥杯VIP 算法训练 装箱问题
    Java实现 蓝桥杯VIP 算法训练 装箱问题
    Java实现 蓝桥杯VIP 算法训练 单词接龙
    Java实现 蓝桥杯VIP 算法训练 单词接龙
    Java实现 蓝桥杯VIP 算法训练 方格取数
    Java实现 蓝桥杯VIP 算法训练 方格取数
    Java实现 蓝桥杯VIP 算法训练 单词接龙
  • 原文地址:https://www.cnblogs.com/gaojian/p/2693371.html
Copyright © 2011-2022 走看看