`
mmdev
  • 浏览: 13139417 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    shell脚本与Makefile区别.docx

    "shell脚本与Makefile区别" shell 脚本和 Makefile 是两个不同的工具,它们都用于自动化构建和编译过程,但是它们有很大的不同之处。本文将详细介绍 shell 脚本和 Makefile 的区别。 首先,shell 脚本和 Makefile ...

    Linux makefile 和shell文件相互调用实例详解

    ### Linux Makefile与Shell文件相互调用实例详解 在Linux环境下,Makefile和Shell脚本都是非常重要的工具。Makefile主要用于构建项目,而Shell脚本则更侧重于执行一系列任务或命令。本文将详细介绍如何在Linux环境...

    shell-and-Makefile.rar_makefile_makefile shell_shell_shell Makef

    1. **目标与依赖**: Makefile中的每个目标(target)都有可能依赖于其他文件。当依赖文件改变时,make工具会自动更新目标。 2. **规则**: 规则由目标、依赖项和命令三部分组成,形如`target: dependency... command......

    Linux Makefile与Shell的问题

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

    bash shell自动生成Makefile

    bash shell自动生成Makefile

    makefile shell

    `Makefile`与`Shell`结合使用: 1. **调用Shell命令**:`Makefile`可以直接执行`Shell`命令,通过`$(shell command)`获取命令的输出,或者在规则中直接书写命令。 2. **构建过程**:通常`Makefile`会使用`Shell`脚本...

    18. Linux开发-Makefile规则与Shell脚本语言.pdf

    在Linux开发中,掌握Makefile规则和Shell脚本语言是非常重要的技能。让我们深入探讨这些知识点。 首先,关于静态库和动态库,静态库(.a文件)在编译时会将相关的函数代码直接链接到目标程序中,形成一个独立的可...

    Makefile写法及自动化工具

    在【部分内容】中,提到了Makefile与Shell脚本的异同。两者都是文本文件,都可以执行Shell命令和定义变量,但解释器不同,Shell脚本由Shell解释,而Makefile由make解释。此外,Makefile以规则为基础,而Shell脚本以...

    8_Makefile的使用和编写.pdf

    6. Makefile与Shell脚本的异同:Makefile与Shell脚本都是文本文件格式的脚本,但它们的解释器不同。Shell脚本由对应Shell程序解释,而Makefile由make程序解释。在格式上,Shell脚本以命令行为基本单位,Makefile以...

    Shell命令解释器

    4、 支持前后台作业,提供作业控制功能,包括打印作业的清单,改变当前运行作业的前/后台状态,以及控制作业的挂起、中止与继续运行; 5、 使用Make工具建立工程; 6、 使用调试器gdb来调试程序;

    简单makefile的教程

    ### 知识点详解 #### 1....以上是对 Makefile 的一个全面概述,包括其背景、工作原理、与 Shell 脚本的区别以及具体的使用方法等。通过理解和掌握 Makefile,开发者可以更加高效地管理和编译大型项目。

    Makefile自动化脚本,运行该脚本可直接自动生成Makefile文件

    7. **shell脚本与Makefile结合**:通过Shell脚本自动化生成Makefile,可以简化手动维护Makefile的工作,尤其在大型项目中,依赖关系复杂,这样的自动化工具非常实用。 8. **C语言编程**:`main.c`是C语言的主程序...

    Linux的常用命令cat、sed、zip等用法,以及shell编程的基本语法,以及makefile编写方式等等

    Shell是Linux系统的命令解释器,允许用户通过命令行与系统交互。在shell脚本中,你可以定义变量、执行运算、控制流程、使用正则表达式,并调用内置的命令。例如,`cat`用于合并和查看文件内容,`more`用于分页查看...

    SONiC项目的Linux内核驱动程序_Makefile_Shell_下载

    (更多详情、使用方法,请下载后细读README.md...\n内核配置更改\n与 SONiC 一起使用的 Debian 内核包括几乎所有可以在使用 Linux 的系统上找到的可用硬件。这大大增加了构建内核 Debian 映像所需的时间。由于有许多驱

    驱动模块makefile的编写

    #### 一、Makefile中`PWD=$(shell pwd)`解析 在探讨`PWD=$(shell pwd)`之前,我们首先理解`pwd`命令的含义。`pwd`(Print Working Directory)是Linux命令之一,用于显示当前工作目录的绝对路径。在开发环境中,...

    跟我一起写Makefile[陈皓]

    make是一个命令工具,它...而且在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作。Makefile(在其它的系统上可能是另外的文件名)在绝大多数的IDE 开发环境中都在使用,已经成为一种工程的编译方法。

Global site tag (gtag.js) - Google Analytics