使用make将m4预处理添加到任意语言

时间:2009-12-18 23:35:31

标签: makefile

我们有一个使用GNU make构建的ActionScript(Flex)项目。我们想在构建过程中添加一个M4预处理步骤(例如,这样我们就可以创建一个包含文件和行号的ASSERT()宏。)

我们遇到了非常大的困难。

我们目前的策略是:

  1. 创建一个目录“src / build”(假设源代码位于src /和子目录中)。
  2. 在src / build中,创建一个Makefile。
  3. 在src / build中运行make。
  4. 所需的行为是,make会使用我们编写的规则来发送* .as文件src /及其子目录,在build下创建新的* .as文件。例如:

    src/bar.as -> m4 -> src/build/bar.as
    src/a/foo.as -> m4 -> src/build/a/foo.as
    

    明显的制定规则是:

    %.as : ../%.as
        echo "m4 --args < $< > $@"
    

    这适用于bar.as但不适用于/ foo.as,显然是因为make对于拆分和重新打包目录是“聪明的”。 make -d揭示:

    Trying implicit prerequisite `a/../foo.as'.
    Looking for a rule with intermediate file `a/../foo.as'.
    

    但我们希望先决条件是“../a/foo.as”。这(我们不想要的)显然是记录在案的行为(http://www.gnu.org/software/make/manual/make.html#Pattern-Match)。

    有什么建议吗?是否有可能编写一个符合我们想要的模式规则?

    我们也尝试了VPATH并且它不起作用,因为生成的.as文件错误地满足了依赖性(因为。在VPATH的内容之前搜索。)。

    非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

一种选择是对未经过预处理的文件使用不同的扩展名。然后,您可以将它们放在同一目录中而不会发生冲突。

答案 1 :(得分:2)

正如Anon所说,你的源代码不再是Flex - 它是'预处理Flex'。因此,对源代码使用扩展名为“.eas”(对于Extended ActionScript),并创建一个“编译器”脚本,将“.eas”转换为“.as”文件,然后可以像以前一样进行处理。 / p>

您可能更喜欢使用Extended ActionScript编译器执行整个编译工作 - 将“.eas”直接转换为已编译的表单。

要注意的主要事项是确保在派生的'.as'文件之前考虑'.eas'文件。否则,您在'.eas'文件中的更改将不会被拾取,从而导致头发撕裂和其他不良行为(例如头部撞击,例如“撞墙撞击”),当您尝试调试没有的代码时即使消息来源已经改变了。