我有一个使用OMake构建系统的项目,我正在尝试处理一个相当棘手的问题。
我有一些定义文件和一个工具,可以接受这些定义文件并创建GraphViz文件。然而,有两个问题:
-list选项,它列出了定义文件将生成的所有图形。如果我只有第一个问题,那就很容易了--我将运行这个工具来构建一个列表,然后使用这个列表来构建一个目标,该目标调用dumper来输出GraphViz文件。但是,在需要转储工具之前,我不得不强制构建它。
如果这是make,我只需递归地运行make来构建转储工具。然而,OMake不允许递归调用,而且build函数只能从osh中使用。
对这个问题有什么好的解决办法吗?
发布于 2010-04-13 23:26:08
好吧,这是我的提议。首先,这里有一个bash中的快速生成器,它可以使用一个“- list”参数来创建一个omake变量来包含要做的事情的列表。生成器被称为"generator.txt",因为我们要通过将它重命名为.sh来“制造”它。
#!/bin/bash
if [ "$1" = "--list" ]; then
echo -e 'FILES[] = \n\ta\n\tb\n\tc'
else
echo 1 > a.dot
echo 2 > b.dot
echo 3 > c.dot
fi然后,OMakefile本身:
.INCLUDE: rules : generator.txt
cp generator.txt generator.sh
chmod 755 generator.sh
./generator.sh
./generator.sh --list > rules
DOTS[] =
$(addsuffix .dot, $(FILES))
SVGS[] =
$(addsuffix .svg, $(FILES))
# rule to turn a .dot into a .svg
%.svg: %.dot
cp $*.dot $*.svg
.DEFAULT: $(SVGS)
.PHONY: clean
clean:
rm -f generator.sh a.* b.* c.* rules这里的诀窍是从generator.txt生成“规则”文件,并将其包含在OMakefile中。每当generator.txt (生成器的源代码)更改时,我们重新创建(构建)生成器,运行它(创建文件a.dot、b.dot、c.dot),最后使用- list来生成包含要生成的文件列表的FILE[]变量。
然后,生成点和SVGS变量以及将点转换为svg的规则变得非常简单。默认目标取决于svgs列表,它将按顺序构建所有内容。
这种方法的问题是构建生成器非常粗糙,因为我们必须将“包括”依赖项列表作为实际文件。然而,这至少应该以正确的顺序执行操作。
注意修改generator.txt (例如,添加要生成的另一个.dot,或更改.dot内容的生成方式)是如何正确地强制重新生成generator.sh,然后是对任何已被修改的文件进行重新生成。
编辑
我认为主要的问题是,omake希望能够在开始工作之前生成整个依赖关系图。因此,它不能在某些依赖项上构建生成器,然后生成更多的依赖项来处理其输出。
我想有办法解决这个问题:
https://stackoverflow.com/questions/2525803
复制相似问题