ApacheのモジュールをDebian上でもRHEL/CentOS上でもビルドできるようにする

Apacheのモジュールを作るときは、Debian上でapxsコマンドでテンプレートを 生成して使っている。だけど、使ってくれる人はRHEL/CentOSを使っていることが 多かったり。

DebianからRHEL/CentOSに持っていく時はMakefileの書き換えが必要なのだが、 それも面倒なので、apxsコマンドが生成したMakefileを使って、Debian上でも RHEL/CentOS上でもビルドできるようにする補助Makefileを作ってみた。

何ができるようになるか?

  • DebianとRHEL/CentOSでのApache httpdのディレクトリ構成の差異を 吸収してApacheのモジュールがビルドできる。
  • DebianとRHEL/CentOS 6.x以下とRHEL/CentOS 7の設定ファイルの 管理方法に合わせて、LoadModuleをする設定ファイルを、 モジュール名を自動判別しながらインストールする。 (disable状態でインストールされる)
    • Debianの場合: /etc/apache2/mods-available/your_module.load
    • RHEL/CentOS 7の場合: /etc/httpd/conf.module.d/99-your_module.conf-
    • RHEL/CentOS 6.x以下の場合: /etc/httpd/conf.d/your_module.conf-
  • apxsコマンドが生成したMakefileを数行書き換えるだけで使えるようになる。

補助Makefile (distro_support.mk)

この distro_support.mk を、apxsが生成したディレクトリに配置する。

module_name=$(patsubst mod_%,%,$(shared:%.la=%))

ifneq ($(wildcard /etc/debian_version),)
  # Debian/Ubuntu
  top_srcdir=/usr/share/apache2
  top_builddir=/usr/share/apache2
  include /usr/share/apache2/build/special.mk
  loader_file=/etc/apache2/mods-available/$(module_name).load
  loader_lines=LoadModule $(module_name)_module $(libexecdir)/mod_$(module_name).so
else ifneq ($(wildcard /etc/redhat-release),)
  # RHEL/CentOS
  top_srcdir=/etc/httpd
  ifneq ($(wildcard /usr/lib64),)  # 64bit
    top_builddir=/usr/lib64/httpd
    include /usr/lib64/httpd/build/special.mk
  else
    top_builddir=/usr/lib/httpd
    include /usr/lib/httpd/build/special.mk
  endif
  ifneq ($(wildcard /etc/httpd/conf.modules.d),)  # CentOS7
    loader_file=/etc/httpd/conf.modules.d/99-$(module_name).conf-
  else
    loader_file=/etc/httpd/conf.d/$(module_name).conf-
  endif
  loader_lines=LoadModule $(module_name)_module modules/mod_$(module_name).so
else
  $(error unsupported platform)
endif


install-loader-config:
       echo -e "$(loader_lines)" > $(loader_file)
       chmod 644 $(loader_file)

install: install-modules-yes install-loader-config

https://gist.github.com/paoneJP/cfa8650e20b33e4506d4 にも同じものを貼っておく。

補助Makefileを使う

distro_support.mkを使うように、apxsが生成したMakefileの先頭部分を 次のとおり書き換える。

変更前

##
##  Makefile -- Build procedure for sample your_module Apache module
##  Autogenerated via ``apxs -n your_module -g''.
##

builddir=.
top_srcdir=/usr/share/apache2
top_builddir=/usr/share/apache2
include /usr/share/apache2/build/special.mk

#   the used tools
...

変更後

##
##  Makefile -- Build procedure for sample your_module Apache module
##  Autogenerated via ``apxs -n your_module -g''.
##

builddir=.
#top_srcdir=/usr/share/apache2
#top_builddir=/usr/share/apache2
#include /usr/share/apache2/build/special.mk
include distro_support.mk

#   the used tools
...

top_srcdir=... から include ... までの3行をコメントアウトし、 include distro_support.mk 行を書き足す。

使い方

いつもどおりの使い方でOK.

$ make
$ sudo make install