首页 > 其他分享 >make clean命令清理在不同目录中编译的对象

make clean命令清理在不同目录中编译的对象

时间:2023-10-21 09:55:23浏览次数:52  
标签:子目录 make Makefile SUBDIRS 编译 clean find


gnu-makemakefile  

Using Makefile to clean subdirectories

是否可以从父目录执行make clean,而该父目录又递归清除所有子目录,而不必在每个子目录中都包含makefile?

例如,当前在我的Makefile中,我有类似以下内容:

1
2
3
4
5
6
7
8
9
SUBDIRS = src, src1

.PHONY: clean subdirs $(SUBDIRS)

clean: $(SUBDIRS)
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c

$(SUBDIRS):
    $(MAKE) -C $(SUBDIRS) clean

但是,这要求我在src和src1中都具有一个Makefile。 否则,我会得到错误

1 No rule to make target clean

由于我仍然只想在每个子目录中运行命令" rm -rf * .o?core .depend ..cmd * .ko * .mod.c",因此似乎不得不在每个子目录中都包含一个Makefile,这是多余的。 完全相同的线清洁。 没有办法简单地在每个子目录中运行相同的clean命令吗?

 相关讨论  

 

  • 您可能只想让clean命令以递归方式删除文件。 参见:superuser.com/questions/61258/
  • 或只是循环循环遍历$(SUBDIRS)并手动运行每个rm。
  • 实际上,如果您仔细地编写顶级Makefile(或编写包含的单独的clean.mk makefile),那么我认为可以在该配方中$(MAKE) -C $@ -f clean.mk clean。 (注意$@而不是$(SUBDIRS)。-C接受单个参数而不是列表。)
  • 您将在子make上获得SUBDIRS变量的副本,这会破坏过程的递归部分。 仅当您具有相同的子目录(具有相同的名称)时,该计划才有效。

 

 


我同意您可以只对子目录执行rm命令。但是类似以下的内容仅允许使用单个makefile进行递归make:

1
2
3
4
5
6
7
8
9
10
SUBDIRS = . src src1
SUBDIRSCLEAN=$(addsuffix clean,$(SUBDIRS))

clean: $(SUBDIRSCLEAN)

clean_curdir:
    rm -rfv *.o *~ core .depend .*.cmd *.ko *.mod.c

%clean: %
    $(MAKE) -C $< -f $(PWD)/Makefile clean_curdir
 相关讨论  

 

  • 您如何在src或src1中递归一次?您如何知道其中有多少个子目录并构造变量SUBDIRS的新版本?
  • 该示例已完成。 运行make --debug将显示正在发生的事情。 如果硬编码列表不起作用,则类似find的东西可能会检测到子目录。

 

 


除了使用递归,您还可以使用find来获取目录列表,并进行一次迭代以生成通配符:

1
2
3
4
5
6
7
SUBDIR_ROOTS := foo bar
DIRS := . $(shell find $(SUBDIR_ROOTS) -type d)
GARBAGE_PATTERNS := *.o *~ core .depend .*.cmd *.ko *.mod.c
GARBAGE := $(foreach DIR,$(DIRS),$(addprefix $(DIR)/,$(GARBAGE_PATTERNS)))

clean:
    rm -rf $(GARBAGE)

 

 


@Christoph答案的变体:

1
2
3
4
5
6
7
8
9
# Exclude directory from find . command
# https://stackoverflow.com/questions/4210042/exclude-directory-from-find-command
GARBAGE_TYPES         :="*.gz(busy)" *.aux *.log *.pdf *.aux *.bbl *.log *.out *.synctex.gz *.fls
DIRECTORIES_TO_CLEAN  := $(shell find -not -path"./.git**" -not -path"./images**" -type d)
GARBAGE_TYPED_FOLDERS := $(foreach DIR, $(DIRECTORIES_TO_CLEAN), $(addprefix $(DIR)/,$(GARBAGE_TYPES)))

clean:
    $(RM) -rf $(GARBAGE_TYPED_FOLDERS)
    # echo $(GARBAGE_TYPED_FOLDERS)

这是乳胶文件的示例。由于文件类型名称上的括号,GARBAGE_TYPES上的第一个模式用双引号引起来。没有它,rm无法删除它们。其他模式不需要引号。

第二个DIRECTORIES_TO_CLEAN使用与要清除的目录列表相反的内容,即,要清除的目录列表。当您只有一个或两个目录(.git和images)不想清理,但又想清理其他所有内容时,此功能很有用。


您不能没有外部程序的帮助。最好的方法是在每个子目录中执行递归和调用的shell脚本(请看我对@robert的评论),这样的事情就可以完成工作(并且不依赖于GNU make功能)

1
2
3
4
5
6
#!/bin/sh
ROOTDIR=`/bin/pwd`
for dir in `find . -type d -print`
do
    make -C"${dir}" -f"${ROOTDIR}"/Makefile clean
done

当然,您可以将此序列(在目标cleanrec中)放入您的Makefile

1
2
3
4
5
6
cleanrec:
    ROOT=`/bin/pwd`; \
    for dir in `find . -type d -print`; \
    do \
        make -C"$${dir}" -f"$${ROOTDIR}"/Makefile clean; \
    done

并保存您的clean目标,以便在本地清理单个目录。原因是Makefile仅具有静态信息来执行make,并且您必须获得一些外部帮助才能知道每个目录中都有哪些子目录。因此,如果您要获得外部帮助,则最好使用find(1)和sh(1)这样的好工具

 

 

 

from:  https://www.codenong.com/26007005/

 

标签:子目录,make,Makefile,SUBDIRS,编译,clean,find
From: https://www.cnblogs.com/im18620660608/p/17778498.html

相关文章

  • Makefile详解—clean
    每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。这是一个“修养”。一般的风格都是: clean:rmedit$(objects) 更为稳健的做法是: .PHONY:cleanclean:-rmedit$(objects) 前面说过,.PHONY意思表示clean是一......
  • Makefile knowledge summarization
    WildcardThewildcardinmakefileissimilarwithmacroinC/C++,itisn'tsimilarwithwildcardinlinuxshell,soitdoesn'texpendautomatically.object1=*.c//*.cobject2=$(wildcard*.cpp)//main.cppt1.cppt2.cppAutomaticallygene......
  • Linux编译安装cmake
    #cmake官网https://cmake.org/#cmake各个版本源码仓库https://cmake.org/files/#下载wgethttps://cmake.org/files/v3.21/cmake-3.21.1.tar.gz#解压tarxvfcmake-3.21.1.tar.gz&&cdcmake-3.21.1/#引导安装程序帮助./bootstrap--help#创建安装目录mkdirbui......
  • QT cmake工程使用QXlsx源码操作execl,无需编译QXlsx,也不需要下载其他东西,windows和ubu
    一、下载地址:链接二、进入下载好的QXlsx目录下,取出QXlsx目录和README.md待用三、用qt创建一个简单的cmake工程,将QXlsx目录和README.md文件放到cmakelists.txt所在目录 四、修改cmakelists.txt文件cmake_minimum_required(VERSION3.5)project(xlsxTestLANGUAGESCXX)......
  • 创龙瑞芯微RK3568交叉编译(c和驱动module)
    前言由于项目需要,接触多个公司的RK3568,正点原子的,创龙的,迅为的。最后选择了创龙的。做了一段时间,发现给的教程和其他参考资料很少。所以必须一点一点得自己试验。以后的文章页会一点一点的写。希望给需要的小伙伴带个路。资料中大部分功能在用户资料里面有,小伙伴一步步可......
  • lamp编译安装的apache和php部分
     安装依赖包apr下载源码,且解压缩,然后编译安装即可wget-chttp://archive.apache.org/dist/apr/apr-1.5.2.tar.bz2[lamp-serverroot/usr/local/software-apache]$tar-xfapr-1.5.2.tar.bz2[lamp-serverroot/usr/local/software-apache]$[lamp-serverroot/usr/local/soft......
  • makefile中.PHNOY的用法
    makefile中PHONY的重要性     伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行所在规则定义的命令,有时也可以将一个伪目标称为标签。伪目标通过  PHONY来指明。   PHONY定义伪目标的命令一定会被执行,下面尝试分析这种优点的......
  • 内核编译obj-m和obj-y的区别
    在内核编译时,主要涉及一下文件:kernel/arch/arm/configs/*.defconfigkernel/driver/*/Makefilekernel/driver/*/Kconfig如果我们想要往内核中增加新的节点,还要涉及到设备树文件,kernel/arch/arm/boot/dts/在进行模块编译时,主要有两个选项,obj-m和obj-y,而与内核密切相关的是obj-y......
  • 【Linux驱动】内核模块编译 —— make modules 的使用(单模块编译、多模块编译)
    编译驱动一般采用的是将驱动编译成模块(.ko文件),然后加载到内核,这其中就用到了makemodules命令。目录一、单模块编译1、一个c文件编译成一个ko文件2、多个文件编译成一个ko文件二、多模块编译(多文件多模块)一、单模块编译1、一个c文件编译成一个ko文件下面是最简......
  • 麒麟系统开发笔记(十三):在国产麒麟系统上编译OSG库、搭建基础开发环境和移植测试Demo
    前言  在国产麒麟系统上实现C++三维仿真,使用OSG技术,其他基于web的技术也是可以但是交互上鼠标拽托等交互相对差一些,所以这块需要斟酌选择到底是何种技术来取舍。  本篇在厂家指定的麒麟系统上编译OSG。 环境系统版本:银河麒麟桌面操作系统V10(SP1)(注意:不对外提供)......