我正在尝试构建PowerDNS 3.3.1而不需要使用crypto ++作为依赖项。 configure脚本有一个选项--enable-cryptopp
来禁用库的使用。当我在配置期间提供--enable-cryptopp=no
参数时,后续构建在尝试构建cryptoppsigners.o
时失败。
不幸的是,我对开发方面的autotools并不熟悉。无论如何我试着挖掘。
查看configure.ac
,我可以看到定义条件的AM_CONDITIONAL(CRYPTOPP,test x"$enable_cryptopp" = "xyes")
,在pdns/Makefile.am
中,有条件用于几个地方以防止添加cryptoppsigners.cc
到一个源列表和-lcryptopp
到一个参数列表。尽管存在这些条件,但pdns / Makefile仍然在源列表和参数列表中包含cryptoppsigners.cc
。我也在Makefile am__objects_3 = cryptoppsigners.$(OBJEXT)
中看到,它最终被添加到pdns_server
目标;从这里开始,我似乎需要弄清楚这是怎么发生的。
在pdns/Makefile.in
文件中,我看到@CRYPTOPP_TRUE@am__objects_3 = cryptoppsigners.$(OBJEXT)
。我不知道如何查找@..@..
语法,但我猜测它应该只在设置CRYPTOPP_TRUE
时才分配变量。这让我觉得它设置了,但是,看configure.log
,我看到了:
CRYPTOPP_FALSE='#'
CRYPTOPP_TRUE=''
似乎应该是CRYPTOPP_FALSE
已设置且CRYPTOPP_TRUE
未设置。此时,我被困住了。如果未设置CRYPTOPP_TRUE
,为什么我的Makefile最终会在目标列表中使用该对象?
更新:事实证明,如果您只是关闭参数,则不会尝试编译cryptoppsigner.cc
。我仍然想知道这里发生了什么,我是否应该期待我从autotools那里得到的行为。
答案 0 :(得分:1)
致电' ./ configure'没有' - enable-cryptopp'正如我们在#powerdns中谈到的那样。
答案 1 :(得分:1)
这里发生的是他们的M4宏PDNS_WITH_CRYPTOPP
中的错误:
具体做法是:
AC_ARG_ENABLE([cryptopp],
[AS_HELP_STRING([--enable-cryptopp],[use Crypto++ @<:@default=no@:>@])],
[enable_cryptopp=yes],
[enable_cryptopp=no]
)
应该是:
AC_ARG_ENABLE([cryptopp],
[AS_HELP_STRING([--enable-cryptopp],[use Crypto++ @<:@default=no@:>@])]
)
enable_cryptopp
被设置为yes
无论是yes
还是no
作为参数(例如--enable-cryptopp=no
)在configure
} 命令行。这也具有--disable-cryptopp
启用此功能的效果。
同样的错误似乎在所有pdns_enable_
前缀宏以及m4 directory中的boost.m4
中以不同的变体进行复制。