当前位置: 首页 > news >正文

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


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/absurd/archive/2006/03/23/636418.aspx

相关文章:

  • jQuery:收集一些基于jQuery框架开发的控件/jquery插件。(2)
  • Azure设计模式之网关路由模式
  • Azure设计模式之端点监控模式
  • linux-2.6.26内核中ARM中断实现详解(3)
  • Azure设计模式之索引表
  • 你该如何填报高考志愿?
  • 网管师与网管员和 网络工程师的区别
  • Azure设计模式之领导者选举
  • 如何从零开始开发一款嵌入式产品(20年的嵌入式经验)
  • Azure设计模式之实例化视图
  • Azure设计模式之管道过滤器模式
  • 用系统函数获取当前季度
  • Azure设计模式之优先消息队列
  • Azure应用部署方式对比
  • BadImageFormatException or An attempt was made to load a program with an incorrect format
  • .pyc 想到的一些问题
  • 【mysql】环境安装、服务启动、密码设置
  • 【翻译】babel对TC39装饰器草案的实现
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 3.7、@ResponseBody 和 @RestController
  • 4个实用的微服务测试策略
  • ERLANG 网工修炼笔记 ---- UDP
  • gcc介绍及安装
  • java8 Stream Pipelines 浅析
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript实现分页效果
  • Linux各目录及每个目录的详细介绍
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • PHP的类修饰符与访问修饰符
  • storm drpc实例
  • 聊聊flink的BlobWriter
  • 浏览器缓存机制分析
  • 前端攻城师
  • 手写双向链表LinkedList的几个常用功能
  • 数据科学 第 3 章 11 字符串处理
  • 我与Jetbrains的这些年
  • RDS-Mysql 物理备份恢复到本地数据库上
  • Spring第一个helloWorld
  • ​iOS实时查看App运行日志
  • ​linux启动进程的方式
  • #微信小程序:微信小程序常见的配置传旨
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (二)正点原子I.MX6ULL u-boot移植
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET6 开发一个检查某些状态持续多长时间的类