使用自动工具执行sql语句

p5fdfcr1  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(309)

我正在写一个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 ).
你知道怎么做吗?

jtw3ybtb

jtw3ybtb1#

当前makefile.am包含显式规则:

installdb: 
    $(MYSQL) <./installdb.sql

哪里 ./installdb.sql 包含 CREATE FUNCTION 声明。但是,在源树外部构建时,它不起作用
假设 installdb.sql 是包发行版中包含的文件,而不是生成的文件,不,在源代码外生成中不起作用,因为“ ./installdb.sql “将不会引用现有文件。如果您希望构建配方引用的文件既不是规则的先决条件,也不是由其他规则生成的目标,那么就不能指望有魔力——您需要通过可用路径指定所需的文件。如果在构建规则中显式引用了先决条件,则这一点甚至适用于先决条件。 VPATH 构建操作通过 make 的自动变量,例如 $< 以及 $^ .
和gnu make 有办法解决这个问题。与当前目录对应的源树目录的路径 make 的工作目录始终可通过 $(srcdir) 变量。使用它,你的食谱看起来更像这样:

installdb: 
    $(MYSQL) < $(srcdir)/installdb.sql

对于源代码内部版本, $(srcdir) 将评估为 . ,因此在这种情况下,上述内容与您开始使用的内容相同。对于源代码外版本, $(srcdir) 将包含适当的路径。
有时,引用源树的根也很有用。例如,您可能希望引用源根目录的直接子目录中的文件,而不引入对源树结构的其他依赖关系。为此,你可以使用 $(top_srcdir) 引用源树根。
这些细节在当前的automake文档中没有明确的介绍,但是您可以在其他gnu文档中找到它们。
用户必须调用 make installdb 明确地(虽然我希望它是 make install ).
嗯,是的,automake并不认为你提供规则的每个目标都必须由一个 make install . 甚至不是所有它自己产生的目标都是这样执行的。但automake确实有一些机制来指示应该包括哪些用户提供的规则,以及在什么时候。本手册第23.1节对此进行了说明。
在您的情况下,我将使用一个安装钩子,或者将您的目标重命名为 install-data-hook 或者宣布一个新的目标 installdb 以先决条件为目标。后者看起来是这样的:

install-data-hook: installdb

但是,前者对时间有更大的承诺,因此,如果在安装接近结束时执行数据库初始化非常重要,那么最好在钩子自己的方法中更改目标名称:

install-data-hook: 
    $(MYSQL) < $(srcdir)/installdb.sql

无论哪种方式,也要考虑可能需要什么(如果有的话)相应的卸载规则。另外,如果你保留你的 installdb 目标,那么将其标记为虚假是一种好的形式:

PHONY = installdb

这样可以避免在由于某种原因而在build目录中碰巧出现该名称的实际文件时发生破坏。

相关问题