热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

寻求一种能够处理文件丢失的Makefile依赖规则

我们正在使用GNUMake来构建我们的系统,在makefile文件的末尾,我们通过一个名为Makedepends的包含来生成一系列的.d文件。然而,当文件被删除或移动时,依赖关系会中断,我们需要寻找一种方法来优雅地处理这种情况。

在我们的系统构建过程中,我们采用了GNU Make工具。在每个makefile文件的结尾,我们通过一个名为Makedepends的指令来生成多个.d文件,这些文件是通过gcc的-MM选项生成的。接着,我们使用include $(CXXFILES:.cc=.d)语句为每个.cc文件包含相应的.d文件。然而,当文件被删除或移动时,依赖关系检查步骤会出现问题,导致我们需要手动删除.d文件,即便是执行make clean也无法解决,因为依赖项检查失败导致整个过程无法正常进行。


是否存在一种方法,可以在生成或包含这些依赖.d文件时,优雅地处理文件的删除或重定位?


例如:假设我有一个serial.cc文件,makefile会生成一个serial.d文件,该文件声明了一个对buffer.h的依赖。之后,我对代码进行了修改,不再需要buffer.h,并且删除了这个文件。下一次运行make时,由于serial.d文件中仍然存在对buffer.h的依赖,这将导致构建过程失败。


解决方案



#1




网站make.mad-scientist.net/papers/advanced-auto-dependency-generation详细描述了这个问题,并提供了一些解决方案。虽然其中的第一个建议有些误导,但高级方案基本上是正确的,能够有效解决问题。




#2




有两种可能的解决方案:


第一种,你可以在Makefile中添加一条规则来运行依赖关系生成步骤:


.SUFFIXES: .d

%.d::
makedepend_command_here

如果上述方法不可行,根据GNU Make的文档中的“最后手段”部分,可以尝试以下方法:



例如,在测试makefile时,你可能不关心源文件是否包含实际数据,只关心它们是否存在。这时可以这样做:


%::
touch $@

这样可以自动创建所有作为先决条件的源文件。



这种方法是否可以为你创建空的.d文件呢?




#3




如果你使用makepp工具,并启用--rm-stale选项,它可以识别出无法构建的文件并将其删除。如果这是一个常见的需求,你可以将此选项添加到构建树根目录下的.makepprc文件中,以便每次构建时都使用它。


此外,makepp能够自行处理所有的依赖关系检测,因此你无需在makefile中添加复杂的依赖关系管理。它甚至优于传统的gcc -MM方法,能够在编译器需要之前及时生成必要的头文件。


makepp的功能远不止于此。除了具备GNU make的所有功能外,还提供了许多其他有用的特性,甚至支持通过Perl编程来扩展makefile。



推荐阅读
  • VMware 15.5.7 中文版激活方法
    本文提供了一种有效的方法来激活 VMware 15.5.7 的中文版本,同时介绍了如何利用最新的激活码进行操作,确保用户能够顺利使用。 ... [详细]
  • 本文探讨了Linux环境下线程私有数据(Thread-Specific Data, TSD)的概念及其重要性,介绍了如何通过TSD技术避免多线程间全局变量冲突的问题,并提供了具体的实现方法和示例代码。 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • oracle 对硬件环境要求,Oracle 10G数据库软硬件环境的要求 ... [详细]
  • Vulnhub DC3 实战记录与分析
    本文记录了在 Vulnhub DC3 靶机上的渗透测试过程,包括漏洞利用、内核提权等关键步骤,并总结了实战经验和教训。 ... [详细]
  • MyBatisCodeHelperPro 2.9.3 最新在线免费激活方法
    MyBatisCodeHelperPro 2.9.3 是一款强大的代码生成工具,适用于多种开发环境。本文将介绍如何在线免费激活该工具,帮助开发者提高工作效率。 ... [详细]
  • 第三周课堂测试1、使用汇编语言编写指令时,用一些简单的容易记忆的符号来代替二进制指令,比机器语言更为方便,属于高级语言。(B ... [详细]
  • DropBlock:一种卷积网络的正则化技术
    本文详细探讨了DropBlock这一正则化方法在卷积神经网络中的应用与效果。通过结构化的dropout方式,即在特征图中连续区域内的单元同时被丢弃,DropBlock有效解决了传统dropout在卷积层应用时效果不佳的问题。更多理论分析及其实现细节可参考原文链接。 ... [详细]
  • 深入理解Java类加载机制及安全防护
    本文探讨了Java类加载的过程,包括加载、验证、准备、解析和初始化五个阶段,并详细解释了每个阶段的具体操作和意义。此外,文章还讨论了Java如何通过双亲委派模型来保障核心API的安全性,以及在特定情况下如何打破这一机制。 ... [详细]
  • 移动端浏览器为了识别用户的双击放大操作,通常会在点击后引入300毫秒的延迟。虽然这种延迟在日常使用中可能不易察觉,但对于需要即时响应的应用(如网页游戏)来说,消除这一延迟至关重要。 ... [详细]
  • 本文详细探讨了在 Xamarin.Forms 中使用 AbsoluteLayout 进行精确布局的方法,以及如何利用 Device.StartTimer 实现定时任务。通过具体的代码示例,帮助开发者更好地理解和应用这些功能。 ... [详细]
  • GCC(GNU Compiler Collection)是GNU项目下的一款功能全面且高效的多平台编译工具,广泛应用于Linux操作系统中。本文将详细介绍GCC的特点及其基本使用方法。 ... [详细]
  • 本文探讨了如何利用数组来构建二叉树,并介绍了通过队列实现的二叉树层次遍历方法。通过具体的C++代码示例,详细说明了构建及打印二叉树的过程。 ... [详细]
  • 在CentOS 7中部署Nginx并配置SSL证书
    本文详细介绍了如何在CentOS 7操作系统上安装Nginx服务器,并配置SSL证书以增强网站的安全性。适合初学者和中级用户参考。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
author-avatar
覃维欢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有