• $^,$@,$?,$<,$(@D),$(@F) of makefile


    makefile下$(wildcard $^),$^,$@,$?,$<,$(@D),$(@F)代表的不同含义

    $(filter-out $(PHONY) $(wildcard $^),$^)
    常用用法为$(wildcard *.c)
    表示列举当前目录下的所有.c文件
    这里$^因为会包含依赖的文件名,如果包含的该文件存在,那么将返回其含路径的文件名
    所以$(wildcard $^)就是用来过滤$^包含的所有文件并且该文件确实在本地存在.

    自动化变量$?代表依赖文件列表中被改变过的所有文件。
    自动化变量$^代表所有通过目录搜索得到的依赖文件的完整路径名(目录 + 一般文件名)列表。
    自动化变量$@代表规则的目标。
    自动化变量$<代表规则中通过目录搜索得到的依赖文件列表的第一个依赖文件。
    自动化变量$(@D) 
    The directory part of the file name of the target, 
    with the trailing slash removed. If the value of ‘$@’ is dir/foo.o 
    then ‘$(@D)’ is dir. This value is . if ‘$@’ does not contain a slash.
    http://www.gnu.org/software/make/manual/make.html
    自动化变量$(@F)
    The file-within-directory part of the file name of 
    the target. If the value of ‘$@’ is dir/foo.o then ‘$(@F)’ is foo.o. 
    ‘$(@F)’ is equivalent to ‘$(notdir $@)’. 

    4.12 静态模式
    静态模式规则是这样一个规则:
    规则存在多个目标,并且不同的目标可以根据目标文件的名字来自动构造出依赖文件。
    静态模式规则比多目标规则更通用,它不需要多个目标具有相同的依赖。但是静态模式规则中的依赖文件必须是相类似的而不是完全相同的。

    我们来看一个例子,它根据相应的.c 文件来编译生成“foo.o”和“bar.o”文件:


    objects = foo.o bar.o
    all: $(objects)
    $(objects): %.o: %.c
    $(CC) -c $(CFLAGS) $< -o $@


    例子中,规则描述了所有的.o文件的依赖文件为对应的.c文件,对于目标“foo.o”,取其茎“foo”替代对应的依赖模式“%.c”中的模式字符“%”之后可得到目标的依赖文件“foo.c”。

    这就是目标“foo.o”的依赖关系“foo.o: foo.c”,规则的命令行描述了如何完成由“foo.c”编译生成目标“foo.o”。命令行中“$<”和“$@”是自动化变量,“$<”表示规则中的第一个依赖文件,

    “$@”表示规则中的目标文件。上边的这个规则描述了以下两个具体的规则:


    foo.o : foo.c
    $(CC) -c $(CFLAGS) foo.c -o foo.o
    bar.o : bar.c
    $(CC) -c $(CFLAGS) bar.c -o bar.o


    在使用静态模式规则时,指定的目标必须和目标模式相匹配,否则执行make时将
    会得到一个错误提示。
    如果存在一个文件列表,
    其中一部分符合某一种模式而另外一部
    分符合另外一种模式,这种情况下我们可以使用“filter”函数(可参考 第八章 make
    的内嵌函数)来对这个文件列表进行分类,在分类之后对确定的某一类使用模式规则。
    例如:
    files = foo.elc bar.o lose.o
    $(filter %.o,$(files)): %.o: %.c
    $(CC) -c $(CFLAGS) $< -o $@
    $(filter %.elc,$(files)): %.elc: %.el
    emacs -f batch-byte-compile $<
    其中;$(filter %.o,$(files))的结果为“bar.o lose.o”“filter”函数过滤不符合“%.o”

    模式的文件名而返回所有符合此模式的文件列表。
    第一条静态模式规则描述了这些目标
    文件是通过编译对应的.c 源文件来重建的。同样第二条规则也是使用这种方式。
    我们通过另外一个例子来看一下自动环变量“$*”在静态模式规则中的使用方法:
    bigoutput littleoutput : %output : text.g
    generate text.g -$* > $@
    当执行此规则的命令时,
    自动环变量
    “$*”
    被展开为
    “茎” 在这里就是

    “big” “little”


    静态模式规则对一个较大工程的管理非常有用。
    它可以对整个工程的同一类文件的
    重建规则进行一次定义,而实现对整个工程中此类文件指定相同的重建规则。比如,可
    以用来描述整个工程中所有的.o 文件的依赖规则和编译命令。通常的做法是将生成同
    一类目标的模式定义在一个 make.rules 的文件中。在工程各个模块的 Makefile 中包含
    此文件。

  • 相关阅读:
    【FFT】BZOJ2179- FFT快速傅立叶
    【2-SAT(tarjan)】BZOJ1997-[Hnoi2010]Planar
    【平面图最小割】BZOJ1001- [BeiJing2006]狼抓兔子
    【序列莫队】BZOJ2038- [2009国家集训队]小Z的袜子(hose)
    【高斯消元解xor方程】BZOJ1923-[Sdoi2010]外星千足虫
    【高斯消元解xor方程组】BZOJ2466-[中山市选2009]树
    【高斯消元】BZOJ1013-[JSOI2008]球形空间产生器sphere
    【欧拉函数】BZOJ2818-GCD
    守望者的逃离
    传球游戏
  • 原文地址:https://www.cnblogs.com/986YAO/p/9856502.html
Copyright © 2020-2023  润新知