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”是相反的意思。

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







  • 相关阅读:
    Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
    用户画像——“打标签”
    python replace函数替换无效问题
    python向mysql插入数据一直报TypeError: must be real number,not str
    《亿级用户下的新浪微博平台架构》读后感
    【2-10】标准 2 维表问题
    【2-8】集合划分问题(给定要分成几个集合)
    【2-7】集合划分问题
    【2-6】排列的字典序问题
    【2-5】有重复元素的排列问题
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744830.html
Copyright © 2011-2022 走看看