如何使用配置本身的外部工具生成源代码?

How to generate source code using external tool from configure itself?

我需要在我的构建中从 Google 协议缓冲区规范 .proto 生成 .c.h

目前我遵循的方法是手动将依赖项记录到我生成的 .h 文件中。也就是我加了几个:

somefilethatincludesthegenerated.$(OBJEXT): mygenerated.h

并且与我构建 mygenerated.hmygenerated.c 的规则一起工作。我知道 BUILT_SOURCES,但这只适用于 make all,不适用于 make mytarget

所以我想探索从 configure 生成源代码的可能性,如 Automake manual 中所述。

AC_CONFIG_FILES 允许我从 mygenerated.h.in 生成 mygenerated.h 但实际上这个文件并不是要从模板生成的。这些文件将使用名为 protoc 的外部工具生成。在我的 Makefile.am 文件中,构建生成源的规则是:

mygenerated.c mygenerated.c: myprotofile.proto
  $(PROTOC) --proto_path=$(srcdir) --c_out=$(builddir) $^

如何从 configure 自身内部实现类似的东西?。我所追求的是始终在任何其他目标之前构建生成的源(BUILT_SOURCES 不适用于 allcheck 和其他一些目标以外的目标)

我使用 AC_CONFIG_COMMANDS 而不是 AC_CONFIG_FILES 成功了。

因此 运行 protoc(或本例中的 protoc-c)从 configure 添加以下内容到 configure.ac

AC_CONFIG_COMMANDS([src/mygenerated.h],
                   [protoc-c --proto_path=src --c_out=src src/myprotofile.proto])

然后当你 运行 ./configure 你会看到

config.status: executing src/mygenerated.h commands 

注意修改.proto文件需要重新运行./configure。这是 "generate sources from configure" 方法的缺点。