zoukankan      html  css  js  c++  java
  • makefile笔记6

    使用条件判断,可以让 make 根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是变量和常量的值。

    一、示例

    下面的例子,判断($)(CC)变量是否“gcc”,如果是的话,则使用 GNU 函数编译目标。

    libs_for_gcc = -lgnu
    normal_libs =
    foo: $(objects)
    ifeq ($(CC),gcc)
    $(CC) -o foo $(objects) $(libs_for_gcc)
    else
    $(CC) -o foo $(objects) $(normal_libs)
    endif
    

    可见,在上面示例的这个规则中,目标“foo”可以根据变量“($)(CC)”值来选取不同的函数库来编译程序。
    我们可以从上面的示例中看到三个关键字: ifeq、 else 和 endif。 ifeq 的意思表示条件语句的开始,并指定一个条件表达式,表达式包含两个参数,以逗号分隔,表达式以圆括号括起。 else 表示条件表达式为假的情况。 endif 表示一个条件语句的结束,任何一个条件表达式都应该以 endif 结束。
    当我们的变量($)(CC)值是“gcc”时,目标 foo 的规则是:

    foo: $(objects)
    $(CC) -o foo $(objects) $(libs_for_gcc)
    

    而当我们的变量$(CC)值不是“gcc”时(比如“cc”),目标 foo 的规则是:

    foo: $(objects)
    $(CC) -o foo $(objects) $(normal_libs)当然,我们还可以把上面的那个例子写得更简洁一些:
    libs_for_gcc = -lgnu
    normal_libs =
    ifeq ($(CC),gcc)
    libs=$(libs_for_gcc)
    else
    libs=$(normal_libs)
    endif
    foo: $(objects)
    $(CC) -o foo $(objects) $(libs)
    

    二、语法

    条件表达式的语法为:

    <conditional-directive>
    <text-if-true>
    endif
    以及:
    <conditional-directive>
    <text-if-true>
    else
    <text-if-false>
    endif
    

    其中<conditional-directive>表示条件关键字,如“ifeq”。这个关键字有四种。

    1. 第一个是我们前面所见过的“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>就生效。

    2. 第二个条件关键字是“ifneq”。语法是:

    ifneq (<arg1>, <arg2>)
    ifneq '<arg1>' '<arg2>'
    ifneq "<arg1>" "<arg2>"
    ifneq "<arg1>" '<arg2>'
    ifneq '<arg1>' "<arg2>"
    

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

    3. 第三个条件关键字是“ifdef”。语法是:

    ifdef <variable-name>
    

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

    bar =
    foo = $(bar)
    ifdef foo
    frobozz = yes
    else
    frobozz = no
    endif
    

    示例二:

    foo =
    ifdef foo
    frobozz = yes
    else
    frobozz = no
    endif
    

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

    4. 第四个条件关键字是“ifndef”。其语法是:

    ifndef <variable-name>
    

    这个我就不多说了,和“ifdef”是相反的意思。
    在<conditional-directive>这一行上,多余的空格是被允许的,但是不能以[Tab]键做为开始(不然就被认为是命令)。而注释符“#”同样也是安全的。“else”和“endif”也一样,只要不是以[Tab]键开始就行了。
    特别注意的是, make 是在读取 Makefile 时就计算条件表达式的值,并根据条件表达式的值来选择语句,所以,你最好不要把自动化变量(如“$@”等)放入条件表达式中,因为自动化变量是在运行时才有的。
    而且,为了避免混乱, make 不允许把整个条件语句分成两部分放在不同的文件中。


    参考文献 跟我一起写makefile(绝大部分内容都是copy的这篇文章,因为这篇文章写得已经很棒了)
  • 相关阅读:
    ZOJ 3765 Lights (zju March I)伸展树Splay
    UVA 11922 伸展树Splay 第一题
    UVALive 4794 Sharing Chocolate DP
    ZOJ 3757 Alice and Bod 模拟
    UVALive 3983 捡垃圾的机器人 DP
    UVA 10891 SUM游戏 DP
    poj 1328 Radar Installatio【贪心】
    poj 3264 Balanced Lineup【RMQ-ST查询区间最大最小值之差 +模板应用】
    【转】RMQ-ST算法详解
    poj 3083 Children of the Candy Corn 【条件约束dfs搜索 + bfs搜索】【复习搜索题目一定要看这道题目】
  • 原文地址:https://www.cnblogs.com/li--chao/p/9535464.html
Copyright © 2011-2022 走看看