象と戯れ

 | 

2011-04-22

EXTENSION対応のマルチバージョンMakefile

22:45 | EXTENSION対応のマルチバージョンMakefile - 象と戯れ を含むブックマーク はてなブックマーク - EXTENSION対応のマルチバージョンMakefile - 象と戯れ

9.1で、EXTENSIONが導入されました。基本的にはこれまでのpsql -f {module}.sqlでのインストールももちろんできるのですが、野良拡張モジュールも新機能にならった方が断然使い勝手が向上します。本体に付属しているcontrib群はすべてEXTENSION対応しています。が、一つのMakefileで9.0以前と9.1以降の両方に対応させるのがちょっと厄介になっています。

結論から言うと下記のようになります。


EXTENSION = tinyint
EXTVERSION = 0.1.1
EXTSQL = $(EXTENSION)--$(EXTVERSION).sql

MODULES = tinyint
OBJS = tinyint.o
DATA_built = tinyint.sql
DATA = uninstall_tinyint.sql
DOCS = doc/tinyint.md
REGRESS = tinyint

SQL_IN = tinyint.sql.in
EXTRA_CLEAN += $(SQL_IN) $(EXTSQL)

USE_EXTENSION = $(shell pg_config --version | grep -qE " 8\.|9\.0" && echo no || echo yes)

ifeq ($(USE_EXTENSION),yes)
all: $(EXTSQL)

$(EXTSQL): $(EXTENSION).sql
	cp $< $@

DATA = $(EXTSQL)
endif

PGXS := $(shell pg_config --pgxs)
include $(PGXS)

$(SQL_IN): tinyint.sql.in.c
	$(CC) -E -P $(CPPFLAGS) $< > $@

簡単に言えば、CREATE EXTENSIONは$PGHOME/share/extension/tinyint.controlを見て必要な.sqlファイルを実行します。

EXTENSIONに対応するために、まずは.controlファイルが必要です。

# tinyint extension
comment = '1 byte integer data type'
default_version = '0.1.1'
module_pathname = '$libdir/tinyint'
relocatable = true

CREATE EXTENSIONはモジュール名とdefault_versionから、tinyint--0.1.1.sqlというファイルを$PGHOME/share/extension/から探します。モジュール名とバージョンの間のハイフンが二つになっている理由は、モジュール名の中に既にハイフンを使ったものがあるからだそうです。

EXTENSION以前はDATA_builtのtinyint.sqlが$PGHOME/share/contrib/に入っていました。このファイルをtinyint--0.1.1.sqlにコピーした上でDATA変数に導入することでextensionディレクトリに正しくインストールされます。

EXTENSION対応のインストールにするかを、pg_config --versionの結果が8.x|9.0でない場合と定義しています。これはいまいちですが今のところ他に良い方法がありません。

こうして9.1では

  • share/extension/tinyint--0.1.1.sql
  • share/extension/tinyint.control

が無事配置され、CREATE EXTENSIONされるという寸法です。

え?installcheckはどうするのか?確かにregression testで最初にDBへのインストールを行いますが、ここでCREATE EXTENSIONは使いません。

これまでのマルチバージョン対応のようにCプリプロセッサで\iとCREATE EXTENSIONをかき分けてもいいですが、上記の通りインストールスクリプトは同じ.sqlファイルなので、CREATE EXTENSIONのオプション記述が必要なモジュールでもない限り、これまで通りでよいのではと考えています。

ややこしいですね。そんなわけでtinyintはめでたくEXTENSION対応を果たしてPGXNにてバージョンアップされました。

tinyint 0.1.1: 1 byte integer data type / PostgreSQL Extension Network

参考:

PGXN Blog: Extension Makefiles for PostgreSQL 9.1

pg-semver/Makefile at master ? theory/pg-semver ? GitHub

 |