如何在 Makefile.am 中发出新的编译命令?

How to issue a new compile command in Makefile.am?

我正在构建一个如下所示的库(使用 Autotools)。当我将 *.cpp 文件添加到 libmytest_la_SOURCES.

时,库的构建工作正常
lib_LTLIBRARIES = libmytest.la

libmytest_la_SOURCES = test.capnp.c++

libmytest_la_CXXFLAGS = -I/usr/include -I$(top_srcdir)/src/includes 

libmytest_la_LDFLAGS = -version-info 0:0:0 -L/usr/lib64

libmytest_la_LIBADD = -lcapnp

问题是在进行正常的编译过程之前,我需要调用第三方编译器来生成代码。以下 capnp 工具将生成一个名为 test.capnp.c++.

的 c++ 输出文件
capnp compile -oc++ test.capnp

如果我将那个 (test.capnp.c++) 的输出插入到上面的 makefile 中,我的库就建立好了。我不明白的是如何将该命令调用到 Makefile.am 中以生成所需的源文件并将其插入到 libmytest_la_SOURCES 变量中。

有什么想法吗?

Automake 不直接支持 capnp,添加对新语言或工具的支持需要破解程序。但是你 可以 在你的 Makefile.am 文件中提供普通的 make 规则,这些规则将被带入最终生成的 Makefile。这是 Automake 的主要扩展点。

因此,您可以将其添加到您的 Makefile 中:

test.capnp.c++ : test.capnp
     capnp compile -oc++ $<

# or
#    $(CAPNP) compile -oc++ $<
# where $(CAPNP) is the capnp binary as discovered by configure

您还想将 test.capnp 指定为要分发的附加文件:

EXTRA_DIST = test.capnp

您还应该考虑是否要将 .c++ 文件包含在分发包中,以减轻对 capnp 的构建时依赖性。如果不是,则不要将其列在 libmytest_la_SOURCES 中,而应将其列在 nodist_libmytest_la_SOURCES 中,另外还要列在 CLEANFILES:

#
# test.capnp.c++ is a built file that we choose not to distribute
#
nodist_libmytest_la_SOURCES = test.capnp.c++
CLEANFILES = test.capnp.c++

# or: CLEANFILES = $(nodist_libmytest_la_SOURCES)