gpt4 book ai didi

Makefile:依赖于目录的每个文件

转载 作者:行者123 更新时间:2023-12-04 15:37:01 24 4
gpt4 key购买 nike

我想做一个使用 gnumake 或 makepp 运行的 Makefile 来打包给定目录下的所有文件:

DIRS:=$(shell find . -mindepth 2 -maxdepth 2 -not -name mp3 -not -name ".*" -type d)
PACKAGES = $(DIRS:%=%.npk)

all: packages

packages: $(PACKAGES)

%.npk: %/*
npack c $@ @^

.PHONY: all packages

问题是依赖项中没有 %/* 这样的东西。
我需要目标 (X.npk) 依赖于目录 X 中的每个文件,但是我在编写 Makefile 时不知道这些文件是什么,因为它们是稍后生成的。

一个例子:
./dirA/x
./dirA/y
./dirB/e
./dirB/f

我想创建 ./dirA.npk (取决于 x,y), ./dirB.npk (e,f)
除了第一行中使用的 find 找到所有目录之外,我对目录或文件一无所知。

最佳答案

尝试使用 wildcard指示:

DEPS := $(foreach dir, $(DIRS), $(wildcard $(dir)/*))

%.npk: $(DEPS)
npack c $@ $^

编辑:
以上只是使用 wildcard的一个例子并使每个 .npk 文件依赖于所有其他文件夹中的文件。您的用法会略有不同。

我认为可能有更简单的方法来解决这个问题。为什么要依赖文件夹中的所有文件?难道只是为了使用 $^运算符(operator)?或者,如果任何文件发生更改,您是否需要重建 .npk?

一种替代(可能更清洁)的解决方案是使用 find您的食谱中的实用程序,而不是 $^并使用 .FORCE指令总是强制重建 .npk 文件。缺点是 .npk 文件可能会不必要地重建。

编辑 2:
如果没有办法用 make 干净利落地做到这一点命令,您可以使用 .FORCE 解决它确保配方始终运行并将“我应该重建此文件”检查移到配方的正文中:
%.npk: .FORCE
check_for_rebuild.sh $@ && npack c $@ $^

哪里 check_for_rebuild.sh是一个执行如下操作的 shell 脚本:
#!/bin/bash
# Returns non-zero if the archive needs to be rebuilt
if [ -e $1 ]; then
folder_name=$(basename $1 .npk)
[ -z "$(find $folder_name -newer $1 -not -type d)" ] && return 0
fi
return 1

我真的不喜欢那个解决方案,因为它可以解决问题而不是直接解决它,但同时它可能能让你继续前进。如果你打算走那条路,在 shell 脚本中做所有事情可能更干净、更容易,要么让 makefile 简单地调用脚本,要么完全摆脱 makefile。

关于Makefile:依赖于目录的每个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5656913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com