Makefile学习
这里构建的主要对象为Go和Docker。
先学习一下Makefile怎么使用的,后续修改fabric的源码也会方便一点。
Makefile基本语法
参考链接:https://www.cnblogs.com/woshimrf/p/make-docker.html
make的基本用法
make target
在当前目录创建一个叫做Makefile的文件。
声明变量
简单的变量赋值,比如声明name
name=ryan
声明规则Rule
Makefile文件由一系列规则(rules)构成。每条规则的形式如下。
<target> : <prerequisites>
[tab] <commands>
- target 目标
- prerequisites 前置条件
- tab command必须由tab隔开
- commands 只能有一行的shell
防止target和文件名一样
当我们设置的target和当前目录下的文件名一样的话,target会被忽略,所以,通常,我们把target都用做phony target。
.PHONY: build start push
表示, build start push 这3个target,不检查当前目录下的文件,直接执行命令。
Docker的例子
NAME = ryan/airflow
VERSION = 1.10.4
.PHONY: build start push
build: build-version
build-version:
docker build -t ${NAME}:${VERSION} .
tag-latest:
docker tag ${NAME}:${VERSION} ${NAME}:latest
start:
docker run -it --rm ${NAME}:${VERSION} /bin/bash
push: build-version tag-latest
docker push ${NAME}:${VERSION}; docker push ${NAME}:latest
一些符号
:= ?= += =的区别
参考链接:https://www.cnblogs.com/wanghuaijun/p/8092747.html
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
'@' '$' '$$' '-' '-n '
@作用是不让make在标准输出上显示该命令
$主要扩展打开makefile中定义的变量
$$主要扩展打开makefile中定义的shell变量
-通常删除,创建文件如果碰到文件不存在或者已经创建,那么希望忽略掉这个错误,继续执行,就可以在命令前面添加
-n 那么只是显示命令,但不会执行命令
$@, $^, $< , $?, $%, $+, $*
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
$% 仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是“foo.a(bar.o)”,那么,“$%”就是“bar.o”,“$@”就是“foo.a”。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。
$+ 这个变量很像“$^”,也是所有依赖目标的集合。只是它不去除重复的依赖目标。
$* 这个变量表示目标模式中“%”及其之前的部分。如果目标是“dir/a.foo.b”,并且目标的模式是“a.%.b”,那么,“$*”的值就是“dir/a.foo”。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么“$*”也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么“$*”就是除了后缀的那一部分。例如:如果目标是“foo.c”,因为“.c”是make所能识别的后缀名,所以,“$*”的值就是“foo”。这个特性是GNU make的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用“$*”,除非是在隐含规则或是静态模式中。如果目标中的后缀是make所不能识别的,那么“$*”就是空值。
%
通配符,类似*
一些内置定义
.SUFFIXES:
当前makefile内支持文件后缀的类型列表。
.DEFAULT_GOAL
默认编译的目标
