2010-03-26 43 views
1

我有一个使用OMake构建系统的项目,并且我正在尝试处理一个相当艰难的角落案例。如何在构建目标列表生成器时处理OMake中未知目标的构建规则

我有一些定义文件和一个工具,可以将这些定义文件和创建GraphViz文件。有两个问题,但:

  • 每个定义文件可以产生多个图形,它可以产生的图形列表编码在文件中。我的转储工具确实有一个-list选项,其中列出了定义文件将生成的所有图形。
  • 此转储工具内置于源代码树中。
  • 我想要这个列表在OMakefile中可用,所以我可以使用其他规则将DOT文件转换为SVG,并假冒一个目标取决于所有SVG(目标:构建SVG描述的所有图形)。

如果我只有第一个问题,它会很容易 - 我会运行该工具来构建一个列表,然后使用该列表构建一个调用dumper输出GraphViz文件的目标。不过,我宁愿强迫转储工具在需要之前建造。

如果这是make,我只会递归运行make来构建转储工具。但OMake不允许递归调用,并且build函数仅可用于osh

对于这个问题的一个很好的解决方案的任何建议?

回答

1

好的,这是我的建议。首先,这是一个用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 []变量。

然后,生成DOTS和SVGS变量以及将点转换为svg的规则变得微不足道。默认目标取决于svgs的列表,它将按顺序构建所有内容。

这种方法的问题在于,构建生成器相当粗糙,因为我们必须将“INCLUDE”依赖项列表作为实际文件。尽管如此,这至少应该以正确的顺序执行操作。

请注意,如何修改generator.txt(例如,添加另一个要生成的.dot,或者更改生成.dot的内容的方式)会正确强制重新生成generator.sh,然后生成任何生成的文件将被修改。

编辑

我认为主要的问题是,omake希望能够开始做任何工作之前生成整个依赖图。因此,它不能在一些依赖项上构建生成器,然后生成更多的依赖项来处理其输出。

我想有办法来解决:

  • 第一种是已经发电机建成在.include指令的一部分,我先说明,这是一个麻烦,因为你必须将所有生成器构建过程放入该指令中。

  • 第二个是失去一定的灵活性,并将一个输入作为一个输出,例如让生成器只生成一个包含所有并置输入的文件。正如你知道你只有一个文件,你可以很容易地设置依赖关系。

  • 第三个,这将是我最喜欢的,是有一个2阶段构建系统。在一个子目录中,你有一个OMakefile生成生成器并输出文件。在另一个子目录中,您有另一个OMakefile,它读取第一个目录的内容以生成要处理的文件列表,然后运行转换。然后,在主目录中,bash脚本在第一个目录中调用omake,然后在第二个目录中调用omake。这有希望意味着你可以用一个命令产生所有的东西,而且重建也是最小的:第一个omake只会在输入发生变化时重新生成文件,第二个omake只会转换已更改或新的文件。

+0

谢谢。我用INCLUDE试过类似的解决方案。但是,我的发生器程序本身就是一个非常重要的OCaml程序。我没有意识到INCLUDE deps必须是真实的文件,并试图将我的程序用作依赖项;这没有奏效(程序未能建立)。由于OMake缺乏对递归构建的支持,我没有看到直接使用此解决方案的方法。任何建议在这方面? – 2010-04-14 01:22:00

相关问题