mapserver7.0.4をインストールしてみた ー備忘録ー

CentOS Linux release 7.2.1511にマップサーバーの最新版7.0.4をインストールしました。Version5まではconfigure+makeでインストールしてたのに、いつのまにかcmakeを使うようになってるじゃん。。。

この手のソフトは難なくインストール出来た試しがありません。(無料が一番高くつくのです)

マップサーバー(mapserver)とは”地図レンダリング”ソフトです。

例えば以前私共で作成したサイトは”福島県再生可能エネルギーデータベース こういったサイトを作る時に便利なツールです。

本家のサイトは”MapServer“です。

インストールはこちらからソースコードをダウンロードしてきてコンパイルするわけです。

こういった規模の大きなソフトウエアは付属条件など色々あるのですが、その辺のお話は省略します。こちらに詳しく書かれています。

今回はまったのは、ソースコードの中で使われている”関数”です。

strlcpy, strlcat, strncasecmp  通常のstrcpy, strcat, strcasecmpと比べると操作の安全性が上がっているそうな。。是非宜しくなのですが、LinuxについてくるGNU Cには含まれてない!!

cmakeを動かすと以下のエラーが出てしまいます。

Linking C executable cmTC_0684a
/usr/local/bin/cmake -E cmake_link_script CMakeFiles/cmTC_0684a.dir/link.txt –verbose=1
/usr/bin/cc -DCHECK_FUNCTION_EXISTS=strlcat -rdynamic CMakeFiles/cmTC_0684a.dir/CheckFunctionExists.c.o -o cmTC_0684a -lm
CMakeFiles/cmTC_0684a.dir/CheckFunctionExists.c.o: 関数 `main’ 内:
CheckFunctionExists.c:(.text+0x10): `strlcat‘ に対する定義されていない参照です
collect2: エラー: ld はステータス 1 で終了しました

この手のエラー解決方法ってフォーラムとかでも何故か話題にならないですよね~

ウィキペディアのこちらのページに以下の記載を発見しました。

Millerとde RaadtはOpenBSDの開発者であり、strlcpyを最初に実装したOSはOpenBSD 2.4である。以後、FreeBSD 3.3を含め、SolarismacOS等の各OS、OpenSSL等のライブラリにも採用されている。Linux では libbsd ライブラリ経由で利用できる。

一方で、GNU Cライブラリ (glibc) の開発者たちは、GNU Coding Standardsで禁じられている「長い行を黙って切り詰める」関数である、このような仕様の関数はバグである、いい加減なプログラムを助長してしまう、新たなセキュリティ問題を生む、など否定的な見解を示しており[2]、標準規格に含まれない限りはglibcには実装しない意向である。

早速libbsdをこちらのサイトでゲットします。

そしてインストール

-rw-r–r– 1 root root 117902 4月 9 09:24 libbsd.a
lrwxrwxrwx 1 root root 20 4月 9 09:24 libbsd.so -> /lib/libbsd.so.0.0.1
lrwxrwxrwx 1 root root 15 4月 9 09:24 libbsd.so.0 -> libbsd.so.0.0.1
-rw-r–r– 1 root root 61001 4月 9 09:24 libbsd.so.0.0.1

/usr/lib, /usr/lib64ディレクトリへインストール出来ました!

cmake のパラメタファイルCMakeLists.txtがダウンロードし解凍展開したマップサーバーパッケージディレクトリ(mapserver-7.0.4/とか)にあります。

下記を追記(赤文字部分)

find_library(gbsd NAMES libbsd.a PATHS /usr/lib)
message(${gbsd})

if(BUILD_STATIC)
add_library(mapserver_static STATIC ${mapserver_SOURCES} ${agg_SOURCES} ${v8_SOURCES} ${gbsd})
set_target_properties( mapserver_static PROPERTIES
VERSION ${MapServer_VERSION_STRING}
SOVERSION 2
)
endif(BUILD_STATIC)

add_executable(mapserv mapserv.c)
target_link_libraries(mapserv ${MAPSERVER_LIBMAPSERVER} ${gbsd})
add_executable(shp2img shp2img.c)
target_link_libraries(shp2img ${MAPSERVER_LIBMAPSERVER} ${gbsd})
add_executable(shptree shptree.c)
target_link_libraries(shptree ${MAPSERVER_LIBMAPSERVER} ${gbsd})
add_executable(shptreevis shptreevis.c)
target_link_libraries(shptreevis ${MAPSERVER_LIBMAPSERVER} ${gbsd})
add_executable(sortshp sortshp.c)
target_link_libraries(sortshp ${MAPSERVER_LIBMAPSERVER} ${gbsd})
add_executable(legend legend.c)
target_link_libraries(legend ${MAPSERVER_LIBMAPSERVER} ${gbsd})
add_executable(scalebar scalebar.c)
target_link_libraries(scalebar ${MAPSERVER_LIBMAPSERVER} ${gbsd})
add_executable(msencrypt msencrypt.c)
target_link_libraries(msencrypt ${MAPSERVER_LIBMAPSERVER} ${gbsd})
add_executable(tile4ms tile4ms.c)
target_link_libraries(tile4ms ${MAPSERVER_LIBMAPSERVER} ${gbsd})
add_executable(shptreetst shptreetst.c)
target_link_libraries(shptreetst ${MAPSERVER_LIBMAPSERVER} ${gbsd})

下記のようにcmakeを実行

%cmake .. -DWITH_FCGI=0 -DWITH_PIXMAN=0 -DWITH_SQLITE=0 -DWITH_OGR=1 -DWITH_GEOS=1 -DWITH_PCRE=0 -DWITH_FCGI=0 -DWITH_TIFF=1 -DWITH_TIFF_WRITE_SUPPORT=1 -DWITH_GEOTIFF=1 -DWITH_MEMCACHE=0 -BUILD_STATIC=ON -DWITH_APACHE=1 -DWITH_MYSQL=1 -DWITH_POSTGIS=1

すると結果は

— Checking for module ‘harfbuzz>=0.9.18’
— Found harfbuzz, version 0.9.36
— Checking for module ‘cairo’
— Found cairo, version 1.14.2
— * Summary of configured options for this build
— * Mandatory components
— * png: /usr/lib64/libpng.so
— * jpeg: /usr/lib64/libjpeg.so
— * freetype: /usr/lib64/libfreetype.so
— * Optional components
— * GDAL: /usr/local/lib/libgdal.so
— * OGR: /usr/local/lib/libgdal.so
— * GIF: /usr/lib64/libgif.so
— * MYSQL: /usr/lib64/mysql/libmysqlclient.so
— * FRIBIDI: /usr/lib64/libfribidi.so
— * HARFBUZZ: /usr/lib64/libharfbuzz.so
— * GIF: /usr/lib64/libgif.so
— * CAIRO: /usr/lib64/libcairo.so
— * SVGCAIRO: disabled
— * RSVG: disabled
— * CURL: disabled
— * PROJ: /usr/local/lib/libproj.so
— * PIXMAN: disabled
— * LIBXML2: /usr/lib64/libxml2.so
— * POSTGIS: /usr/lib64/libpq.so
— * GEOS: /usr/local/lib/libgeos_c.so
— * FastCGI: disabled
— * Oracle Spatial: disabled
— * Exempi XMP: disabled
— * Optional features
— * WMS SERVER: ENABLED
— * WFS SERVER: ENABLED
— * WCS SERVER: ENABLED
— * SOS SERVER: disabled
— * WMS CLIENT: disabled
— * WFS CLIENT: disabled
— * ICONV: ENABLED
— * Thread-safety support: disabled
— * KML output: disabled
— * Z+M point coordinate support: disabled
— * XML Mapfile support: disabled
— * Mapscripts
— * Python: disabled
— * PHP: disabled
— * PERL: disabled
— * RUBY: disabled
— * JAVA: disabled
— * C#: disabled
— * V8 Javascript: disabled
— * Apache Module (Experimental): disabled

— Will install files to /usr/local
— Will install libraries to /usr/local/lib
— Configuring done
— Generating done
— Build files have been written to: /home1/downloads/mapserver-7.0.4/build/UILD_STATIC=ON

mapscripts関係がdisableになってますが後でなんとかなるとして

www/cgi-bin/mapserv にブラウザでアクセスして

No query information to decode. QUERY_STRING is set, but empty.

が表示されればOKです