首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

具有非假先决条件的Makefile .PHONY目标

基础概念

在Makefile中,.PHONY是一个特殊的目标,用于告诉make命令,无论当前目录下是否存在与.PHONY目标同名的文件,都应当执行该目标对应的命令。这通常用于确保某些命令总是被执行,而不是因为文件系统中存在同名文件而被跳过。

.PHONY目标的非假先决条件意味着该目标没有依赖项,或者其依赖项总是被认为是“过时”的,因此无论何时执行make命令,都会运行与该.PHONY目标关联的命令。

相关优势

  1. 确保命令执行:即使存在同名文件,也能保证相关命令被执行。
  2. 简化依赖管理:不需要为每个命令创建一个单独的目标文件。
  3. 提高可读性:通过.PHONY声明,可以清晰地表明哪些目标是伪目标,便于理解和维护。

类型与应用场景

  • 类型.PHONY目标是一种特殊的伪目标。
  • 应用场景
    • 清理生成的文件(如clean目标)。
    • 运行测试套件(如test目标)。
    • 执行文档生成任务(如docs目标)。

示例代码

代码语言:txt
复制
.PHONY: all clean test docs

all: program

program: main.o util.o
    gcc -o program main.o util.o

main.o: main.c
    gcc -c main.c

util.o: util.c
    gcc -c util.c

clean:
    rm -f program main.o util.o

test:
    ./run_tests.sh

docs:
    doxygen Doxyfile

遇到的问题及解决方法

问题:.PHONY目标未被执行

原因

  • 可能是因为存在一个与.PHONY目标同名的文件,并且该文件是最新的(即没有依赖项比它更新)。
  • 可能是由于make命令的缓存机制导致的。

解决方法

  • 确保没有与.PHONY目标同名的文件存在。
  • 使用make -B(或make --always-make)强制重新构建所有目标。
  • 检查.PHONY目标的声明是否正确无误。

通过上述方法,可以确保.PHONY目标在需要时总是被执行,从而避免因文件系统状态而导致的意外行为。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Go 项目使用 Makefile

;command 阅读上面示例代码,target 是目标文件,多个目标文件之间使用空格分隔,一般只有一个目标文件,也可以是“伪目标”(某个操作的名字);prerequisites 是先决条件;command...因为 make 发现与“伪目标”同名的文件已存在,将不会再重新构建,所以就不会运行指定的 command,为了避免出现该问题,可以使用内置目标名.PHONY声明这些“伪目标”名是“伪目标”,而不是与“伪目标...中第二个“伪目标” all,该目标只有 4 个先决条件,没有任何命令。...不必如此,我们可以在 Makefile 中编写一个“伪目标” help,用于描述 Makefile 中的“伪目标”列表和使用示例等。...Make 命令运行时,如果不指定“目标”,默认执行 Makefile 文件的第一个“目标”。

1.9K20

Makefile基本用法

也可用FORCE替换.PHONY,效果一致,而FORCE可以换一个名字,只是一个标记。 ? 使用默认编译再次简化 虽然更紧凑,但是每个目标的所依赖的信息放在不同的地方,可能不够清晰。 ?...管道命令 对要调用的规则施加特定的顺序,而不必强制更新目标,使用管道命令。 当执行此条规则,则首先需要执行先决条件的规则。然而当先决条件存在,不论是否被更改,都属于满足条件。...&是一个分组目标符号。 ? 以下方式在生成目标和先决条件中间添加了%,则表示为每次生成的.o,依赖于对应的.c ? ? 如下的filter方法,将不属于对应的内容过滤掉。 ?...在替换的目标中,\1表示替换的源的第一部分,然后添加.o和空格和该规则下的先决条件名。 sed将上一句生成的依赖关系中的一些部分进行了替换,写入到了每个先决条件文件下。....POSIX 如果.POSIX被称为目标,那么makefile将被解析并以符合POSIX的模式运行。 变量导出 使用export进行导出,供子makefile使用。

2.5K40
  • Make 快速入门

    ,例如:可执行文件或目标文件;它也可以是要执行任务的名称,例如用于清理生成文件的 clean 任务。...prerequisites: 先决条件是用于生成 target 文件的输入文件或是完成 target 任务前需要先执行的任务 。一个 target 可以没有先决条件,也可以有一个或多个先决条件。....PHONY: help clean mk help : @echo "help info" dist : @mkdir dist clean : @rm -rf dist .PHONY:...既可以出现在目标,先决条件,也可以出现在“菜谱”的 shell 命令中;可以是命令本身,也可以是命令的选项,或者输入输出文件;甚至也可以出现在另一个变量的引用中(计算变量)。...隐式规则 某些重新生成目标文件的方式非常常用。例如,使用 C 编译器 cc 从 .c 源文件编译生成 .o 目标文件。

    1.5K10

    一个通用的Makefile(二)

    是先从子目录下开始执行的: 1> 执行顶层目录的makefile程序时,先进入顶层目录,发现有些文件和目录,将会进入如DSVICICOMSVC/ 2> 进入子目录后,又会发现又有子目录的makefile...make -C ./ -f  Makefile.build    3、顶层目录的Makefile.build: 这是最复杂的部分,它的功能就是把某个目录及它的所有子目录中、需要编进程序去的文件都编译出来...,打包为built-in.o; PHONY := __build       #假目标 __build: obj-y := subdir-y := include Makefile                     ...#包含当前目录的makefile,才知道目标是哪些目标和目录 # obj-y := a.o b.o c/ d/ # $(filter %/, $(obj-y))   : c/ d/ # __subdir-y...: $(PHONY) 4、怎么使用这套Makefile: 1.把顶层Makefile, Makefile.build放入程序的顶层目录 2.修改顶层Makefile 2.1 修改工具链 2.2 修改编译选项

    1.6K111

    【Linux必备工具】自动化构建工具makefile的使用详解

    而后面的依赖文件列表就是具有相关性的 object files,也就是目标文件所依赖的文件(可以是一个或多个,也可以没有) 简述一下其基本的语法规则: 目标文件与依赖文件列表文件之间要使用 :(冒号)...在 Makefile 中,空行被视为分隔符,用于区分不同的规则或目标。 当 Make 工具解析 Makefile 文件时,它会忽略空行,并将第一行之后的非空行视为第一个规则或目标。...例如:上面的gcc test -o test.c 2.2.4 伪目标 伪目标:伪目标是指在 Makefile 中.PHONY定义的不对应实际文件的目标,通常用于执行一些特定的操作,比如清理临时文件...3.2 .PHONY修饰的伪目标总是被执行 .PHONY 配置项的目标clean并不是其他文件生成的实际文件,使make命令会自动绕过隐含规则搜索过程,也就是说执行命令make clean会自动忽略名为...3.3 make/Makefile具有依赖性的推导能力 越是接近目标文件的命令,就越是要写在前面。

    22410

    Linux笔记(9)| 一步步深入Makefile

    1、Makefile三要素:目标、依赖、命令 目标:依赖的文件或者是其他目标 命令1 命令2 例: targeta:targetb targetc echo "targeta...mp3.o: gcc -c mp3.c -o mp3.o .PHONY:clean clean: rm mp3 2、Makefile中的变量:系统变量、自定义变量、自动化变量 (1)...(3)自动化变量 $< 第一个依赖文件 $^ 全部的依赖文件 $@ 目标 使用自动化变量可以使Makefile文件更好地修改,类似于C语言中使用宏定义来封装,比如将前面写的Makefile进行改造 cc...:clean clean: rm mp3 执行结果与之前完全一致 3、模式匹配 %:匹配任意多个非空字符(Shell:*通配符) 例:对上面的Makefile进一步改造 cc=gcc target...可以看到,加上头文件之后,之前的警告已经没有了,并且能够生成最终的可执行目标。

    91150

    【Liunx篇】基础开发工具-自动化构建-makeMakefile

    伪目标 .PHONY  当我们第一次编译好mytest,后面我们再想编译它却不允许我们编译了,这是为什么呢?...我们再来一段演示: 我们让.PHONY修饰以下目标文件mytest 我们查看代码时从上向下扫描,第一个遇到的就是.PHONY:mytest make一下 所以我们.PHONY修饰的目标文件代表的含义是...重谈.PHONY .PHONY修饰一个符号表示它为为目标,作用:总是被执行的。 如何做到的呢?在gcc这里是忽略对比时间,.PHONY下面的这条命令总是被执行。...Makefile也不具有通用性 第二代,我们将最终形成的可执行程序称之为BIN 这个叫做Makefile中的变量,你可以给你形成的mytest定义一个变量名 SRC表示形成可执行程序依赖的源文件...在软件开发中,掌握Makefile的使用对于提高开发效率和维护项目的可构建性具有重要意义。

    9710

    命令行上的数据科学第二版:六、项目管理与`make`

    这个过程被称为构建目标。如果你不指定一个目标的名字,那么make将构建第一个在Makefile中指定的目标。...想想作为项目的一部分,您需要执行的任务。在你的Makefile的顶部使用一个名为.PHONY的特殊目标,后跟虚假目标的名字,这是一个很好的做法。...这里有一个例子Makefile来说明如何使用假目标: $ bat tasks.make ───────┬─────────────────────────────────────────────────...尽管这仅使用一次,但我发现将这样的信息放在文件的开头很有帮助,这样您就可以很容易地对这些设置进行更改。 使用特殊目标.PHONY我们可以指出哪些目标没有被文件表示。...它使用了一个特殊的变量$先决条件的名称,即data/starwars.csv。

    70310

    实战Makefile前,该知道那些知识?

    make与make clean 生成目标文件规则(make命令): 执行make命令则会根据当前目录的Makefile文件定义的规则生成对应的目标文件。...清空目标文件的规则(make clean命令): 每个Makefile中都应该写一个清空目标文件( .o 和目标文件等)的规则,这不仅便于重编译,也很 利于保持文件的清洁。...:增加伪目标:.PHONY:clean: .PHONY:clean clean: rm $(obj) *.o 注意: clean的规则不要放在文件 的开头,不然,会变成make的默认目标,一般...如果一个规则中的某个命令出错了(命令退出码 非零),那么make就会终止执行当前规则,这将有可能终止所有规则的执行。 有时命令的出错并不表示错误。....PHONY:clean clean: -rm $(obj) *.o 变量 变量的定义 Makefile也支持变量定义,变量的定义也让的我们的Makefile更加简化,可复用。

    48920

    可移植的 Makefile 教程

    构建(build)的最后产物(可执行程序,文档等等)位于树根。Makefile 指定了依赖树的内容,并且提供了 Shell 命令来从目标的 先决条件(prerequisite) 生成目标。 ?...它应该是看起来比较显然的一些东西,这样即使一个用户盲目地运行 make,也会得到一个有用的结果。 一个目标可以被指定多次。任何新的先决条件,都会被附加到已有的先决条件中。...所有特殊目标都有大写的名字,并且开始于一个周期。符合这个模式的名字被 make 保留使用。根据标准,为了获得可靠的 POSIX 行为,Makefile 的第一个非注释行必须是 .POSIX....如果目标比其中的任一个先决条件要旧,那么这个目标就是过时了。...如果第一个规则选择了默认目标,我们该如何解决需要多个默认目标的问题呢?传统方式是使用伪目标(phony target).

    1.4K10

    Makfile文件的编写

    该指令是读入一个名为makefile 的文件,然后执行这个文件中指定的指令。...有时make又指GNU Make,GNU Make 是一个用来控制可执行文件和其他一些从源文件来的非源代码文件版本的软件。...Makefile编写 以下是本人自己比较喜欢用的Makefile的使用方式的总结,一般为单个项目产生单个可执行文件,一般是控制台程序或者opencv相关 简单的多文件的C/C++控制台程序 文件目录是...: stack.h stack.c 对应生成的是object的所有依赖文件 四、指定clean规则 这一步其实可以省略,主要目的是制定一个清理生成的中间文件的选项 这部分对应的内容是 .PHONY...: clean clean: rm $(object) .PHONY : clean是说明clean是一个伪目标文件,从而不会对clean使用目标文件的生成。

    70030

    Makefile学习2

    Makefile学习2 Makefile条件判断 使用条件判断,可以让make在编译程序时,根据不同的情况,执行不同的分支:可以执行不同的命令,使用不同的编译参数,生成不同的目标。...如果变量的值非空(在Makefile中,没有定义的变量的值为空),表达式为真。...Makefile函数 GNU make 提供了大量的函数用来处理文件名、变量、文本和命令。通过这些函数,用户可以节省很多精力,编写出更加灵活和健壮的Makefile。...匹配任意一个字符 [] 我们可以指定匹配的字符放在 “[]” 中 除此之外,Makefile还有经常使用的几个自动变量也可以看做特殊通配符: $@:所有目标文件 $^:目标依赖的所有文件 $的依赖文件 在Makefile中,通配符主要用在两个场合: 用在规则的目标和依赖中:make在读取Makefile时会自动对其进行匹配处理 test: *.o gcc -o $@ $

    33610

    【Linux系统编程】—— 自动化构建工具Makefile指南

    .PHONY: clean clean: rm -f code 依赖关系 目标文件 code依赖于源文件 code.c。...清理目标:通过 make clean 清理编译生成的目标文件。 项目清理 Makefile 通常会定义一个名为 clean 的目标,用于清理工程文件。...由于 clean 不直接或间接依赖于第一个目标文件,因此需要显式执行: make clean 设置 .PHONY 伪目标可确保 clean 总是被执行: .PHONY: clean clean: rm...-f code .PHONY 的作用 .PHONY 让 Makefile 忽略源文件与可执行目标文件的时间对比,总是执行伪目标的命令。...目标检测:读取 Makefile 的第一个目标文件(例如 myproc)。 依赖检查: 如果目标文件不存在或依赖文件较新,则执行命令生成目标文件。 递归检查依赖关系,直到满足所有条件。

    13610

    使用 Makefile 构建指令集

    使用 Makefile 构建指令集 make 是一个历史悠久的构建工具,通过配置 Makefile 文件就可以很方便的使用你自己自定义的各种指令集,且与具体的编程语言无关。...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 为: APP=myapp .PHONY: buildbuild: clean go build -o ${APP} main.go .PHONY: cleanclean

    92810

    深入了解Linux —— make和makefile自动化构建工具

    现在就来看一下makefile中内容有和含义呢? code:code.c gcc code.c -o code .PHONY:clean clean: rm -f code 1....依赖关系和依赖方法 对于上述makefile文件,在介绍之前我们先来想要个问题,就是依赖关系和依赖方法 依赖关系:所谓依赖关系就表明两个事物(这里指目标文件和依赖文件)之间关系(就像现实生活中两个人之间的关系一样...这样我们就很好理解了,上述makefile文件中,code作为目标文件、code.c作为依赖文件、通过依赖关系gcc code.c -o code来生成目标文件。 2....伪目标.PHONY 对于上述makefile,我们连续执行多次make就会发现,不能执行 但是我们如果连续指向多次make clean,它并没有出错 到这里一个可能想到是.PHONY的作用了;那这到底是什么呢...伪目标:.PHONY修饰,伪目标它总是被执行的;像clean这种的目标文件,一般都设置成伪目标 对于这个,可以解释为: 伪目标clean不依赖于任何文件,执行make clean生成clean目标文件就会执行依赖方法

    25710

    5个编写高效Makefile文件的最佳实践

    在本文中,我们将讨论如何编写高效的Makefile文件,以提高我们的开发效率和产品质量 --- 确定目标 在编写Makefile文件之前,我们需要明确我们的目标是什么。...例如,$@代表目标文件名,$的Makefile文件更加简洁和易于维护。 此外,我们可以使用其他自动变量来进一步简化我们的Makefile。...通过这个规则,我们可以轻松地编译所有的.c文件,而不需要为每个文件都编写一个单独的规则。 --- 使用.PHONY规则 .PHONY规则可以使我们更加精确地指定Makefile文件中的目标。...例如,我们可以使用以下规则来定义.PHONY目标: .PHONY: all clean all: $(TARGET) clean: rm -rf $(OBJS) $(TARGET) ---...为了使我们的Makefile文件更加简洁、易于维护和灵活,可以通过一些技巧,包括使用变量、自动变量、模式规则和.PHONY规则。 除此之外,我们还需要关注一些其他的方面。

    30420
    领券