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

13.自动依赖生成关系(下)

目录1.问题2.解决思路3.初步的代码设计4.不是问题的问题5.问题本质分析6.解决方案优化7.include暗黑操作一:8.include暗黑操作二

目录

 

1.问题

2.解决思路

3.初步的代码设计

4.不是问题的问题

5.问题本质分析

6.解决方案优化

7.include暗黑操作一:

8.include暗黑操作二

9.include暗黑操作三

10.关于include的总结一

11.关于include的总结二

12.关于include的总结三




1.问题

如何在makefile中组织.dep文件到指定目录?


2.解决思路


  • 当include发现.dep文件不存在:

             1.通过规则和命令创建deps文件

             2.将所有.dep文件创建到deps文件夹

             3..dep文件中记录目标文件的依赖关系


3.初步的代码设计

这样就是先生成dep文件在创建,目录

打开警告,发现include时找不到DEPS目标所以报错,如果不打开-include就会执行all

完善如下,我们使用预定义函数过滤掉目录


.PHONY : all cleanMKDIR := mkdir
RM := rm -fr
CC := gccDIR_DEPS := depsSRCS := $(wildcard *.c)
DEPS := $(SRCS:.c=.dep)
DEPS := $(addprefix $(DIR_DEPS)/, $(DEPS))include $(DEPS)all : @echo "all"$(DIR_DEPS) :$(MKDIR) $@$(DIR_DEPS)/%.dep : $(DIR_DEPS) %.c@echo "Creating $@ ..."@set -e; \$(CC) -MM -E $(filter %.c, $^) | sed 's,\(.*\)\.o[ :]*,objs/\1.o : ,g' > $@clean :$(RM) $(DIR_DEPS)

4.不是问题的问题

为什么有一些.dep依赖文件会被重复创建多次?


5.问题本质分析


  • deps文件夹的时间属性会依赖文件创建而发生改变
  • make发现deps文件夹比对应的目标更新
  • 触发相应规则的重新解析和命令的执行

6.解决方案优化

使用ifeq动态决定.dep目标的依赖

make clean不需要include,完善如下


.PHONY : all cleanMKDIR := mkdir
RM := rm -fr
CC := gccDIR_DEPS := depsSRCS := $(wildcard *.c)
DEPS := $(SRCS:.c=.dep)
DEPS := $(addprefix $(DIR_DEPS)/, $(DEPS))all : @echo "all"ifeq ("$(MAKECMDGOALS)", "all")
-include $(DEPS)
endififeq ("$(MAKECMDGOALS)", "")
-include $(DEPS)
endif$(DIR_DEPS) :$(MKDIR) $@ifeq ("$(wildcard $(DIR_DEPS))", "")
$(DIR_DEPS)/%.dep : $(DIR_DEPS) %.c
else
$(DIR_DEPS)/%.dep : %.c
endif@echo "Creating $@ ..."@set -e; \$(CC) -MM -E $(filter %.c, $^) | sed 's,\(.*\)\.o[ :]*,objs/\1.o : ,g' > $@clean :$(RM) $(DIR_DEPS)

7.include暗黑操作一:

使用减号(-)不但关闭了include发出的警告,同时关闭了错误;当错误反生时make将忽略这些错误!


8.include暗黑操作二

如果include触发规则创建了文件,之后还会发生什么?

答:先执行创建在回去执行all

.PHONY : all-include test.txtall : @echo "this is all"test.txt :@echo "creating $@ ..."@echo "other : ; @echo "this is other" " > test.txt

9.include暗黑操作三

如果include包含的文件存在,之后还会发生什么?

答:将不再执行test这条规则

.PHONY : all-include test.txtall : @echo "this is all"test.txt : @echo "creating $@ ..."

10.关于include的总结一


  • 当目标文件不存在

                   以文件名查找规则,并执行


  • 当目标文件不存在,且查找的规则中创建了目标文件

                  将创建成功的目标文件包好进当前makefile


11.关于include的总结二


  • 当目标文件存在

            将目标文件包含进当前makefile

           以目标文件名查找是否有相应规则


12.关于include的总结三


  • 当目标文件存在,且目标名对应的规则被执行

           规则中的命令更新了目标文件

                  √make重新包含目标文件,替换之前包含的内容

           目标文件未被更新

                  √NULL(无操作)

.PHONY : all-include test.txtall : @echo "$@ : $^"test.txt : b.txt@echo "creating $@ ..."@echo "all : c.txt" > test.txt

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


推荐阅读
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • centos 7.0 lnmp成功安装过程(很乱)
    下载nginx[rootlocalhostsrc]#wgethttp:nginx.orgdownloadnginx-1.7.9.tar.gz--2015-01-2412:55:2 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • 我们正在使用GNU Make来构建我们的系统,在makefile文件的末尾,我们通过一个名为Makedepends的包含来生成一系列的.d文件。然而,当文件被删除或移动时,依赖关系会中断,我们需要寻找一种方法来优雅地处理这种情况。 ... [详细]
  • C基本语法C程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。对象-对象具有状态和行为 ... [详细]
  • GCC(GNU Compiler Collection)是GNU项目下的一款功能全面且高效的多平台编译工具,广泛应用于Linux操作系统中。本文将详细介绍GCC的特点及其基本使用方法。 ... [详细]
  • 本文介绍了如何在Windows操作系统中安装FFTW库,并详细说明了使用Visual Studio 2010进行4096点快速傅里叶变换(FFT)的步骤。包括下载预编译文件、生成库文件以及配置环境等关键环节。 ... [详细]
  • C语言是计算机科学和编程领域的基石,许多初学者在学习过程中会感到困惑。本文将详细介绍C语言的基本概念、关键语法和实用示例,帮助你快速上手C语言。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 求助高手:下载的压缩包中包含CMake文件,如何在Windows环境下使用已安装的CMake GUI进行运行?
    从GitHub仓库 `https://github.com/vonmax007/RobotSimulation` 下载的代码包含多种算法,其中算法1的文件目录中包含了CMake文件。为了在Windows环境下使用已安装的CMake GUI运行这些文件,需要先确保CMake已正确安装,并按照以下步骤操作:打开CMake GUI,设置源代码路径和构建路径,点击“Configure”配置项目,然后点击“Generate”生成构建文件。最后,在生成的构建目录中使用命令行或IDE进行编译和运行。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 本文总结了在使用React Native开发过程中遇到的一些常见问题及其解决方法,包括配置错误、依赖问题和特定组件的使用技巧。 ... [详细]
  • 本书详细介绍了在最新Linux 4.0内核环境下进行Java与Linux设备驱动开发的全面指南。内容涵盖设备驱动的基本概念、开发环境的搭建、操作系统对设备驱动的影响以及具体开发步骤和技巧。通过丰富的实例和深入的技术解析,帮助读者掌握设备驱动开发的核心技术和最佳实践。 ... [详细]
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社区 版权所有