商务合作加Q:411239339

makefile中的shell调用—注意事项

浏览:413次阅读
没有评论

共计 1885 个字符,预计需要花费 5 分钟才能阅读完成。

在之前一次编写 makfile 时候,有看到相关的 makefile 中使用 $$ 来引用变量,而且尝试后发现 $$ 使用居然和 ${}有类似的功能。当时也没具体追究相关的用法,当然刚才所说的都是错误的观念


$$:在 makefile 中会被替换成一个 $。

    相关资料是这么描述的:makefile 中变量在声明时需要赋予初值,在使用时,需要在使用的变量前加 "$" 符号,但是最好使用 "()" 或者 "{}" 将变量包括起来。如果想使用真实的 "$" 符号,需要用 "$$" 来表示


在 makefile 中使用 shell:

1. 使用 makefile 中的 $(shell ...) eg:CUR_DIR=$(shell pwd)

2. 直接使用 shell。在此有几点需要注意的:

  • shell 命令必须是在规则里面(可以参考以下例 1)
  • shell 命令在 makefile 调用时候每行 shell 都是一个单独的进程。上一行定义的变量在下一行是无效的(参考例 2)
  • makefile 调用 shell 时候 (其实在执行时候都会有这个动作,不光光是 shell),会对变量进行替换:如果是 makefile 中定义的变量(使用 $() 来引用的)会被替换成变量的值;如果是 $$ 符号,会替换成 $。然后传给 shell 来执行


--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------

以下内容转自:Makefile 与 Shell 的问题

大概只要知道 Makefile 的人,都知道 Makefile 可以调用 Shell 脚本。但是在实际使用时,并不那么简单,一些模棱两可的地方可能会让你抓狂。你若不信,可以先看几个例子,想象一下这些这些例子会打印什么内容,记下你想象的结果,然后在计算机上运行这些例子,对照看一下。

 

示例一:

if ["$(BUILD)" = "debug" ]; then  echo "build debug"; else echo "build release"; fi

all:

    echo "done"

示例二:

all:

    @CC=arm-linux-gcc

    @echo $(CC)

示例三:

CC=arm-linux-gcc

all:

    @echo $(CC)

示例四:

SUBDIR=src example

all:

    @for subdir in $(SUBDIR); /

    do/

        echo "building" $(subdir); /

    done

 

 

说明:

1.         Shell脚本在 target 里才有效,其它地方都被忽略掉了。所以示例一中,”build debug”之类的字符串根本打印不出来。示例一的正确写法是:

示例一:

all:

    if ["$(BUILD)" = "debug" ]; then  echo "build debug"; else echo "build release"; fi

    echo "done"

 

2.         make把每一行 Shell 脚本当作一个独立的单元,它们在单独的进程中运行。示例二中,两行 Shell 脚本在两个莫不相干的进程里运行,第一个进程把 CC 设置为 arm-linux-gcc,第二个进程是不知道的,所以打印的结果自然不是arm-linux-gcc 了。示例二的正确写法是:

示例二:

all:

    @CC=arm-linux-gcc; echo $(CC)

或者:

all:

@CC=arm-linux-gcc; /

echo $(CC)

 

3.         make在调用 Shell 之前先进行预处理,即展开所有 Makefile 的变量和函数。这些变量和函数都以 $ 开头。示例三中,Shell拿的脚本实际上是echo arm-linux-gcc,所以打印结果正确。

 

4.         make预处理时,所有以 $ 开头的,它都不会放过。要想引用 Shell 自己的变量,应该以 $$ 开头。另外要注意,Shell自己的变量是不需要括号的。示例四的正确写法是:

示例四:

SUBDIR=src example

all:

    @for subdir in $(SUBDIR); /

    do/

        echo "building" $$subdir; /

    done

正文完
扫码赞助
post-qrcode
 0
果子
版权声明:本站原创文章,由 果子 于2016-03-02发表,共计1885字。
转载说明:除特殊说明外本站文章皆由果较瘦原创发布,转载请注明出处。