如何在Makefile.am中添加自定义编译命令生成capnp代码后编译库
解决方案
你可以通过Automake的内置特殊变量BUILT_SOURCES绑定自定义代码生成规则,实现预期的预编译流程,修改后的完整Makefile.am配置如下:
lib_LTLIBRARIES = libmytest.la # 声明预生成源文件,Automake会在常规编译前优先构建该类文件 BUILT_SOURCES = test.capnp.c++ 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源文件,改动后自动重新生成 test.capnp.c++: test.capnp capnp compile -oc++ $< # 声明清理范围,make clean时自动删除生成的代码文件 CLEANFILES = test.capnp.c++ test.capnp.h
配置说明
BUILT_SOURCES是Automake预留的特殊变量,所有写入该变量的文件都会被调整到编译队列最前方执行,匹配预生成代码的时序要求- 自定义的生成规则明确了代码的依赖关系,只要
test.capnp有修改,下次构建时会自动重新执行capnp命令更新输出文件 - 生成的
.h头文件也加入CLEANFILES,避免旧版本残留导致的编译异常
如果需要在configure阶段就检查capnp工具是否存在,可以在configure.ac中加入如下配置:
AC_CHECK_PROG([CAPNP], [capnp], [yes], [no]) if test "x$CAPNP" = "xno"; then AC_MSG_ERROR([capnp tool not found, please install capnproto first]) fi
内容的提问来源于stack exchange,提问作者Ender
相关产品推荐
相关产品推荐

