Apacheの動的画像リサイズモジュール「smalllight」のmakeが通らなかったのを直してみた。

画像のリサイズを動的に行いたいとの要望があり、ミドルウェアで吸収できたら良いよねーということで、
クックパッドさんの「mod_tofu」とかいいなぁーと思っていたら、ライブドアさんから求めていたモジュールが
出ていたので、そちらを評価するために導入調査していたところ、makeが通らなかったので、その調査背景と対策方法を。。。

ちなみに、かなりの環境依存っぽいので、あまり当てはまらない方の方が多い気がします。。。(^_^;)

本当にこれでいいのかは不明で、通ったということだけで、アヤシイところ等不明な点をツッコミ頂くと幸いです。

導入方法については、xcirさんがまとめられていますので、そちらを基本参考に頂ければと思います。

OSのバージョンが違うこともあってか、ほとんどEPELリポジトリで対応が出来ました。(ibjpeg-turboは入れました)

■環境
Scientific Linux 6.0 x86_64(アップデートして6.1にも試してみました)
Apache 2.2.15(yumで導入)
EPELリポジトリは、http://download.fedora.redhat.com/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm を使用。

使用マザー: ASUS P7F-M(intel3420 1156 DDR3 mATX)
CPU:Core i3-560

■現象
make後に不明なオプションと怒られる。。。

./configure --with-apxs=/usr/sbin/apxs
make 
/usr/sbin/apxs -c -DENABLE_IMLIB2 -DENABLE_WAND -DENABLE_JPEG -ljpeg `/usr/bin/imlib2-config --cflags` `/usr/bin/imlib2-config --libs` `/usr/bin/Wand-config --cppflags` `/usr/bin/Wand-config --libs` \
        mod_small_light.c mod_small_light_*.c
apxs:Error: Unknown option: f.
Usage: apxs -g [-S <var>=<val>] -n <modname>
       apxs -q [-S <var>=<val>] <query> ...
       apxs -c [-S <var>=<val>] [-o <dsofile>] [-D <name>[=<value>]]
               [-I <incdir>] [-L <libdir>] [-l <libname>] [-Wc,<flags>]
               [-Wl,<flags>] [-p] <files> ...
       apxs -i [-S <var>=<val>] [-a] [-A] [-n <modname>] <dsofile> ...
       apxs -e [-S <var>=<val>] [-a] [-A] [-n <modname>] <dsofile> ...
make: *** [all] エラー 1

ここから、気づくまでにいろいろかかりましたが。。。(ImageMagick最新にしてみたりとか。。。imlib2最新にしてみたりとか。。。)
そもそも、makeのオプションおかしいんだからと、改めて見直す。。。

./configureで作成されたMakefile

APXS=/usr/sbin/apxs

ifneq ("/usr/bin/imlib2-config","")
    IMLIB2_INCLUDES=`/usr/bin/imlib2-config --cflags`
    IMLIB2_LIBS=`/usr/bin/imlib2-config --libs`
endif
ifneq ("/usr/bin/Wand-config","")
    WAND_INCLUDES=`/usr/bin/Wand-config --cppflags`
    WAND_LIBS=`/usr/bin/Wand-config --libs`
endif
CFLAGS=-DENABLE_IMLIB2 -DENABLE_WAND -DENABLE_JPEG
LIBS=-ljpeg

all:
        $(APXS) -c $(CFLAGS) $(LIBS) $(IMLIB2_INCLUDES) $(IMLIB2_LIBS) $(WAND_INCLUDES) $(WAND_LIBS) \
        mod_small_light.c mod_small_light_*.c

install:
        $(APXS) -ia mod_small_light.la

clean:
        rm -rf *.o *.a *.so *.lo *.la *.slo a.out .libs .deps

distclean: clean
        rm -rf Makefile config.cache config.log config.status autom4te.cache $(PACKAGETGZ) $(PACKAGEDIR)

dist:
        mkdir $(PACKAGEDIR)
        autoconf
        cp mod_small_light.c mod_small_light.h mod_small_light_*.c mod_small_light_*.h $(PACKAGEDIR)
        cp configure configure.in Makefile.in README README.* LICENSE ChangeLog $(PACKAGEDIR)
        tar cvzf $(PACKAGETGZ) $(PACKAGEDIR)
        rm -rf $(PACKAGEDIR)

apxsのモジュール追加処理がおかしいので、
そこだけ、抜き出して実行しても、そりゃ、上と同じ結果。。。っていうかそもそも各変数に何入ってるの??と調べて解決に至りました。

まずは、IMLIB2_INCLUDESから。。。

# /usr/bin/imlib2-config --cflags

うげぇ。。。何もない。。。まぁ、とりあえず無視して、

IMLIB2_LIBS と。。。

# /usr/bin/imlib2-config --libs
-lImlib2 -lfreetype -lX11 -lXext -ldl -lm

ふむふむ。

WAND_INCLUDEこれは。。。

# /usr/bin/Wand-config --cppflags
-fopenmp -I/usr/include/ImageMagick

おぉ。。。

WAND_LIBSを念の為。。。

# /usr/bin/Wand-config --libs
-lMagickWand -lMagickCore

ということで、WAND_INCLUDEが返す環境変数で、apxsが解釈できないものが入っているのが原因ですねと。。。
そもそも -f openmpオプションをちゃんと使えるようにしたほうがよいというか、(並列系のopenmpだよね??)
どうしたらいいかわからないので、先にapxsが通るかをチェック。。。

# usr/sbin/apxs -c '-lImlib2 -lfreetype -lX11 -lXext -ldl -lm' '-lMagickWand -lMagickCore' '-I/usr/include/ImageMagick' -ljpeg  mod_small_light.c mod_small_light_*.c

/usr/lib64/apr-1/build/libtool --silent --mode=compile gcc -prefer-pic -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wformat-security -fno-strict-aliasing  -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -pthread -I/usr/include/httpd  -I/usr/include/apr-1   -I/usr/include/apr-1  -I/usr/include/ImageMagick  -c -o mod_small_light.lo mod_small_light.c && touch mod_small_light.slo
/usr/lib64/apr-1/build/libtool --silent --mode=compile gcc -prefer-pic -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wformat-security -fno-strict-aliasing  -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -pthread -I/usr/include/httpd  -I/usr/include/apr-1   -I/usr/include/apr-1  -I/usr/include/ImageMagick  -c -o mod_small_light_dummy.lo mod_small_light_dummy.c && touch mod_small_light_dummy.slo
mod_small_light_dummy.c: In function ‘small_light_filter_dummy_receive_data’:
mod_small_light_dummy.c:71: 警告: format ‘%d’ expects type ‘int’, but argument 7 has type ‘apr_size_t’
mod_small_light_dummy.c: In function ‘small_light_filter_dummy_output_data’:
mod_small_light_dummy.c:89: 警告: pointer targets in passing argument 1 of ‘apr_bucket_pool_create’ differ in signedness
/usr/include/apr-1/apr_buckets.h:1373: note: expected ‘const char *’ but argument is of type ‘unsigned char *’
/usr/lib64/apr-1/build/libtool --silent --mode=compile gcc -prefer-pic -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wformat-security -fno-strict-aliasing  -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -pthread -I/usr/include/httpd  -I/usr/include/apr-1   -I/usr/include/apr-1  -I/usr/include/ImageMagick  -c -o mod_small_light_ext_jpeg.lo mod_small_light_ext_jpeg.c && touch mod_small_light_ext_jpeg.slo
mod_small_light_ext_jpeg.c: In function ‘load_exif_from_memory’:
mod_small_light_ext_jpeg.c:70: 警告: operation on ‘data’ may be undefined
mod_small_light_ext_jpeg.c:88: 警告: operation on ‘data’ may be undefined
mod_small_light_ext_jpeg.c: In function ‘exif_brigade_insert_tail’:
mod_small_light_ext_jpeg.c:125: 警告: pointer targets in passing argument 1 of ‘apr_bucket_pool_create’ differ in signedness
/usr/include/apr-1/apr_buckets.h:1373: note: expected ‘const char *’ but argument is of type ‘unsigned char *’
/usr/lib64/apr-1/build/libtool --silent --mode=compile gcc -prefer-pic -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wformat-security -fno-strict-aliasing  -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -pthread -I/usr/include/httpd  -I/usr/include/apr-1   -I/usr/include/apr-1  -I/usr/include/ImageMagick  -c -o mod_small_light_imagemagick.lo mod_small_light_imagemagick.c && touch mod_small_light_imagemagick.slo
/usr/lib64/apr-1/build/libtool --silent --mode=compile gcc -prefer-pic -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wformat-security -fno-strict-aliasing  -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -pthread -I/usr/include/httpd  -I/usr/include/apr-1   -I/usr/include/apr-1  -I/usr/include/ImageMagick  -c -o mod_small_light_imlib2.lo mod_small_light_imlib2.c && touch mod_small_light_imlib2.slo
/usr/lib64/apr-1/build/libtool --silent --mode=link gcc -o mod_small_light.la  -lImlib2 -lfreetype -lX11 -lXext -ldl -lm -lMagickWand -lMagickCore -ljpeg -rpath /usr/lib64/httpd/modules -module -avoid-version    mod_small_light_imlib2.lo mod_small_light_imagemagick.lo mod_small_light_ext_jpeg.lo mod_small_light_dummy.lo mod_small_light.lo

おぉ。。。通った。。。

なので、無理やりMakefileを変更してとりあえず、installしました。これはおかしいとか、こうすればいいのにみたいなのがありましたら、ご教授下さいm(_ _)m

Makefile

APXS=/usr/sbin/apxs
PACKAGE=mod_small_light
VERSION=1.1.1
PACKAGEDIR=$(PACKAGE)-$(VERSION)
PACKAGETGZ=$(PACKAGE)-$(VERSION).tar.gz

all:
        /usr/sbin/apxs -c '-lImlib2 -lfreetype -lX11 -lXext -ldl -lm' '-lMagickWand -lMagickCore' '-I/usr/include/ImageMagick' -ljpeg  mod_small_light.c mod_small_light_*.c

install:
        $(APXS) -ia mod_small_light.la

clean:
        rm -rf *.o *.a *.so *.lo *.la *.slo a.out .libs .deps

distclean: clean
        rm -rf Makefile config.cache config.log config.status autom4te.cache $(PACKAGETGZ) $(PACKAGEDIR)

dist:
        mkdir $(PACKAGEDIR)
        autoconf
        cp mod_small_light.c mod_small_light.h mod_small_light_*.c mod_small_light_*.h $(PACKAGEDIR)
        cp configure configure.in Makefile.in README README.* LICENSE ChangeLog $(PACKAGEDIR)
        tar cvzf $(PACKAGETGZ) $(PACKAGEDIR)
        rm -rf $(PACKAGEDIR)