make 是一个工具程序,通过读取 Makefile 文件,实现自动化软件构建。虽然现代软件开发中,集成开发环境已经取代了 make,但在 Unix 环境中,make 仍然被广泛用来协助软件开发。make 不仅仅用来编译 C/C++ 程序,还可以用来实现任何输入文件和结果文件的转化。

Makefile 语法

Makefile 文件由一组 rules (规则)构成,每个 rule 有如下形式:

targets : prerequisities
    recipe
    recipe
    recipe
  • targets:目标是文件名或操作名(也称为“伪目标”,phony target)。目标通常是一个,多个目标之间用空格分隔。
  • prerequisities:前置条件定义了构建目标文件的依赖。多个依赖文件(也可以是伪目标)用空格分隔。
  • recipe:每一行配方的起首是 tab 键,而不是空格。

如果存在 targets 同名的文件,make 不会执行。这是需要加上 .PHONY

.PHONY: clean
clean:
    rm *.o temp

1. 变量

可以在 Makefile 中使用变量。引用变量的方法是:$(变量名)

files = file1 file2
some_file: $(files)
    echo "Look at this variable: " $(files)

赋值运算符可以是:=,=:,?=,

  • = 只有在命令使用到该变量时,才执行赋值操作。在此之前,变量会原封不动地记录赋值语句右边的表达式。(recursively-expanded variable)
  • =: 赋值语句立刻执行。如果该赋值语句右边表达式中含有变量,则该变量只有定义在赋值语句之前才会被应用。(simply-expanded variable)
  • ?= 赋值前会检查变量是否已经被赋值。如果已赋值则不执行此次赋值,否则执行
# Recursively expanded variable. This will print "later" below
one = one $(later_variable)
# Simply expanded variable. This will not print "later" below
two := two $(later_variable)

later_variable = later

.PHONY: all
all:
    echo $(one)
    echo $(two)
one = hello
one ?= will not be set
two ?= will be set

.PHONY: all
all:
    echo $(one)
    echo $(two)

2. 指令

include

include 指令会使 make 程序停在当前 makefile 文件读取位置,而先去读取指定文件,再继续读。
-include 同 include,但文件不存在时不会报错

include Makefile.common

控制流指令

ifeq 如果相等
ifneq 如果不相等

ifeq ($(CC), gcc)
  libs=$(libs_for_gcc)
else
  libs=$(normal_libs)
endif

3. Recipes

回声(echoing)

make 默认会在执行前,打印这一行 recipe 后执行。但如果 recipe 是 @ 开头,则不会打印

.PHONY: assets
assets:
    @echo ">> writing assets"

4. 函数

字符操作函数

# firstword
# 打印 foo
$(firstword foo bar)

# word N
# 打印 bar
$(word 2, foo bar baz)

# wildcard FILENAMES
# 打印所有 markdown 文件,用空格隔开
$(wildcard *.md)

shell 函数

shell 函数执行 shell 后面跟着的参数,并把执行结果作为返回(command expansion)

go = $(shell go version)

.PHONY: all
all:
    echo $(go)

5. 参考文档

阮一峰:Make 命令教程

GNU Make Manual

make 命令与 Makefile的更多相关文章

  1. make命令以及makefile

    make命令以及makefile使用RCS与CVS进行源代码控制编写手册页使用patch与tar发布软件开发环境 多源代码的问题 当我们编写小程序时,许多人都是简单的在编辑后通过重新编译所有的文件重新 ...

  2. 深入学习Make命令和Makefile(上)

    https://www.zybuluo.com/lishuhuakai/note/209302 深入学习Make命令和Makefile(上) make是Linux下的一款程序自动维护工具,配合make ...

  3. 简介make命令和makefile文件

    一.为什么要用到 make 命令和 makefile 文件 在 Linux 下编写一个程序,每次编译都需要在命令行一行一行的敲命令.如果是一个很小的程序还好说,命令不怎的复杂,编译速度也挺快,但是对于 ...

  4. make命令和makefile文件

    make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具,它不仅常被用于控制源代码的编译,而且还用于手册页的编写以及将应用程序安装到目标目录. makefile文件由一组依赖关系 ...

  5. make命令与Makefile(转载)

    概述博客内容包含linux下make命令的使用与makefile的书写规则等,希望通过本文档使读者对make命令makefile文件有进一步了解,由于鄙人经验学识有限文档中会有描述不准确以及理解偏差, ...

  6. Shell脚本——make命令和Makefile文件【转】

    https://blog.csdn.net/twc829/article/details/72729799 make命令是一个常用的编译命令,尤其在C/C++开发中,make命令通过makefile文 ...

  7. gcc命令以及makefile文件

    (一)makefile里涉及到的gcc命令 gcc -I./inc:指定头文件寻找目录 将按照 ./inc --> /usr/include --> /usr/local/include的 ...

  8. 【C编程基础】make命令和makefile文件

    1.关于程序的编译和链接 一般来说,无论是C.C++首先要把源文件编译成中间目标文件即 Object File(windows为.obj文件,unix为.o文件),这个动作叫做编译(compile). ...

  9. pkg-config命令的Makefile.am

    举例:通过Makefile调用pkg-config命令. pkg-config - Return metainformation about installed libraries (为了使用lib库 ...

  10. 深入学习Make命令和Makefile(下)

    https://www.zybuluo.com/lishuhuakai/note/209300 make是Linux下的一款程序自动维护工具,配合makefile的使用,就能够根据程序中模块的修改情况 ...

随机推荐

  1. java之四种权限修饰符

    java权限修饰符piublic.protected.private.置于类的成员定义前,用来限定对象对该类成员的访问权限. 修饰符 类内部 同一个包 子类 任何地方 private yes     ...

  2. angularjs $scope与this的区别,controller as vm有何含义?

     壹 ❀ 引 初学angularjs的同学对于$scope一定不会陌生,scope(作用域)是将view(视图)与model(模板)关联起来的桥梁,通过controller(控制器)对于model的数 ...

  3. Swoole如何处理高并发

    有需要学习交流的友人请加入swoole交流群的咱们一起,有问题一起交流,一起进步!前提是你是学技术的.感谢阅读! 点此加入该群 swoole如何处理高并发 ①Reactor模型介绍 IO复用异步非阻塞 ...

  4. 将vue项目部署在Linux的Nginx下,并设置为局域网内访问

    1. 下载 wget http://nginx.org/download/nginx-1.12.2.tar.gz 2. 解压缩 tar -zxvf linux-nginx-1.12.2.tar.gz ...

  5. IT兄弟连 HTML5教程 CSS3揭秘 CSS3概述

    对于Web开发者来说,CSS3不只是一门新奇的技术,更重要的是这些全新概念的Web应用给开发人员带来了无限的可能性,也极大地提高了开发效率.我们不必再依赖图片或者JavaScript去完成圆角.多背景 ...

  6. 分布式的cap原理

    由来 1998年的加州大学的计算机科学家 Eric Brewer 提出,分布式有三个指标. Consistency,Availability,Partition tolerance. 简称即为CAP. ...

  7. .NET轻松实现支付宝服务窗网页授权并获取用户相关信息

    前言: 最近在开发一个商业街区的聚合扫码支付功能,其中需要用到的有支付宝,微信两种支付方式,当然对于开发微信支付而已作为自己的老本行已经比较熟悉了,然而对于我来说支付宝支付还是头一次涉及到.这次项目中 ...

  8. 【ZJOI 2014】力

    Problem Description 给出 \(n\) 个数 \(q_i\),给出 \(F_j\) 的定义如下: \[F_j=\sum_{i<j} \frac{q_iq_j}{(i-j)^2} ...

  9. netty源码解析(4.0)-27 ByteBuf内存池:PoolArena-PoolThreadCache

    前面两章分析的PoolChunk和PoolSubpage,从功能上来说已经可以直接拿来用了.但直接使用这个两个类管理内存在高频分配/释放内存场景下会有性能问题,PoolChunk分配内存时算法复杂度最 ...

  10. 关于 Sublime Text 3 中 input 无法输入的问题

    在新装的 Sublime Text 3 中,Ctrl + B 运行时会发现无法正常输入,我记录了一下我的解决方法. 相关原文可参照 https://blog.csdn.net/weixin_42116 ...