make 命令与 Makefile
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 命令与 Makefile的更多相关文章
- make命令以及makefile
make命令以及makefile使用RCS与CVS进行源代码控制编写手册页使用patch与tar发布软件开发环境 多源代码的问题 当我们编写小程序时,许多人都是简单的在编辑后通过重新编译所有的文件重新 ...
- 深入学习Make命令和Makefile(上)
https://www.zybuluo.com/lishuhuakai/note/209302 深入学习Make命令和Makefile(上) make是Linux下的一款程序自动维护工具,配合make ...
- 简介make命令和makefile文件
一.为什么要用到 make 命令和 makefile 文件 在 Linux 下编写一个程序,每次编译都需要在命令行一行一行的敲命令.如果是一个很小的程序还好说,命令不怎的复杂,编译速度也挺快,但是对于 ...
- make命令和makefile文件
make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具,它不仅常被用于控制源代码的编译,而且还用于手册页的编写以及将应用程序安装到目标目录. makefile文件由一组依赖关系 ...
- make命令与Makefile(转载)
概述博客内容包含linux下make命令的使用与makefile的书写规则等,希望通过本文档使读者对make命令makefile文件有进一步了解,由于鄙人经验学识有限文档中会有描述不准确以及理解偏差, ...
- Shell脚本——make命令和Makefile文件【转】
https://blog.csdn.net/twc829/article/details/72729799 make命令是一个常用的编译命令,尤其在C/C++开发中,make命令通过makefile文 ...
- gcc命令以及makefile文件
(一)makefile里涉及到的gcc命令 gcc -I./inc:指定头文件寻找目录 将按照 ./inc --> /usr/include --> /usr/local/include的 ...
- 【C编程基础】make命令和makefile文件
1.关于程序的编译和链接 一般来说,无论是C.C++首先要把源文件编译成中间目标文件即 Object File(windows为.obj文件,unix为.o文件),这个动作叫做编译(compile). ...
- pkg-config命令的Makefile.am
举例:通过Makefile调用pkg-config命令. pkg-config - Return metainformation about installed libraries (为了使用lib库 ...
- 深入学习Make命令和Makefile(下)
https://www.zybuluo.com/lishuhuakai/note/209300 make是Linux下的一款程序自动维护工具,配合makefile的使用,就能够根据程序中模块的修改情况 ...
随机推荐
- 上手OrangePi Zero+
一.安装系统 所需材料:系统镜像文件.镜像烧录工具.至少2G的内存卡(推荐8G以上).读卡器 1.下载系统镜像 官方系统下载地址,由于官方系统更新截止到17年,所以我选择的是Armbian系统.下载地 ...
- vue_04day 路由初始
目录 vue_04 项目初始: vue 文件构造: vue项目目录结构: 项目入口(main.js): vue项目启动生命周期: 根组件(vue.js): router.js: 创建的页面: 全局样式 ...
- 品Spring:注解终于“成功上位”
历史还是抛弃了XML,当它逐渐尝到注解的甜头之后. 尤其是在Spring帝国,到处充满着注解的气息. 注解从一个提供附属信息的“门客”,蜕变为颇具中流砥柱的“君侯”. 注解成功登上了帝国的舞台,定会像 ...
- ReactNative: 使用像素密度类PixelRatio进行适配
一.简介 现在设备显示屏的清晰度越来越高,尤其是iOS移动设备上的高清适配,Retina显示屏.在开发中,为了保证图片在不同的设备上显示的效果保持一致,往往需要准备多套图片,比如iOS开发中的@1x, ...
- Rsync常见问题汇总
rsync服务端开启的iptables防火墙 客户端的错误现象 No route to host 错误演示过程 [root@nfs01 tmp]# rsync -avz /etc/hosts rsy ...
- NIO零拷贝的深入分析
深入分析通过Socket进行数据文件传递中的传统IO的弊端以及NIO的零拷贝实现原理,及用户空间和内核空间的切换方式 传统的IO流程 在这个过程中: 数据从磁盘拷贝进内核空间缓冲区 从内核空间缓冲区拷 ...
- selenium自动化测试爬取动态页面大全
目录 一:浏览器信息测试 二:查找结点 三:测试动作 四:获取节点信息 五:切换子页面Frame 六,延时请求 七:前进和后退 八:Cookies 八:选项卡处理 九:捕获异常 这里之讲解用法,安 ...
- 团队项目之需求改进&系统设计
小组:BLACK PANDA 需求&原型改进 20分 需求&原型改进: https://git.lug.ustc.edu.cn/black-panda/mblogs_plan/bl ...
- 数据结构笔记2(c++)_跨函数使用内存的问题
预备知识 1.所有的指针变量只占4个子节 用第一个字节的地址表示整个变量的地址 //1.cpp 所有的指针变量只占4个子节 用第一个字节的地址表示整个变量的地址 # include <stdi ...
- 近期用到了Git,就简单介绍下具体用法吧
pull:是下拉代码,相等于将远程的代码下载到你本地,与你本地的代码合并push:是推代码,将你的代码上传到远程的动作完整的流程是: 第一种方法:(简单易懂) 1.git add .(后面有一个点,意 ...