zoukankan      html  css  js  c++  java
  • Makefile的常用语法 及 规则

    1、wildcard : 扩展通配符
    2、notdir : 去除路径

    3、patsubst :替换通配符

    4、条件表达式的语法



    =========================


    例子:
    建立一个测试目录,在测试目录下建立一个名为sub的子目录
    $ mkdir test
    $ cd test
    $ mkdir sub

    在test下,建立a.c和b.c ,在sub目录下,建立sa.c和sb.c

    建立一个简单的Makefile
    src=$(wildcard *.c ./sub/*.c)
    dir=$(notdir $(src))
    obj=$(patsubst %.c,%.o,$(dir) )


    all:
        @echo $(src)
        @echo $(dir)
        @echo $(obj)
        @echo "end"

    执行结果分析:
    第一行输出:

    a.c b.c ./sub/sa.c ./sub/sb.c

    wildcard把 指定目录 ./ 和 ./sub/ 下的 所有后缀是c的文件 全部 展开

    第二行输出:
    a.c b.c sa.c sb.c
    notdir把展开的文件的路径 去除掉

    第三行输出:
    a.o b.o sa.o sb.o

    在$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的变量,符合后缀是.c的全部替换成.o,

    或者可以使用
    obj=$(dir:%.c=%.o)
    效果也是一样的。



    ========================

    4、条件表达式的语法


    ifeq  这个关键字有四个。

    第一个是我们前面所见过的“ifeq”

    ifeq (<arg1>, <arg2>)

    ifeq '<arg1>' '<arg2>'

    ifeq "<arg1>" "<arg2>"

    ifeq "<arg1>" '<arg2>'

    ifeq '<arg1>' "<arg2>"

    比较参数“arg1”和“arg2”的值是否相同。当然,参数中我们还可以使用make的函数。如:

    ifeq ($(strip $(foo)),)

    <text-if-empty>

    endif

    这个示例中 使用了“strip”函数,如果这个函数的返回值是空(Empty),那么<text-if-empty>就生效


    第二个条件关键字是“ifneq”

    ifneq (<arg1>, <arg2>)

    ifneq '<arg1>' '<arg2>'

    ifneq "<arg1>" "<arg2>"

    ifneq "<arg1>" '<arg2>'

    ifneq '<arg1>' "<arg2>"

    其比较参数“arg1”和“arg2”的值是否相同,如果不同,则为真。和“ifeq”类似。


    第三个条件关键字是“ifdef”

    ifdef <variable-name>

    如果变量<variable-name>的值非空,不为空 表达式为真。否则,表达式为假。当然,<variable-name>同样可以是一个函数的返回值。注意,ifdef只是测试一个变量是否有值其并不会把变量扩展到当前位置。还是来看两个例子:

    示例一:

    bar =

    foo = $(bar)

    ifdef foo

    frobozz = yes

    else

    frobozz = no

    endif


    all:
        @echo frobozz=$(frobozz)

    执行 make  后,打印出来 frobozz=yes


    示例二:

    foo =

    ifdef foo

    frobozz = yes

    else

    frobozz = no

    endif


    all:
        @echo frobozz=$(frobozz)

    第一个例子中,“$(frobozz)”值是“yes”,第二个则是“no”。


    第四个条件关键字是“ifndef”

    ifndef <variable-name>

    这个我就不多说了,和“ifdef”是相反的意思。

    =====================================







  • 相关阅读:
    Windows 7/8 删除IE临时文件,包括Cookie的批处理
    SQL Server 2005/2008/2008R2/2012 删除登录名的步骤
    NetAdvangate Infragisticss 控件在工程移动到别的机器上,引用失效问题
    如果一个主板有多个BIOS更新包,则只需要更新最新的包即可。
    Intel存储技术软件的兼容性问题,造成磁盘IO不稳,卡死系统
    汤姆大叔JavaCript系列4阅读笔记
    IDL(接口描述语言)
    document.defaultView.getComputedStyle() 的使用
    汤姆大叔JavaCript系列1阅读笔记
    汤姆大叔JavaCript系列10阅读笔记
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744830.html
Copyright © 2011-2022 走看看