首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构建目标列表生成器时如何处理OMake中未知目标的生成规则

构建目标列表生成器时如何处理OMake中未知目标的生成规则
EN

Stack Overflow用户
提问于 2010-03-26 18:37:57
回答 1查看 606关注 0票数 1

我有一个使用OMake构建系统的项目,我正在尝试处理一个相当棘手的问题。

我有一些定义文件和一个工具,可以接受这些定义文件并创建GraphViz文件。然而,有两个问题:

  • 每个定义文件可以生成多个图,它可以生成的图形列表在文件中进行编码。我的转储工具有一个-list选项,它列出了定义文件将生成的所有图形。
  • 这个转储工具构建在源代码树中。
  • 我希望这个列表在OMakefile中可用,这样我就可以使用其他规则将DOT文件转换成SVG,并且有一个虚假的目标依赖于所有的SVG (目标:构建SVG对所有图形的SVG描述的单个构建命令)。

如果我只有第一个问题,那就很容易了--我将运行这个工具来构建一个列表,然后使用这个列表来构建一个目标,该目标调用dumper来输出GraphViz文件。但是,在需要转储工具之前,我不得不强制构建它。

如果这是make,我只需递归地运行make来构建转储工具。然而,OMake不允许递归调用,而且build函数只能从osh中使用。

对这个问题有什么好的解决办法吗?

EN

回答 1

Stack Overflow用户

发布于 2010-04-13 23:26:08

好吧,这是我的提议。首先,这里有一个bash中的快速生成器,它可以使用一个“- list”参数来创建一个omake变量来包含要做的事情的列表。生成器被称为"generator.txt",因为我们要通过将它重命名为.sh来“制造”它。

代码语言:javascript
复制
#!/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本身:

代码语言:javascript
复制
.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希望能够在开始工作之前生成整个依赖关系图。因此,它不能在某些依赖项上构建生成器,然后生成更多的依赖项来处理其输出。

我想有办法解决这个问题:

  • 第一个是将生成器构建为.INCLUDE指令的一部分,正如我前面所描述的那样,这是一个麻烦,因为您必须将所有生成器构建过程都放入该指令中。
  • 第二个命令将失去一些灵活性,并将一个输入处理到一个输出,例如,让生成器生成一个包含所有级联输入的文件。正如您所知道的,您将只有一个文件,您可以很容易地设置依赖项,
  • 第三个文件是一个2阶段构建系统,这将是我最喜欢的。在子目录中,您有一个生成生成器并输出文件的OMakefile。在另一个子目录中,您有另一个OMakefile,它读取第一个目录的内容以生成要处理的文件列表,然后运行转换。然后,在主目录中,bash脚本在第一个目录中调用omake,然后在第二个目录中调用omake。希望这意味着您可以使用单个命令生成所有内容,但重建也将是最小的:第一个omake只在输入发生更改时才重新生成文件,而第二个omake只转换已更改或新的文件。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2525803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档