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

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







  • 相关阅读:
    nginx能访问html静态文件但无法访问php文件
    LeetCode "498. Diagonal Traverse"
    LeetCode "Teemo Attacking"
    LeetCode "501. Find Mode in Binary Search Tree"
    LeetCode "483. Smallest Good Base" !!
    LeetCode "467. Unique Substrings in Wraparound String" !!
    LeetCode "437. Path Sum III"
    LeetCode "454. 4Sum II"
    LeetCode "445. Add Two Numbers II"
    LeetCode "486. Predict the Winner" !!
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744829.html
Copyright © 2011-2022 走看看