变量 自定义变量,示例: APP=myapp build: clean go build -o ${APP} main.go clean: rm -rf ${APP} PHONY 上例中的定义了...为了解决这个问题,我们需要使用 PHONY 声明 target 其实是伪目标: APP=myapp .PHONY: buildbuild: clean go build -o ${APP} main.go....PHONY: cleanclean: rm -rf ${APP} 多个 PHONY 也可以统一声明在一行中: .PHONY: build clean 递归的目标 假设我们的工程目录结构如下:...使用 cd 命令也可以,不过我们有其它的方式去解决这个问题:使用 -C 标志和特定的 ${MAKE} 变量。...shell 输出作为变量 我们可以把 shell 中执行的指令的输出作为变量: V=$(shell go version) gv: echo ${V} 这里执行 make gv 就会先执行 go
在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。 4.文件指示。...后面的每个目标文件皆是如此做法。 (9)伪目标的使用。 .PHONY clean clean: rm -f *.o *.out 使用.PHONY关键字,指明clean是伪目标,仅作标签使用。...若将all放在所有目标文件的前面,则使用make即可,无需指明make all,原因是make命令将Makefile中第一个出现的目标作为最终目标,若不放在最前面,则必须指明make all。...对于一般多字符变量的引用必须使用括号,否则make将把变量名的首字母作为作为变量而不是整个字符串($PATH在Makefile中实际上是$(P)ATH)。...其实可以使用Makefile的shell函数来执行shell脚本,因为shell函数把执行shell脚本后的输出作为函数返回,因此我们可以使用shell函数来为Makefile的变量赋值。
这样的目标在作为一个规则的依赖时,因为依赖总被认为被更新过,因此作为依赖所在的规则中定义的命令总会被执行。FORCE所在规则为空,也是什么都不做。...FORCE被定义为一个伪目标,所以它作为依赖时总是被认为是最新的(比目标新),故有FORCE作为依赖的目标每次make时必然会重新生成,在这里FORCE伪目标的规则命令为空,故FORCE在Kbuild体系中...在$(srctree)/scripts/Makefile.build中src变量的定义为: src := $(obj) PHONY := __build __build: # Init all...这样的目标在作为一个规则的依赖时,因为依赖总被认为被更新过,因此作为依赖所在的规则中定义的命令总会被执行。FORCE所在规则为空,也是什么都不做。...FORCE被定义为一个伪目标,所以它作为依赖时总是被认为是最新的(比目标新),故有FORCE作为依赖的目标每次make时必然会重新生成,在这里FORCE伪目标的规则命令为空,故FORCE在Kbuild体系中
这样我们就很好理解了,上述makefile文件中,code作为目标文件、code.c作为依赖文件、通过依赖关系gcc code.c -o code来生成目标文件。 2....创建变量 在makefile中也可以创建变量,和C语言中指针那样 BIN=code SRC=cpde.c OBJ=code.o CC=gcc RM=rm -f $(BIN):$(OBJ) gcc...BIN=code、SRC=code.c这样的就是创建了变量,(它们就像`C语言中的指针); 在需要访问这些变量的值的时候需要用到()(就比如(BIN)访问BIN变量的值) 这里还有优化一下,使用^和@...$^:在依赖方法中使用,指依赖关系中的依赖文件 $@:在依赖方法中使用,指依赖关系在的目标文件 所有就可以这样来写: BIN=code SRC=cpde.c OBJ=code.o CC=gcc...这样我们在写由.c生成.o文件时,就能直接使用通配符%,这样就可以自动匹配 在匹配结束之后,目标文件依赖多个文件;就不能使用$^直接取依赖文件列表了,而是使用%中多个文件一个一个执行
在Linux中编译代码,不像是Windows中有很多集成的IDE,Linux中都是通过基本的编译工具如gcc来进行,比如要编译main.c这个文件,可以使用gcc main.c -o main.但是如果源文件很多...mp3.o: gcc -c mp3.c -o mp3.o .PHONY:clean clean: rm mp3 2、Makefile中的变量:系统变量、自定义变量、自动化变量 (1)...(3)自动化变量 $< 第一个依赖文件 $^ 全部的依赖文件 $@ 目标 使用自动化变量可以使Makefile文件更好地修改,类似于C语言中使用宏定义来封装,比如将前面写的Makefile进行改造 cc...INC_DIR来保存头文件的路径,第二句是使用模式替换函数在路径前加上-I,这是为了后面gcc 选项指定依赖的头文件路径。...第三句是头文件路径里的每一个头文件,并且通过第四句把每一个头文件作为.o的依赖文件,也就是当头文件发生变化时,编译器要重新编译生成.o文件。 完整Makefile代码 ARCH?
规则中也可以没有命令,仅仅包含目标和目标依赖,仅仅用来描述一种依赖关系,但一个规则中一定要有一个目标。 默认目标 一个Makefile文件里通常会有多个目标,一般会选择第一个作为默认目标。...Makefile文件中a.out是文件中的第一个目标,当我们在make编译时没有给make指定要生成的目标,make就会选择Makefile文件中的第一个目标作为默认目标。...应用: 立即展开变量一般用在规则中的目标、目标依赖中。make在解析Makefile阶段,需要这些变量有确切的值来构建依赖关系树。...在模式匹配中,表示目标模式中%的文件名部分 -: :告诉make在编译时忽略所有的错误 @: :告诉make在执行命令前不要显示命令 变量替换 字符串替换 .PHONY: all SRC := main.c...如果不希望在命令行指定的变量值替代在Makefile中的原来定义,那么我们可以在Makefile中使用指示符 override 对这个变量进行声明: .PHONY: all override web =
因此,通过在Makefile中设置all作为默认目标规则,你可以简化构建过程,只需运行make命令即可执行整个编译过程,无需显式指定目标 三、变量 符号表示取变量的值,当变量名多于一个字符时,使用"(...中容易搞错赋值等号, 使用 “=”进行赋值,变量的值是整个Makefile中最后被指定的值。...在一些大工程中,会把不同模块或不同功能的源文件放在不同的目录中,我们可以在每个目录中都写一个该目录的Makefile这有利于让我们的Makefile变的更加简洁,不至于把所有东西全部写在一个Makefile...如果传递变量到下级Makefile中,那么可以使用这样的声明export 如果不想让某些变量传递到下级Makefile,可以使用unexport export variable = value 等价于...如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到 myproc 这个文件,并把这个文件作为最终的目标文件。
一旦我们确定了这些问题,我们就可以编写Makefile文件并开始构建我们的项目。 --- 使用变量 Makefile中的变量可以使我们的代码更加模块化和可维护。...我们可以将常量放入变量中,以便在整个Makefile中重复使用。例如,我们可以将编译器的路径、编译器选项和库路径都放入变量中。此外,我们还可以在变量中存储其他有用的信息,例如项目名称、版本号等。...CC = gcc CFLAGS = -Wall -O2 LIBS = -lm --- 使用自动变量 自动变量可以使我们在规则中引用目标和依赖关系,以及其他有用的信息。...--- 使用.PHONY规则 .PHONY规则可以使我们更加精确地指定Makefile文件中的目标。它告诉make命令,某个目标是一个伪目标,不是一个实际的文件名。...比如说,我们可以考虑在Makefile文件中添加一些注释,以帮助其他人更好地理解我们的Makefile。
b、目标和依赖描述放在同一行,目标和依赖描述使用冒号(:)分隔开;命令行在目标、依赖描述的下一行。当作为独立的命令行时此行必须以[Tab]字符开始。...这样的目标在作为一个规则的依赖时,因为依赖总被认为被更新过,因此作为依赖所在的规则中定义的命令总会被执行。FORCE所在规则为空,也是什么都不做。...FORCE被定义为一个伪目标,所以它作为依赖时总是被认为是最新的(比目标新),故有FORCE作为依赖的目标每次make时必然会重新生成,在这里FORCE伪目标的规则命令为空,故FORCE在Kbuild体系中...在$(srctree)/scripts/Makefile.build中src变量的定义为: src := $(obj) PHONY := __build __build: # Init all...目标menuconfig定义在scripts/kconfig/Makefile中,找到menuconfig目标后,然后执行以menuconfig为目标的规则: PHONY += oldconfig xconfig
背景 Makefile 是衡量开发者是否具备完成大型工程能力的一个重要标志。在一个工程中,源文件的数量可能极多,这些文件会按照类型、功能或模块分布在多个目录中。...Makefile 是配合 make 命令使用的文件,其中 make 是解释并执行 Makefile 中指令的工具。...将Makefile比作一个人月底的工资,那么一个人工资的各种组成计算就是Makefile的规则 基本使用 在云服务器当中我们可以创建一个文件比如code.c 在文件当中写入 #include <stdio.h...-f code .PHONY 的作用 .PHONY 让 Makefile 忽略源文件与可执行目标文件的时间对比,总是执行伪目标的命令。...的工作机制 文件检测:Make 在当前目录中查找名为 Makefile 或 makefile 的文件。
它们在Makefile中的格式如下: 目标(Target):目标是指需要生成的文件或目标体,可以是Object File(一般称为中间文件)、可执行文件或标签。...这些命令描述了如何从依赖文件生成目标文件。在Makefile中,命令部分需要有一定的缩进,可以是一行或多行,它们会依次执行。...1、延迟赋值 在Makefile中,变量的默认赋值方式是“延迟”的。...这意味着变量只有在被引用时才会被计算,并且只计算一次。如果一个变量在多个地方被引用,那么只有第一次引用时会被计算,后续的引用会使用第一次计算的结果。...这意味着变量会在声明时立即被计算,并且在之后的所有引用中都会使用这个计算结果。即使变量的值在后续发生了变化,之前的引用也不会受到影响。
伪目标和变量伪目标最早先的一个例子中,我们提到过一个“clean”的目标,这是一个“伪目标”,clean: rm *.o temp更为稳健的做法是:.PHONY : cleanclean :...变量的使用(1)变量的声明:变量在声明时需要给予初值,而在使用时,需要给在变量名前加上 $ 符号,但最好用小括号 () 或是大括号 {} 把变量给包括起来。...变量是大小写敏感的,“foo”、“Foo”和“FOO”是三个不同的变量名。传统的Makefile的变量名是全大写的命名方式,但我推荐使用大小写搭配的变量名,如:MakeFlags。...3.2 Go项目的常用命令为什么要说一下Go中的常用命令呢,因为Go项目中Makefile的使用较为简单,大多都是对Go命令的一些执行操作,因此我们首先要熟知Go语言中的常用命令,才能更好的编写Makefile...3.3 使用实践项目目录:Makefile文件内容:.PHONY:tidytidy: go mod tidy.PHONY:buildbuild: go build .
如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“app”这个文件,并把这个文件作为最终的目标文件。...上述还只是简单的makefile,属于「显式规则」,那么为了优化makefile我们介绍「隐式规则」 makefile中使用变量 在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点...Makefile中变量有四种定义(赋值)方式: 1,简单赋值( := ) 编程语言中常规理解的赋值方式,只对当前语句的变量有效(推荐使用) 2,递归赋值( = )赋值语句可能影响多个变量,所有目标变量相关的其他变量都受影响...OBJ:=main.o #定义变量 #引用变量 ${OBJ} #使用变量 $(OBJ) #推荐使用 除了自己定义的变量之外makefile还提供了预定义的变量 在隐含规则中的命令中,基本上都是使用了一些预先设置的变量...函数 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能。
变量可以在 Makefile 中定义并在规则中使用。...用法:自动变量在规则中使用,能够引用当前目标、依赖文件等。...在早期的打字机和电传打字机上,回车会使打字头或打字轮返回到行首。 在 macOS 和早期的 Mac OS 系统中,文本文件使用回车 (ASCII 编码 0x0D) 作为行末标记。...在早期的打字机和电传打印机上,换行会使纸张向下移动一行。 在 Unix/Linux 系统中,文本文件使用换行 (ASCII 编码 0x0A) 作为行末标记。...回车+换行 (CR+LF): 在 Windows 系统中,文本文件使用回车+换行 (ASCII 编码 0x0D 0x0A) 作为行末标记。
make与makefile make 是一个在 Unix/Linux 系统中广泛使用的构建工具,用于自动化编译和构建项目。...变量:makefile 中定义的变量,允许复用和动态设置。...清理目标:clean 是一个伪目标,用于清理生成的文件。 常用命令 make:使用默认目标(Makefile 中第一个定义的目标)进行构建。...易于维护:通过 makefile 管理复杂项目的构建流程。 .PHONY 在 makefile 中,.PHONY 用于声明「伪目标」(phony targets),即不直接对应文件的目标。...Makefile 中的配置 有时在 makefile 中的配置也会影响重新编译的条件,例如使用变量、条件语句和模式规则等。 总结 需要重新编译:当源文件、依赖文件发生变化,或者手动强制重新编译时。
Makefile规则: 1)先创建一个名称为 makefile 或者 Makefile 的文档; 2)在文档里面输入相应的内容: 输入相应内容的时候,要遵循相应的规则。 ...目标项:这个就是你要生成的文件名; 依赖项:要生成目标项需要的文件; 编译命令:如果有依赖项生成目标项;必须以TAB开头; makefile 文件里面可以有很多规则,...的伪目标: 1)使用 .PHONY 这个makefile的关键字来定义你的伪目标; .PHONY:clean rebuild 2)再编写对应的伪目标: clean: rm -f...=$(变量名) //引用 在 Makefine 体现如下: SOURCE:=main.o sequence.o EXE:=main $(EXE):$(SOURCE) gcc...:clean rebuild clean: rm -f main.o main sequence.o rebuild:clean main 2)自动变量: 使用的时候,使用特定的值去替换
上线的服务是使用golang的哪个版本编译的? A引入了bouk/staticfiles等工具将工程目录下的文件嵌入到二进制程序中,B如何方便的在修改文件后同步更新asset文件?...Makefile文件中,定义了工程通用的路径变量以及根据git describe --dirty --always --tags | sed 's/-/./2' | sed 's/-/./2'命名的结果获取工程的...git代码库状态作为工程的版本信息。...,其中编译包含: make build: 编译当目前操作系统系统目标的可执行文件 make build.all: 同时编译macos/windows/linux的64位可执行程序 在使用上,还支持指定options...: 必须按照golang工程建议的规范在根目录下的cmd目录下为每一个可执行程序建立单独包 使用go module作为依赖管理工具,仅支持golang的1.11,1.12版本 代码检查工具使用的是revive
:增加伪目标:.PHONY:clean: .PHONY:clean clean: rm $(obj) *.o 注意: clean的规则不要放在文件 的开头,不然,会变成make的默认目标,一般....PHONY:clean clean: -rm $(obj) *.o 变量 变量的定义 Makefile也支持变量定义,变量的定义也让的我们的Makefile更加简化,可复用。...赋值符'+=': Makefile中的变量是字符串,有时候我们需要给前面已经定义好的变量添加一些字符串进去,此时就要使用到符号"+=": OBJ = main1.o main2.o OBJ += main3...这些变量可以让我们更加快速的完成Makefile的编写,其中自动变量只能在规则中的命令使用,常用的自动变量如下: $@:规则中的目标 $中的第一个依赖文件 $^:规则中的所有依赖文件 CC...函数参数:原模式+目标模式+文件列表,使用方法: SRC = $(wildcard .
伪目标 有时候目标并不是真实要生成的文件,比如我们要用Makefile调用simv来仿真,并不存在一个叫做sim的目标文件,这种情况我们称之为伪目标PHONY。...我们常常在Makefile的开头来用.PHONY显式指明伪目标。 示例三: .PHONY: sim sim: simv ....那么我们为了防止出错通常把第一个目标定义成all(执行完整的流程)或者help(显示帮助菜单)。我更倾向于后者,可以帮助我们回忆如何使用Makefile脚本。.../simv -xxx 这样,当我们不记得如何使用Makefile的时候,直接敲make就会有使用帮助菜单。另外,我们还可以看到,一个目标后面可以执行多条命令,比如这里的三条echo命令。...在Makefile中有几个特殊变量,如@表示目标,^表示依赖。
伪目标 有时候目标并不是真实要生成的文件,比如我们要用Makefile调用simv来仿真,并不存在一个目标文件,这种情况我们称之为伪目标PHONY。 示例二: sim: simv ....我们常常在Makefile的开头来用.PHONY显式指明伪目标。 示例三: .PHONY: sim sim: simv ....那么我们为了防止出错通常把第一个目标定义成all(执行完整的流程)或者help(显示帮助菜单)。我更倾向于后者,可以帮助我们回忆如何使用Makefile脚本。.../simv -xxx 这样,当我们不记得如何使用Makefile的时候,直接敲make就会有使用帮助菜单。另外,我们还可以看到,一个目标后面可以执行多条命令,比如这里的三条echo命令。...在Makefile中有几个特殊变量,如$@表示目标,$^表示依赖。
领取专属 10元无门槛券
手把手带您无忧上云