Makefile中命令的编写

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。

简述

Makefile的规则,是由依赖关系规则和命令组成的。

Makefile中所使用的命令是由 shell 命令行组成,它们是一条一条执行的。

Makefile 中的任何命令都要以tab键开始。

一行中的多个命令之间要使用分号隔开。

多个命令行之间可以有空行和注释行,在执行规则时空行会被自动忽略。

命令中出现的字符“#”到行末的内容被认为是注释。“#”可以不在此行的行首,此时“#”之前的内容不会被作为注释处理。

通常系统中可能存在不同的 shell 。但是 make 处理 Makefile 过程时,如果没有明确的指定,那么对所有规则中的命令行的解析使用bin/sh来完成。执行过程中使用的 shell 决定了规则中的命令的语法和处理机制。

命令回显

通常 make 在执行命令行之前,会把将执行的命令行输出到标准输出设备,我们称之为 "回显"。如果规则的命令行以字符“@”开始,则不会再显示这个将要被执行的命令。典型的用法是在使用echo命令输出一些信息时,在echo命令前加字符“@”。

OBJ=test main list
all:@echo $(OBJ)

执行时将会得到test main list这条输出信息。如果在执行命令之前没有字符“@”,那么make的输出将是echo test main list,即把命令也输出了。

我们在执行 make 时添加上一些参数,可以控制命令行是否输出。

(1)当使用 make 的时候机加上参数-n或者是--just-print ,执行时只显示所要执行的命令,但不会真正的执行这个命令。只有在这种情况下 make 才会打印出所有的 make 需要执行的命令,其中包括了使用的“@”字符开始的命令。这个选项对于我们调试 Makefile 非常的有用,使用这个选项就可以按执行顺序打印出 Makefile 中所需要执行的所有命令。

(2)而 make 参数-s或者是--slient则是禁止所有的执行命令的显示。就好像所有的命令行都使用“@”开始一样。

命令的执行

当规则中的目标需要被重建的时候,此规则所定义的命令将会被执行。

如果是多行的命令,则每行命令(一行可能包括多个命令,多个命令之间用分号隔开)都是在一个独立的子 shell 进程中被执行。因此执行命令时,命令行之间是相互独立的,不存在依赖。

比如说,在某一命令行使用cd命令改变目录,不会对之后的命令行的执行产生影响,也就是说之后的命令行执行的工作目录,不会是之前使用cd命令进入的那个目录。因此如果想使用命令cd,就不能把cd命令和它后面的命令放在两行来书写,而应该放在一行上用分号隔开。

实例

foo:bar/losecd bar;gobble lose >../foo

如果一个完整的shell命令行太长,不方便写在一行,那么可以使用反斜杠 (\)来对处于多行的命令进行连接,表示它是一个完整的shell命令行。例如上例也可以这样书写:

foo:bar.losecd bar; \gobble lose > ../foo

make 对所有规则的命令的解析,使用环境变量“SHELL”所指定的那个程序。在 GNU make 中,默认的程序是 “/bin/sh”。不像其他绝大多数的变量那样(只可以直接从同名的系统环境变量那里获得),make 的环境变量 “SHELL”没有使用环境变量的定义,因为系统环境变量“SHELL”指定的那个程序被用来作为用户和系统交互的接口程序,它对于不存在直接交互过程的 make 显然不合适。在 make 环境变量中,“SHELL”会被重新赋值。我们也可以在 Makefile 中明确的给它赋值,变量“SHELL“的默认值是“/bin/sh”。

并发执行命令

GNU make 支持同时执行多条命令。通常情况下,同一时刻只有一个命令在执行,下一个命令只有在当前命令结束之后才能够开始执行。

我们可以在 make 时加选项 "-j" 或者 "--jobs" ,则同一时刻可以执行多条命令。如果选项 "-j" 之后存在一个整数,其含义是同一时刻可以执行的命令行的数目。这个数字被称为“job slots”。当 "-j" 选项后没有数字时,同一时间执行的命令数目没有要求。默认的job solts的值为1,表示make将串行执行规则的命令,即同一时刻只执行一条命令。

并行执行命令所带来的问题:

  • 多个同时执行的命令的输出信息将同时被输出到终端。当出现错误时很难根据一大堆凌乱的信息来区分哪条命令执行错误。
  • 在同一时刻可能会存在多个命令执行的进程同时读取标准输入,但是对于标准输入设备来说,在同一时刻只能存在一个进程访问它。在某个时间点,make只能保证此刻正在执行的进程中的一个进程读取标准输入流,其他进程的标准输入流将设置为无效。因此在此一时刻多个执行命令的进程中只有一个进程获得标准输入,而其他需要读取标准输入流的进程由于输入流无效而导致致命的错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

走出浮躁的泥沼:浮躁的社会原因 控制好自己的物欲

http://www.nowamagic.net/librarys/veda/detail/2265现在这个社会,大家都很浮躁。简单说,因为他是消费者。 具体的逻辑推理是这样的: 1. 现在的社会是一个“富裕社会”(Affluent Society),物质极大丰富&am…

c# 连接各种数据库 Access、Server等

1.C#连接连接Access程序代码:usingSystem.Data;usingSystem.Data.OleDb;..stringstrConnection"ProviderMicrosoft.Jet.OleDb.4.0;";strConnection"Data SourceC:BegASPNETNorthwind.mdb";OleDbConnection objConnectionnewOleDbConnection(strConnection)…

make命令的参数选项

在执行 make 命令时,有时根据需要,可以添加某些参数选项。比如只打印命令但不执行命令的参数选项是 "-n" ,还有只执命令不打印命令的参数选项是 "-s",包含其它文件的路径参数选项是 "-include"等等…

〖Linux〗Kubuntu设置打开应用时就只在打开时的工作区显示

有没有遇到一种情况: 在工作区1打开了应用程序Google Chrome; 这个时间感觉它打开速度比较慢,就快捷键切换到工作区2了; 结果这个时候,Google Chrome就直接在工作区2打开,多不爽?! &…

oracle 插入含字符串

1、创建表 SQL> create table t(id number,name varchar2(20)); 表已创建。 2、常规方式插入 SQL> insert into t values(1,’a&b’); 输入 b 的值: a&b 原值 1: insert into t values(1,’a&b’) 新值 1: insert into t values(1,’aa&b’) 已创建 1 行…

认识Makefile文件

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 一、Makefile文件是什么 Makefile 文件描述了 Linux 系统下 C/C 工程文件的编译规则,比如某些文件是否需要编译、文件编译的顺序、文件间的依赖关系、文件是否需要重建等等…

搭建Spring MVC 4开发环境八步走

Spring MVC作为SpringFrameWork的产品,自诞生之日,就受到广泛开发者的关注,如今Spring MVC在Java中的发展可谓是蒸蒸日上,如今如果再有开发者说,不了解Spring MVC,或许就被人笑掉大牙。煽情的话就不说了&am…

JQ获取CKeditor的值

var editor CKEDITOR.replace("content"); editor.setData(""); alert(CKEDITOR.instances.content.getData()); var editor CKEDITOR.replace("content"); alert(editor.getData()); 转载于:https://www.cnblogs.com/Alandre/p/3405363.htm…

Makefile中变量的定义、引用与赋值

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 Makefile文件中的变量有很多种类,其意义各不相同。比如普通变量、环境变量,自动变量,模式指定变量等。 这里主要讲普通变量的定义与使用。 一、变量…

address already in use: jvm_bind

这是用Myeclipse写网上书店时遇到的错误,错误的意思是8080端口被占用,解决问题的方式是找到占用8080端口的进程关闭就可以了, 在dos下输入netstat -ano 即可查看所有的 然后根据PID关闭进程,在任务管理器中,找到进转载…

case when then的用法

用法一:等值判断,相当于switch CASE expression   WHEN value1 THEN returnValue1   WHEN value2 THEN returnValue2   WHEN value3 THEN returnValue3   ELSE defaultValue END 例子:论坛中用户的等级 create table [user] (uId int…

Makefile中的自动化变量

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 自动化变量,可以理解为由 Makefile 自动产生的变量。 在模式规则中,规则的目标和依赖的文件名代表了一类的文件。在 Makefile 中描述规则时,依赖文件…

Makefile中的文件搜索路径(VPATH和vpath)

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 前言 当源文件与 Makefile 文件的存放路径不同时,如何将源文件的路径告知Makefile文件呢? 方法有两种:一般搜索VPATH,选择搜索vpath。 两…

今天是我开通博客的第一天

The first time I regist my blog.转载于:https://www.cnblogs.com/binquan/p/3417169.html

mysql导入sql文件过大或连接超时的解决办法

原文:mysql导入sql文件过大或连接超时的解决办法 前段时间出差在现场开发的时候,导入数据库老是出问题。最后发现了一个神奇sql语句交给实施,只要导入出错就把如下语句执行就可以了。至今屡试不爽。 set global max_allowed_packet100 000 000; set glob…

Makefile中的条件判断

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 日常使用 Makefile 编译文件时,可能会遇到需要分条件执行的情况。比如在一个工程文件中可编译的源文件很多,但是它们的类型是不相同的,所以编译文件…

SSH框架介绍

SSH 为 strutsspringhibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架。 定义 集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的We…

Find Minimum in Rotated Sorted Array

Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). Find the minimum element. You may assume no duplicate exists in the array. 思路:如果中间节点的值最大,则取后半…

Makefile的伪目标

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 伪目标,它的目的并不是创建目标文件(所以称作“伪”),而是想去执行这个目标下面的命令。它有点像汇编语言里的标签。 使用伪目标的原因&…

Makefile中的文件包含

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 Makefile 中包含其他的文件,使用的关键字是 "include"。 make 读取到 "include" 关键字时,会暂停读取当前的 Makefile,转去读取…