转自:http://blog.csdn.net/absurd/archive/2006/03/23/636418.aspx


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

转载于:https://www.cnblogs.com/itech/archive/2009/08/10/1542917.html

Makefile与Shell的问题相关推荐

  1. Makefile和shell脚本调用上的一些总结

    大家都知道在Makefile可以调用shell脚本,但是Makefile和shell脚本是不同的.本文试着介绍一下Makefile和shell脚本的不同. 1.在Makefile中只能在target中 ...

  2. Makefile与shell脚本区别

    在Makefile可以调用shell脚本,但是Makefile和shell脚本是不同的.本文试着归纳一下Makefile和shell脚本的不同. 1. shell中所有引用以$打头的变量其后要加{}, ...

  3. 【Makefile】Makefile与shell命令为何总是藕断丝连?

    博主最近在项目实践过程中,需要深度定制项目的Makefile,其中有些复杂的流程必须得借助shell脚本才能高效地完成,为此博主特意深入学习了在Makefile种调用shell命令的方法. 大家都知道 ...

  4. Makefile和Shell学习笔记

    Makefile makefile定义了一系列的规则来指定文件的编译过程和一些复杂的功能操作.makefile带来的好处就是--"自动化编译",通过make命令,整个工程完全自动编 ...

  5. makefile 和shell文件相互调用

    shell 文件内调用makefile文件: #!/bin/bash cd ctemplate-2.1 ./configure sudo make -f install cd ../ cd Templ ...

  6. Makefile文件和shell脚本

    1.在Makefile中只能在target中调用Shell脚本,其他地方是不能输出的.比如如下代码就是没有任何输出: VAR="Hello" echo "$VAR&quo ...

  7. makefile中的shell调用---注意事项

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

  8. Linux Shell Tips小技巧

    文章目录 sed 指定行 删除文本 替换文本 小技巧 查找N天内修改文件 Shell写R语言 makefile写shell bad interpreter错误 替换换行符为空格 压缩并打包目录 重定向 ...

  9. GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读

    自己写的bootloader可以引导kernel了,我以为曾经神秘的u-boot代码将变得毫无挑战,然事实表明u-boot作为优秀的开源代码,阅读起来还是很有挑战的,值得一读! 阅读碰到的头等问题:M ...

最新文章

  1. Sun公司开源游戏服务器Project Darkstar Server——(Sun game server , 简称 sgs)学习笔记(一):sgs简介...
  2. 一个简单的apache cgi-bin
  3. 学妹靠这个学会硬件开发入职华为,今天搞到100个免费名额!
  4. Photoshop图像修饰工具
  5. IntelliJ IDEA——提交代码到GitHub远程库
  6. 探索WebKit内核(一)------ 菜鸟起步
  7. iOS开发模式MVVM 2分离业务逻辑
  8. tomcat日志按天分割
  9. 《Linux运维实战:免费md5解密工具》
  10. 彼得林奇——如何看待股市大跌
  11. 孩子成长-跟同学相处
  12. App内嵌H5活动页面携带用户token
  13. 论文投稿指南——中国(中文EI)期刊推荐(第2期)
  14. 推荐上百本优质大数据书籍,附必读清单(大数据宝藏)
  15. 系统测试常用测试方法
  16. ubuntu16.04无法联网
  17. mysql中高阶玩法系列(八)
  18. Linux—文件系统与磁盘管理(后)
  19. java jurisdiction_Java Region.setJurisdiction方法代码示例
  20. 按以下规律将电文变成密码,将字母A变成E,a变成e,即变成其后的第四个字母

热门文章

  1. WPF - 资源收集
  2. BWA SAM文件格式
  3. python操作mongo(2)
  4. #Hive报错 WritableStringObjectInspector cannot be cast to org.apache.hadoop.hive.serde2.objectinspect
  5. 学习python第四天内容回顾
  6. Exchange 2016异地容灾系列-Exchange部署(五)
  7. 【Android学习笔记】设置App启动页
  8. iOS各平台直播SDK收费明细
  9. 25.怎样在IDEA中使用JUnit4和JUnitGenerator V2.0自动生成测试模块
  10. 网页魔法菜单(使用说明)