Makefile学习2 Makefile条件判断 使用条件判断,可以让make在编译程序时,根据不同的情况,执行不同的分支:可以执行不同的命令,使用不同的编译参数,生成不同的目标。...ifdef 关键字 ifdef 关键字用来判断一个变量是否已经定义。如果变量的值非空(在Makefile中,没有定义的变量的值为空),表达式为真。...Makefile函数 GNU make 提供了大量的函数用来处理文件名、变量、文本和命令。通过这些函数,用户可以节省很多精力,编写出更加灵活和健壮的Makefile。...对于 GNU make内嵌的函数,直接引用就可以了;对于用户自定义的函数,要通过make的call函数来间接调用。 函数和参数列表之间要用空格隔开,多个参数之间使用逗号隔开。...在Makefile中可以使用的通配符有:* 、? 、 […]。通配符的使用方法和含义和在shell中一样。 通配符 使用说明 * 匹配0个或者是任意个字符 ?
Makefile 基本语法 : target 其实就是执行的目标, prerequisites 是执行这条指令的前置条件, commands...为了解决这个问题,我们需要使用 PHONY 声明 target 其实是伪目标: APP=myapp .PHONY: buildbuild: clean go build -o ${APP} main.go....PHONY: cleanclean: rm -rf ${APP} 多个 PHONY 也可以统一声明在一行中: .PHONY: build clean 递归的目标 假设我们的工程目录结构如下:...,它可能是一个单独的模块,也需要打包构建,并且定义有自己的 Makefile : # ~/project/mymodule/Makefile APP=module build: go build...判断语句 假设我们的指令依赖于环境变量 ENV ,我们可以使用一个前置条件去检查是否忘了输入 ENV : .PHONY: runrun: check-env echo ${ENV} check-env
背景 Makefile 是衡量开发者是否具备完成大型工程能力的一个重要标志。在一个工程中,源文件的数量可能极多,这些文件会按照类型、功能或模块分布在多个目录中。...大多数 IDE 都支持类似的功能,例如 Delphi 的 make,Visual C++ 的 nmake,以及 Linux 下的 GNU make。....PHONY: clean clean: rm -f code 依赖关系 目标文件 code依赖于源文件 code.c。...由于 clean 不直接或间接依赖于第一个目标文件,因此需要显式执行: make clean 设置 .PHONY 伪目标可确保 clean 总是被执行: .PHONY: clean clean: rm...-f code .PHONY 的作用 .PHONY 让 Makefile 忽略源文件与可执行目标文件的时间对比,总是执行伪目标的命令。
直到有一天,发现有人使用Makefile来存储操作,瞬间感觉很棒。 这里简单记录Makefile的简单用法。 Makefile是什么 Makefile是make命令的规则配置文件。...GNU(GNU's Not Unix)是一个类Unix系统, 目标是创建一套完全自由的操作系统。在Linux出现之前,GNU已经完成了除了内核之外大部分的软件。....PHONY: build start push 表示, build start push 这3个target,不检查当前目录下的文件,直接执行命令。...Docker构建用的指令 我常用的Makefile如下 NAME = ryan/airflow VERSION = 1.10.4 .PHONY: build start push build: build-version...docker push ${NAME}:${VERSION}; docker push ${NAME}:latest 构建一个版本的镜像 make build 构建完毕,运行一下镜像,看看内容是否正确
02 make 和 Makefile make 命令行工具可以自动判断是否需要重新编译程序,实际上 make 不仅限于程序,我们可以使用它来描述任何任务,只要其他文件发生更改,某些文件就必须从其他文件自动更新...在实际项目开发时,我们可能需要构建多个操作系统的可执行文件,我们再编写一个 Makefile,新增三个“伪目标”,分别是windows、linux 和 darwin。...因为 make 发现与“伪目标”同名的文件已存在,将不会再重新构建,所以就不会运行指定的 command,为了避免出现该问题,可以使用内置目标名.PHONY声明这些“伪目标”名是“伪目标”,而不是与“伪目标...执行 make all 命令,可以批量执行多个“伪目标”。...#Introduction https://www.gnu.org/software/make/manual/make.html#Phony-Targets https://go.dev/doc/articles
Makfile文件的编写 不定期更新 make和Makefile 以下来自百度百科 make: make是一条计算机指令,是在安装有GNU Make的计算机上的可执行指令。...有时make又指GNU Make,GNU Make 是一个用来控制可执行文件和其他一些从源文件来的非源代码文件版本的软件。...main : $(object) gcc -o main $(object) main.o : main.c stack.o : stack.h stack.c .PHONY : clean...依赖(dependes): 依赖是用来产生目标(target)的目标文件。 命令(command):命令前面一定是Tab,不能是定格,也不能说多个空格。...: clean clean: rm $(object) .PHONY : clean是说明clean是一个伪目标文件,从而不会对clean使用目标文件的生成。
目前centos 7.3 GNU的make版本是3.82 为什么要用Makefile 在做C/C++开发过程中,比如有如下文件: a.c b.c main.c 编译生成可执行二进制文件 gcc a.c...,编译过程会判断文件是否有过修改,只对修改的文件重新编译生成目标文件,不仅提高了效率,还减少了出错。...规则 目标文件:依赖文件 [Tab]系统指令1 (注意:系统指令前必须有tab) 示例 例如现有main.cpp test.cpp test.h三个文件,用Makefile实现增量编译(当其中有一个文件变化时...Makefile中有一些预定义函数,形式 $(函数名 参数列表) 参数列表:以逗号分隔 函数名和参数之间用空格分开 函数1:shell 获取当前目录路径: PWD = $(shell pwd) 函数2...在上边的Makefile中把clean定义为伪目标即可 .PHONY:clean 还有个特表的伪目标 all ,如我们通过Makefile创建多个可执行文件时,可以使用到: 如: all: bin1 bin2
编译(生成汇编) 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。...库文件 静态库:通常以 .a (Archive) 格式存储,是多个目标文件的集合。使用静态库时,其内容在编译时整合到最终的可执行文件中。...Makefile 内容解析 mytest: test.c gcc -o mytest test.c .PHONY: clean clean: rm -f mytest 第一部分:目标以及规则 mytest...第二部分:伪目标 .PHONY .PHONY: clean .PHONY: clean: 伪目标(Phony Targets):这是一个特殊的伪目标声明,告知 make,目标 clean 不是一个文件...伪目标声明 .PHONY: clean: clean 被声明为伪目标,表示它只是一个标签,不对应实际文件名。确保即使有同名文件 clean,也不会造成误会。
前言 makefile有什么用?...依赖关系和依赖方法 mytest:code.c称之为依赖关系 mytest是目标文件,使用make命令后,生成的运行文件叫mytest code.c是依赖文件列表,如果有多个时使用空格符隔开,例如:code.c...这里的要钱就是表明了依赖方法 项目清理 clear是一个种特殊的依赖关系,clear也是目标文件,只不过后面什么都不跟 rm -f mytest是依赖方法,是删除文件 如何理解.PHONY: 在读取makefile...一般清理项目会总是执行,因此习惯上会有:.PHONY:clear 为什么makefile对最新的可执行程序默认不想重新生成 如果项目种存在很多个源文件,如果在这些源文件中只进行了很小的改变,如果去把所有的源文件重新编译一遍...如果被.PHONY:修饰,就忽略了时间,于是可以总是被执行 我们想需要的makefile code.exe:code.c gcc -o $@ $^ 可以理解为取内容,@表示目标文件,^表示依赖文件
改进地方有两点: (5.1)将多个源文件目录写到一个变量,然后再利用Makefile的Shell函数将所有源文件目录下源文件取出。参考如下代码: DIR_SRC=./src0 ....Makefile是根据依赖项是否被修改决定是否重新执行command。如果不把头文件写入依赖项中,则面临的风险就是修改了头文件,目标文件不会被重新编译。...7.9Makefile中PHONY关键字的作用 PHONY的用法: .PHONY Target1 Target2 PHONY的作用: 指明Target是伪目标,并不会真正生成Target目标文件。...如: .PHONY : clean clean: rm -f *.out *.o 这样执行make clean会无视clean文件存在与否,或者是否是最新的。...[5]Makefile中的shell语法 [6]多个文件目录下Makefile的写法 [7]Makefile里PHONY的相关介绍 [8]Makefile中关于all和.PHONY .
1.背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定...make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。...所以,可执行程序的文件时间和源文件的文件时间对比的是Modify Time 6.补充语法 .PHONY:目标文件 这样添加了.PHONY这样就可以让mybin总是被执行。...我们发现其实上对比时间的工作是有make和makefile来做的,gcc并不关心。所以,当添加了这个伪目标后,make和makefile就默认不会对这个文件继续进行时间对比的操作。...我们发现make clean即使没有.PHONY照样能够重复执行,那是因为 原本比较的是源文件和目标文件,但是clean连源文件和目标文件都不清晰,所以,clean也是总是被执行。
例如在Ubuntu下,使用以下命令: $ sudo apt update $ sudo apt install build-essential 安装完成后,可以输入以下命令验证安装是否成功: $ make...-v GNU Make 4.3 $ gcc --version gcc (Ubuntu ...) 11.4.0 这样,我们就成功地安装了make,以及GCC工具链。...Makefile由若干条规则(Rule)构成,每一条规则指出一个目标文件(Target),若干依赖文件(Prerequisites),以及生成目标文件的命令。...$@ 表示目标文件。 $< 表示第一个依赖文件。 $^ 表示所有依赖文件。 .PHONY 声明clean为伪目标,避免与同名文件冲突。...这种赋值方式是 GNU Make 的标准形式。 例如: SRC=$(wildcard *.c) 变量可以提高Makefile的可读性和可维护性。
有!那就是Makefile! 这Makefile允许我们在一个文件中创建一组不同的命令来自动化我们的工作流程。...在GNU 手册上对make清晰的支出了 Makefile 的目的: “The make utility automatically determines which pieces of a large...由于我们只是在_运行命令_,我们应该告诉Makefile不会生成与target名称相同的文件。 这样我们就需要在文件顶部添加了一个.PHONY标志,在其中声明所有_不_生成同名文件的target。...要了解更多关于phony target在其中声明所有_不_生成同名文件的,您可以查看GNU手册phony target .PHONY: clean format clean: @echo "...让我们首先将这些目标添加到Makefile: .PHONY: clean format upgrade build_dev_mobile run_unit # Other targets run_unit
make 是一个命令工具,是一个解释 makefile 中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi 的 make,Visual C++的nmake,Linux下GNU的make...而后面的依赖文件列表就是具有相关性的 object files,也就是目标文件所依赖的文件(可以是一个或多个,也可以没有) 简述一下其基本的语法规则: 目标文件与依赖文件列表文件之间要使用 :(冒号)...例如:上面的gcc test -o test.c 2.2.4 伪目标 伪目标:伪目标是指在 Makefile 中.PHONY定义的不对应实际文件的目标,通常用于执行一些特定的操作,比如清理临时文件...3.2 .PHONY修饰的伪目标总是被执行 .PHONY 配置项的目标clean并不是其他文件生成的实际文件,使make命令会自动绕过隐含规则搜索过程,也就是说执行命令make clean会自动忽略名为...【通俗一点说】:.PHONY 修饰的目标clean并不是某个依赖项生成的实际文件,因此make命令不再去搜寻当前文件夹下是否有clean文件,这样少去做一些事,自然会改善性能,并且不用担心当前文件夹下是否有同名的文件
Makefile可以做什么? Makefile可以根据指定的依赖规则和文件是否有修改来执行命令。常用来编译软件源代码,只需要重新编译修改过的文件,使得编译速度大大加快。...tb.sv和dut.v是依赖,执行命令前会先检查tb.sv和dut.v是否存在,以及是否有修改。...伪目标 有时候目标并不是真实要生成的文件,比如我们要用Makefile调用simv来仿真,并不存在一个叫做sim的目标文件,这种情况我们称之为伪目标PHONY。...由于伪目标总是不存在,所以命令也一定会重新执行,即使simv没有修改。 我们常常在Makefile的开头来用.PHONY显式指明伪目标。...在Makefile中有几个特殊变量,如@表示目标,^表示依赖。
,例如:golang的版本,是否安装了revive代码静态扫描工具,是否安装了符合条件的docker版本等等; 跨平台支持以符合团队成员的各种开发环境; 编译过程中自动的将git的commit/branch...等工具来支持上述的诉求: bash脚本跨平台不友好; bazel不好用我也不无脑粉google神教; maven/gradle的golang插件对没有java经验的团队成员学习成本高; 跟随社区大流,使用gnu...但是Makefile的编写同样有不小的学习成本,因此,在这里我将经过多个大小工程的全套Makefile分享给大家。...主Makefile文件 根目录下Makefile内容如下: .PHONY: all all: lint test build # ===================================.... .PHONY: help help: Makefile @echo -e "\nUsage: make ...
1.为什么要有make/makefile 会不会写makefile可以从侧面说明一个人是否具备完成大型工程的能力。...Visual C++的nmake,Linux下的GNU的make.可见,makefile都成为了一种在工程方面的优秀编译方法。...那有没有办法让make强制去编译,不去看文件是否改变呢? 当然也是可以的。 只需要添加.PHONY,我们将它设置为伪目标,用.PHONY修饰,伪目标的特性是,总是被执行的。...make会在当前目录下找makefile/Makefile的文件 如果找到了,它会找文件中的第一个目标文件(target),在上面的例子中,它会找到mybin这个文件,并把这个文件作为最终的目标文件。...但是一般我们这种clean的目标文件,我们将它设置为伪目标,用.PHONY修饰,伪目标的特性是,总是被执行的。
Makefile可以做什么? Makefile可以根据指定的依赖规则和文件是否有修改来执行命令。常用来编译软件源代码,只需要重新编译修改过的文件,使得编译速度大大加快。...tb.sv和dut.v是依赖,执行命令前会先检查tb.sv和dut.v是否存在,以及是否有修改。...伪目标 有时候目标并不是真实要生成的文件,比如我们要用Makefile调用simv来仿真,并不存在一个目标文件,这种情况我们称之为伪目标PHONY。 示例二: sim: simv ....由于伪目标总是不存在,所以命令也一定会重新执行,即使simv没有修改。 我们常常在Makefile的开头来用.PHONY显式指明伪目标。...在Makefile中有几个特殊变量,如$@表示目标,$^表示依赖。
(GNU m4宏处理器处理*.m4宏文件) ####2.编译 gcc找不到头文件: sudo find /(目录) -name 文件 makefile的一般格式:目标:依赖 命令 例如:a.c...a.o b.o main.o -o main main.o : main.c gcc -c main.c b.o : b.c gcc -c b.c a.o : a.c gcc -c a.c #用".PHONY...{目标名}"显式定义一个伪目标(可以隐式定义) # 用"make {目标名}"执行该伪目标 .PHONY : clean clean : @rm -f main *.o @echo 'clean'...makefile变量定义: '=':(直接赋值,只有变量引用则未被赋值) ':=':(选择有值的变量赋值) '?...article/details/7169384 ####5.安装包依赖关系 linux安装通常都会遇到安装包依赖导致安装失败,如configure编译时需要其他SDK的支持,check检查各模块是否安装
make是一个命令工具,是一个解释makefile的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Linux下GNU的make。...file.c:这里是依赖关系列表,可以有多个文件。...其实也是有的,这里就需要补充一点新的语法: .PHONY:目标文件#修饰目标文件,使之成为伪目标,总是被执行 可以看到,加上 .PHONY 修饰之后,我们make就可以多次使用了,其实修饰伪目标就是...而我们一般遵循着伪目标修饰清理工作,编译工作还是交给编译器的选择,以时间的更新来判断执不执行make,但是 清理工作是一定要执行 的,所以我们 通常把.PHONY修饰需要清理的目标文件。...测试是否是自底向上执行依赖方法: ✈️ 总结: makefile有一个重要概念——依赖关系和依赖方法,依赖关系又有目标文件和依赖关系列表。
领取专属 10元无门槛券
手把手带您无忧上云