我正在写一个mysql自定义函数库。构建系统基于 GNU Autotools
. 共享库的编译和安装本身运行良好。但是,要使用自定义项,我们需要执行一些sql语句,如下所述:
CREATE FUNCTION metaphon RETURNS STRING SONAME 'udf_example.so';
电流 Makefile.am
包含显式规则:
installdb:
$(MYSQL) <./installdb.sql
哪里 ./installdb.sql
包含 CREATE FUNCTION
声明。但是,在源树外部构建时,它不起作用,用户必须调用 make installdb
明确地(虽然我希望它是 make install
).
你知道怎么做吗?
1条答案
按热度按时间jtw3ybtb1#
当前makefile.am包含显式规则:
哪里
./installdb.sql
包含CREATE FUNCTION
声明。但是,在源树外部构建时,它不起作用假设
installdb.sql
是包发行版中包含的文件,而不是生成的文件,不,在源代码外生成中不起作用,因为“./installdb.sql
“将不会引用现有文件。如果您希望构建配方引用的文件既不是规则的先决条件,也不是由其他规则生成的目标,那么就不能指望有魔力——您需要通过可用路径指定所需的文件。如果在构建规则中显式引用了先决条件,则这一点甚至适用于先决条件。VPATH
构建操作通过make
的自动变量,例如$<
以及$^
.和gnu
make
有办法解决这个问题。与当前目录对应的源树目录的路径make
的工作目录始终可通过$(srcdir)
变量。使用它,你的食谱看起来更像这样:对于源代码内部版本,
$(srcdir)
将评估为.
,因此在这种情况下,上述内容与您开始使用的内容相同。对于源代码外版本,$(srcdir)
将包含适当的路径。有时,引用源树的根也很有用。例如,您可能希望引用源根目录的直接子目录中的文件,而不引入对源树结构的其他依赖关系。为此,你可以使用
$(top_srcdir)
引用源树根。这些细节在当前的automake文档中没有明确的介绍,但是您可以在其他gnu文档中找到它们。
用户必须调用
make installdb
明确地(虽然我希望它是make install
).嗯,是的,automake并不认为你提供规则的每个目标都必须由一个
make install
. 甚至不是所有它自己产生的目标都是这样执行的。但automake确实有一些机制来指示应该包括哪些用户提供的规则,以及在什么时候。本手册第23.1节对此进行了说明。在您的情况下,我将使用一个安装钩子,或者将您的目标重命名为
install-data-hook
或者宣布一个新的目标installdb
以先决条件为目标。后者看起来是这样的:但是,前者对时间有更大的承诺,因此,如果在安装接近结束时执行数据库初始化非常重要,那么最好在钩子自己的方法中更改目标名称:
无论哪种方式,也要考虑可能需要什么(如果有的话)相应的卸载规则。另外,如果你保留你的
installdb
目标,那么将其标记为虚假是一种好的形式:这样可以避免在由于某种原因而在build目录中碰巧出现该名称的实际文件时发生破坏。