【问题标题】:Sort filenames based on dependencies根据依赖对文件名进行排序
【发布时间】:2012-03-21 03:41:06
【问题描述】:

我有一个由 makefile 格式的程序生成的依赖项列表,即

 dependent_resource: dependency1 dependency2

但是我的最终程序,它结合了这些资源,实际上需要按依赖顺序排列文件,即所有依赖项都必须在依赖资源之前提供。

有没有什么工具可以使用这些makefile依赖文件,对资源列表进行排序,以便稍后被编译器处理?

编辑

依赖文件的简单转换将不起作用,因为我对每个资源都有一个依赖文件,并且依赖项可能在文件中出现多次(作为不同资源的依赖项)。

最好的方法很可能是直接从 make 本身获取依赖项。它必须至少隐式​​地提供依赖项,因为它将按照我稍后需要提供它们的相同顺序构建依赖项。但我不知道如何从正在运行的 make 中提取它们。

【问题讨论】:

  • @MДΓΓБДLL:是的,我非常了解算法。然而,在 GNU Make 中实现它根本不是一个有趣的练习。也就是为什么我要找一个外部工具,实现算法和解析依赖文件。

标签: makefile dependencies


【解决方案1】:

你可以使用 Make 本身。假设您的依赖文件名为dependencyFile。然后运行这个makefile:

EVERYTHING := $(shell cat dependencyFile | sed 's/:/ /')

all: $(EVERYTHING)
    @

%:
    @echo $@

include dependencyFile

【讨论】:

  • 不幸的是,这不起作用,因为我有多个依赖文件,并且文件可能在不同的文件中被多次提及。此外,您发布的当前命令会将依赖资源放在依赖项之前。但是我在依赖项之后需要它(可以通过更改 sed 语句以重新排序依赖项来轻松修复该部分)。
  • @LiKao,你应该在一开始就提到你有多个依赖项列表,但是将这种方法应用于多个文件很容易。让我们先让另一部分工作;我已经测试过这个,它会在“依赖资源”之前打印依赖关系。试试看。如果我们能就此达成一致,那么我可以为多个文件编辑我的答案。你有什么形式的文件名列表? (我怀疑你有一些具体的想法。)
  • 对我来说,echo "dependent_resource: dependency1 dependency2" | sed 's/:/ /' 产生 dependent_resource dependency1 dependency2,这是错误的顺序。正如我所说,这很容易使用sed 's/\([^:]*\):\(.*\)/\2 \1/' 来解决。文件列表可通过 make 中的一些变量获得。
  • @LiKao,变量的文件顺序与依赖文件中的顺序相同,可能有重复。 makefile 以正确的顺序报告文件,不重复。您是否想要生成文件变量形式的列表(忘记告诉我们)?
  • 好吧,我完全误读了你的答案。现在我知道这是如何工作的,我可能能够将其调整为多个文件。感谢您的帮助,很抱歉给您带来麻烦。
猜你喜欢
  • 2010-10-31
  • 2020-04-01
  • 1970-01-01
  • 2021-06-06
  • 2011-05-05
  • 2016-04-08
  • 2017-07-18
  • 2016-01-13
相关资源
最近更新 更多