zoukankan      html  css  js  c++  java
  • Makefile 中:= ?= += =的差别 和条件运行

    一:在Makefile中常常看到obj-m    := scull.o和KERNELDIR ?= /lib/modules/等不同的赋值方式,如今总结他们的差别:

    = 是最主要的赋值
    := 是覆盖之前的值
    ?= 是假设没有被赋值过就赋予等号后面的值
    += 是加入等号后面的值

    例:

    1、“=”

          make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。

    看样例:

                x = foo
                y = $(x) bar
                x = xyz

          在上例中,y的值将会是 xyz bar 。而不是 foo bar 。

          2、“:=”

          “:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的终于值。

                x := foo
                y := $(x) bar
                x := xyz

          在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。

    二:条件推断

    例:

    对变量“CC”进行推断。值假设是“gcc”那么在进行程序连接时使用库“libgnu.so”或者“libgnu.a”,否则不链接不论什么库

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

    在上例中,条件语句中使用到了三个keyword:“ifeq”、“else”和“endif”。当中:

    1.       ifeq”表示条件语句的開始。并指定了一个比較条件(相等)。之后是用圆括号括包围的、使用逗号“,”切割的两个參数。和keyword“ifeq”用空格分开。參数中的变量引用在进行变量值比較时被展开。“ifeq”之后就是当条件满足make须要运行的,条件不满足时忽略。

    2.       else”之后就是当条件不满足时的运行部分。

    不是全部的条件语句都须要此部分。

    3.       endif”表示一个条件语句的结束,不论什么一个条件表达式都必须以“endif”结束。

    keyword1:ifeq

    通常我们会使用它来推断一个变量的值是否为空(不是不论什么字符)。參数值可能是通过引用变量或者函数得到的。因而在展开过程中可能造成參数值中包括空字符(空格等)。一般在处理这样的情况时我们使用make的“strip”函数(參考文本处理函数一节)来对它进行处理,去掉变量值中的空字符。

    格式为:

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

    TEXT-IF-EMPTY

    endif

    这样。即就是在“$(foo)”中存在若干前导和结尾空格,make在解析Makefile时“TEXT-IF-EMPTY”也会被作为运行的一部分。


    keyword2:ifneq

    `ifneq (ARG1, ARG2)'

    keyword“ifneq”实现的条件推断语句和“ifeq”相反。

    首先替换并展开“ARG1”和“ARG1”,对它们的值进行比較。假设不同样(条件为真)则将true作为make要运行的一部分,否则将false作为make要运行的一部分。


    keyword3:ifdef

    keyword是“ifdef”用来推断一个变量是否定义。

    格式为:

    `ifdef VARIABLE-NAME'

    假设变量“VAEIABLE_NAME”的值非空,那么表达式为真,将“TEXT-IF-TRUE”作为make要运行的一部分。

    否则,表达式为假。假设存在“TEXT-IF-FALSE”。就将它作为make要运行一部分。当一个变量没有被定义时,它的值为空。

    “VARIABLE-NAME”能够是变量或者函数的引用。

    对于“ifdef”须要说明的是:ifdef仅仅是測试一个变量是否有值。其并不会对变量进行替换扩展来推断变量的值是否为空。对于变量“VARIABLE-NAME”,除了“VARIABLE-NAME=”这样的情况以外。使用其他方式对它的定义都会使“ifdef”返回真。就是说,即使我们通过其他方式(比方,定义它的值引用了其他的变量)给它富了一个空值,“ifdef”也会返回真。我们来看一个样例

    例1:

    bar =

    foo = $(bar)

    ifdef foo

    frobozz = yes

    else

    frobozz = no

    endif

    2

    foo =

    ifdef foo

    frobozz = yes

    else

    frobozz = no

    endif

    1中的结果是:“frobozz = yes”;而例2的结果是:“frobozz = no”。其原因就是在例1中。变量“foo”的定义是“foo = $(bar)”。

    尽管变量“bar”的值为空,可是“ifdef”推断的结果是真。因此当我们须要推断一个变量的值是否为空的情况时。须要使用“ifeq”(或者“ifneq”)而不是“ifdef”。可參考前两个小节的内容。

    keyword4:ifndef

    keyword“ifndef”实现的功能和“ifdef”相反。格式为:

    `ifndef VARIABLE-NAME'

    这个就不具体讨论了。它的功能就是实现了和“ifdef”相反的条件推断。

     

    在“CONDITIONAL-DIRECTIVE”这一行上,能够以若干个空格開始,make处理时会被忽略这些空格。但不能以[Tab]字符做为開始(不然就被觉得是命令)。条件推断语句中,在除keyword(包含“endif”)之前、和条件表达式的參数中之外。其它不论什么地方都能够使用多个空格或[Tab]字符,它不会影响条件推断语句的功能。相同行尾也能够使用凝视(“#”開始直到一行的结束)。

    else”和“endif”也是条件推断语句的一部分。在书写时它们都是没有不论什么參数的,能够以多个空格開始(相同不能以[Tab]字符開始)多个空格或[Tab]字符结束。行尾相同能够有凝视内容。

    make读取makefile文件时计算表达式的值。并依据表达式的值决定推断语句中那一部分被作为此Makefile所要运行的内容(选择符合条件的语句)。因此在条件表达式中不能使用自己主动化变量,自己主动化变量在规则命令运行时才有效。更不能将一个完整的条件推断语句分写在两个不同的makefile文件里,当中在某一个makefile文件使用指示符“include”包括另外一个。



  • 相关阅读:
    angularjs 做不到实时脏值查询
    移动端遮罩层,放在页面最上面,并且不能滚动
    angularjs 与 UEditor开发,添加directive,保证加载顺序正常
    ajaxfileupload.js上传文件兼容IE7及以上版本
    IE9及以下版本获取上传文件的大小
    java 中的 i++ 和 ++i
    java foreach实现原理
    怎样将未分配的磁盘空间,合并到指定盘符上面
    电脑将系统之间调整为最大时间之后,重新启动电脑,屏幕一直狂闪
    变量
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5094174.html
Copyright © 2011-2022 走看看