UNIX系OS (NetBSD) での Ghostscript 7.07 のコンパイル

Published: 2021-09-05 14:30 +0900 by Chirimen

UNIX系 (NetBSD) で Ghostscript 7.07 をソースからコンパイルしてインストールし、 日本語フォントを利用できるようにするまでの手順のまとめ。

はじめに

Windows 用 Ghostscript 7.07 の環境設定 でも触れたように、日本語縦書きの機能を利用するために Ghostscript 7.07 が必要とされる場面があるが、 古いソフトであるため、環境を構築することは困難になりつつある。

今後のために、現時点で入手可能な情報をもとにした Ghostscript 7.07 のソースとその関連ファイルの入手法、 コンパイルの手順と設定方法について、記録を残しておく。

参考

ダウンロード

  • Ghostscript 7.07 のソース
    Sourceforge にあった Ghostscript のページ (gnu-gs) が削除されたため、7.07 は入手困難になっているが、7.07b が入手可能。
  • パッチ
    そのままだと多くの TrueType フォントでエラーとなってしまうので、 山田泰司さんのページで紹介されているパッチが必要。 パッチの数が多いので、パッチのダウンロードもコンパイルの節に記述する。
  • 依存ライブラリ (jpeg, libpng, zlib)
    • jpeg
      jpegsrc.v6b.tar.gz が必要。 Sourceforge の libjpeg のページ (libjpeg), GNU のサイト, 山形大のミラー からダウンロードできる。
    • libpng
      最新の 1.6 系列ではコンパイルできない。 1.4系列であれば可能。 1.4系列の最終版 libpng-1.4.22.tar.gz が Sourceforge の libpng のページ (libpng) からダウンロードできる。
    • zlib
      システム付属の zlib が使用できることが多い。 その場合は zlib のソースは不要。 NetBSD 9 の場合でも不要だった。 ソースからコンパイルする場合は、1.1 系列が必要。 zlib-1.1.3.tar.gz が GNU のサイト, 山形大のミラー からダウンロードできる。
  • Ghostscript のフォント
    Sourceforge の Ghostscript font のページ (gs-fonts) からダウンロードできる。 同ページには同内容でライセンスが異なるパッケージが用意されているので、 適切なものを使用することが望ましい。
  • CMap Resource
    GitHub の Adobe Type tools にある cmap-resources からダウンロードできる。 同リリースページから、 “Source code (tar.gz)” をダウンロードすればよい。 現時点での最新版は cmap-resources-20190730.tar.gz (ダウンロードする際にファイル名が付与される)。

コンパイルとインストール

ghostscript-7.07b のソースを展開する

ダウンロードした ghostscript-7.07b.tar.gz を展開する。 ビルドやインストールに関する手順が doc/Make.htm, doc/Install.htm に記述されているので、 一通り目を通しておく。

$ tar xzf ghostscript-7.07b.tar.gz

ghostscript-7.07b のソースにパッチを適用する

素の ghostscript-7.07b のままだと、 使用できる日本語 TrueType フォントがあまりなかったりする。

対応可能な日本語 TrueType フォントを増やすためのパッチが 山田泰司さんのページ で紹介されているので、パッチをダウンロードして ghostscript-7.07b のソースにパッチを適用する。

パッチファイルのダウンロード

必要なパッチファイルの数が多いので、 ダウンロードのコマンドを列挙したシェルスクリプトを準備して実行することにした。

パッチを当てる工程に合わせて、 ダウンロードしたパッチファイルは4つのディレクトリに分けて管理している。

今のところはすべてのパッチをダウンロードできているが、 フォルダ名のパスに tmp が含まれているのを見ると、 いつまでダウンロード可能かは心配である。

#! /bin/sh
(
    mkdir step1
    cd step1
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/tagoh.jp_junk/ghostscript-7.07-bigposttable.patch
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/tagoh.jp_junk/ghostscript-7.07-gsublookuptable.patch
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/tagoh.jp_junk/ghostscript-7.07-coverage-glyphcount.patch
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/fix_rename_font_gs_cidfn.ps.patch
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/fix_cidfontname_Encoding_CIDToGIDMap_DW_W.patch
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/modify_ps2pdfwr.patch
)
(
    mkdir step2
    cd step2
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/ghostscript-7.07-bigcmaptable.patch
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/ghostscript-7.07-noglyph-gid0.patch
)
(
    mkdir step3
    cd step3
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/fix_cidfonttype2_Adobe-CNS1-4.patch
)
(
    mkdir step4
    cd step4
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/ghostscript-7.07-seekCFFtable.patch
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/ghostscript-7.07-readFDSelect.patch
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/ghostscript-7.07-write_GSubrs.patch
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/ghostscript-7.07-nosyoffsetcheck.patch
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/fix_cidfonttype2_Adobe-Japan1-6.patch
    curl -RO https://www.aihara.co.jp/~taiji/gyve/tmp/modify_ps2pdfwr-20050921.patch
)
パッチファイルを適用する

ダウンロードしたパッチファイルを指定された順で適用する。

指定する patch のオプションや、 実行するディレクトリがパッチファイルによって異なるので、 こちらもあらかじめシェルスクリプトとして記述したものを実行するようにした。

#! /bin/sh

target=../ghostscript-7.07b

patch -p1 -d $target      < step1/ghostscript-7.07-bigposttable.patch
patch -p1 -d $target      < step1/ghostscript-7.07-gsublookuptable.patch
patch -p1 -d $target      < step1/ghostscript-7.07-coverage-glyphcount.patch
patch -p1 -d $target      < step1/fix_rename_font_gs_cidfn.ps.patch
patch -p1 -d $target      < step1/fix_cidfontname_Encoding_CIDToGIDMap_DW_W.patch
patch -p0 -d $target/lib  < step1/modify_ps2pdfwr.patch

patch -p0 -d $target      < step2/ghostscript-7.07-bigcmaptable.patch
patch -p0 -d $target      < step2/ghostscript-7.07-noglyph-gid0.patch

patch -p0 -d $target      < step3/fix_cidfonttype2_Adobe-CNS1-4.patch

patch -p0 -d $target      < step4/ghostscript-7.07-seekCFFtable.patch
patch -p0 -d $target      < step4/ghostscript-7.07-readFDSelect.patch
patch -p0 -d $target      < step4/ghostscript-7.07-write_GSubrs.patch
patch -p0 -d $target      < step4/ghostscript-7.07-nosyoffsetcheck.patch
patch -p0 -d $target      < step4/fix_cidfonttype2_Adobe-Japan1-6.patch
patch -p0 -d $target/lib  < step4/modify_ps2pdfwr-20050921.patch

依存ライブラリのソースを展開する

NetBSD 9 (他の多くのシステムも) ではシステムの zlib が使用できるので、 jpeg と libpng のみソースを設置する。

$ cd ghostscript-7.07b
$ tar xzf ../jpegsrc.v6b.tar.gz
$ mv jpeg-6b jpeg
$ cd ghostscript-7.07b
$ tar xzf ../libpng-1.4.22.tar.gz
$ mv libpng-1.4.22 libpng

設定のために configure を実行する

多くのフリーソフトと同様に、 ソースに同梱されている configure を実行してコンパイルのための設定を行う。

$ ./configure

デフォルトでは /usr/local 以下にインストールされる設定となっている。 NetBSD では pkg 管理下のアプリケーションは /usr/pkg 下にインストールされるので、 デフォルトのままで問題ないと思われるが、 アプリケーション管理ツールが /usr/local を使用するシステムの場合は、 競合を避けるために別のディレクトリを使用したほうがよいだろう。

confighure のオプション --prefix=path を指定すると、 デフォルトの /usr/local の代わりに path を使用することができる (path は任意)。

コンパイル (make) の実行

GNU make で make を実行する。

NetBSD のシステムに含まれている BSD make は仕様が異なるので動作しないようである。 NetBSD 環境なので gmake (GNU make) をインストールし、 gmake を実行する。

$ gmake

NetBSD 9.2 で X window system をインストールしていない環境下でコンパイルした結果。

$ ldd ./bin/gs
./bin/gs:
        -lz.1 => /usr/lib/libz.so.1
        -lc.12 => /usr/lib/libc.so.12
        -lm.0 => /usr/lib/libm.so.0

zlib はシステムのものが動的リンクされており、 jpeg や libpng は静的リンクされている。

インストール (make install) の実行

gmake install を実行してインストールを行う。 デフォルトの設定のままであれば /usr/local/bin 下に実行ファルが、 /usr/local/share/ghostscript 下に他の必要ファイル群がインストールされる。

$ gmake install

そのままだと、Resource の参照先が適切でないので修正する必要がある。 具体的には lib/gs_res.ps (/usr/local/share/ghostscript/7.07/lib/gs_res.ps) の249–250行

/FontResourceDir (/Resource/Font/) readonly .forcedef  % pssys'params is r-o
/GenericResourceDir (/Resource/) readonly .forcedef    % pssys'params is r-o

/Resource/ (2箇所)を /usr/local/share/ghostscript/Resource/ のように修正する。

/FontResourceDir (/usr/local/share/ghostscript/Resource/Font/) readonly .forcedef  % pssys'params is r-o
/GenericResourceDir (/usr/local/share/ghostscript/Resource/) readonly .forcedef    % pssys'params is r-o

標準フォントのインストール

ダウンロードした標準フォント ghostscript-fonts-std-8.11.tar.gz, ghostscript-fonts-other-6.0.tar.gz の内容を /usr/local/ghostscript/fonts に設置する。

$ sudo tar xzf ghostscript-fonts-std-8.11.tar.gz -C /usr/local/share/ghostscript
$ sudo tar xzf ghostscript-fonts-other-6.0.tar.gz -C /usr/local/share/ghostscript

ファイルのオーナーやパーミッションは環境に合わせて設定する。

CMap Resource のインストール

ダウンロードした cmap-resouorce ファイルを展開し、 Adobe-Japan1-7 などのディレクトリの下にある CMap ディレクトリを /usr/local/share/ghostscript/Resource にコピーする。

$ unzip cmap-resources-20190730.zip
$ cd cmap-resources
$ sudo mkdir /usr/local/share/ghostscript/Resource
$ for d in Adobe-*; do sudo cp -pr $d/CMap /usr/local/share/ghostscript/Resource; done

ファイルのオーナーやパーミッションなどは環境や好みに合わせて設定する。

環境設定

ghostscript の検索パス (search path)

TrueType フォントは ghostscript の検索パス (search path) から読み込まれる。 検索パスは gs -h で確認することができる。 デフォルトでは ., /usr/local/share/ghostscript/7.07/lib, /usr/local/share/ghostscript/font の順に検索される。

$ gs -h
GNU Ghostscript 7.07 (2003-05-17)
Copyright (C) 2003 artofcode LLC, Benicia, CA.  All rights reserved.
(snip)
Search path:
   . : /usr/local/share/ghostscript/7.07/lib :
   /usr/local/share/ghostscript/fonts
For more information, see /usr/local/share/ghostscript/7.07/doc/Use.htm.
Report bugs to bug-gs@ghostscript.com, using the form in Bug-form.htm.

検索パスは、環境変数 GS_LIB やオプション -I で追加することができる。 追加したパスはカレントディレクトリ . の次に検索される。

環境変数 GS_LIB で指定する場合は次のようになる。 分離記号 : (UNIX系の場合) を用いて複数のディレクトリを指定することもできる。

$ GS_LIB=lib:fonts gs -h
(snip)
Search path:
   . : lib : fonts : /usr/local/share/ghostscript/7.07/lib :
   /usr/local/share/ghostscript/fonts

オプション -I で指定する場合は次のようになる。 オプション文字列 -I とパス文字列の間に空白を入れてはいけない。 また、-h で検索パスを確認する際は、 -h-I より後に指定する必要がある。

複数のディレクトリを指定するには、 -I オプションを複数回使用するか、

$ gs -Ilib -Ifonts -h
(snip)
Search path:
   . : lib : fonts : /usr/local/share/ghostscript/7.07/lib :
   /usr/local/share/ghostscript/fonts

GS_LIB の場合と同様に分離記号 : を使用する方法がある。

$ gs -Ilib:fonts -h
(snip)
Search path:
   . : lib : fonts : /usr/local/share/ghostscript/7.07/lib :
   /usr/local/share/ghostscript/fonts

日本語 TrueType フォントの設置と設定

フォントファイルの設置

日本語 TrueType フォントファイルは ghostscript の検索パスが通っているディレクトリ、 またはそのディレクトリからの相対パスで参照可能なサブディレクトリに設置する。

フォントファイルは絶対パスで指定することもできる。

オプション -dSAFER が指定されていると、 親ディレクトリへの参照 .. はエラーになる。

CIDFnmap の設定

日本語 TrueType フォントの設定を CIDFnmap で行う。 CIDFnmap/usr/local/share/ghostscript/7.07/lib にあるが、 カレントディレクトリの CIDFnmap が優先される。

フォントの指定は次のようになる。

%!

% IPA明朝・ゴシック
%   等幅は縦書きでも問題ない。
%   プロポーショナルでは縦書き時にカーニングされてしまう。
/IPAMincho                  (ipam.ttc) 1 ;                  % IPA明朝 TTC (Ver.003.03) 
/IPAPMincho                 (ipam.ttc) 2 ;                  % IPAP明朝 TTC (Ver.003.03) 
/IPAGothic                  (ipag.ttc) 1 ;                  % IPAゴシック TTC (Ver.003.03) 
/IPAPGothic                 (ipag.ttc) 2 ;                  % IPAPゴシック TTC (Ver.003.03) 

% IPAex明朝・ゴシック
%   縦書き時に横書き用グリフが使用されてしまう。
/IPAexMincho                (ipaexm.ttf) ;                  % IPAex明朝 (Ver.004.01)
/IPAexGothic                (ipaexg.ttf) ;                  % IPAexゴシック (Ver.004.01)

% Windows 10 のMS明朝・ゴシック
%   エラーで使用できない。古い (XP) のだとおそらく使える。
/MS-Mincho                  (msmincho.ttc) 1 ;              % MS明朝
/MS-Gothic                  (msgothic.ttc) 1 ;              % MSゴシック

% Windows 10 の BIZ UD シリーズ
%   等幅は縦書きでも問題ない。
%   プロポーショナルでは縦書き時にカーニングが行われる。また、カッコの文字間がおかしい
/BIZ-UDMincho-Medium        (BIZ-UDMinchoM.ttc) 1 ;         % BIZ UD明朝 Medium
/BIZ-UDPMincho-Medium       (BIZ-UDMinchoM.ttc) 2 ;         % BIZ UDP明朝 Medium
/BIZ-UDGothic-Regular       (BIZ-UDGothicR.ttc) 1 ;         % BIZ UDゴシック Regular
/BIZ-UDPGothic-Regular      (BIZ-UDGothicR.ttc) 2 ;         % BIZ UDPゴシック Regular
/BIZ-UDGothic-Bold          (BIZ-UDGothicB.ttc) 1 ;         % BIZ UDゴシック Bold
/BIZ-UDPGothic-Bold         (BIZ-UDGothicB.ttc) 2 ;         % BIZ UDPゴシック Bold

% Windows 10 の UDデジタル教科書体
%   縦書き時に横書き用グリフが使用されてしまう。
/UDDigiKyokashoN-R          (UDDigiKyokashoN-R.ttc) 1 ;     % UDデジタル教科書体 N-R
/UDDigiKyokashoNP-R         (UDDigiKyokashoN-R.ttc) 2 ;     % UDデジタル教科書体 NP-R
/UDDigiKyokashoNK-R         (UDDigiKyokashoN-R.ttc) 3 ;     % UDデジタル教科書体 NK-R

% 古い商用 TrueType フォント (ヒラギノ)
%   縦書きでも問題ない。
/HiraginoMin-W3-90ms-RKSJ-H         (DShirmn3.ttc)  2 ;     % ヒラギノ明朝体3等幅
/HiraginoMin-W5-90ms-RKSJ-H         (DShirmn5.ttc)  2 ;     % ヒラギノ明朝体5等幅
/HiraginoMin-W7-90ms-RKSJ-H         (DShirmn7.ttc)  2 ;     % ヒラギノ明朝体7等幅
/HiraginoMin-W3-90msp-RKSJ-H        (DShirmn3.ttc)  1 ;     % ヒラギノ明朝体3
/HiraginoMin-W5-90msp-RKSJ-H        (DShirmn5.ttc)  1 ;     % ヒラギノ明朝体5
/HiraginoMin-W7-90msp-RKSJ-H        (DShirmn7.ttc)  1 ;     % ヒラギノ明朝体7
/HiraginoKaku-W3-90ms-RKSJ-H        (DShirkg3.ttc)  2 ;     % ヒラギノ角ゴ3等幅
/HiraginoKaku-W5-90ms-RKSJ-H        (DShirkg5.ttc)  2 ;     % ヒラギノ角ゴ5等幅
/HiraginoKaku-W7-90ms-RKSJ-H        (DShirkg7.ttc)  2 ;     % ヒラギノ角ゴ7等幅
/HiraginoKaku-W3-90msp-RKSJ-H       (DShirkg3.ttc)  1 ;     % ヒラギノ角ゴ3
/HiraginoKaku-W5-90msp-RKSJ-H       (DShirkg5.ttc)  1 ;     % ヒラギノ角ゴ5
/HiraginoKaku-W7-90msp-RKSJ-H       (DShirkg7.ttc)  1 ;     % ヒラギノ角ゴ7
/HiraginoGyoDS-W4-90ms-RKSJ-H       (DShirgy4.ttc)  2 ;     % ヒラギノ行書等幅
/HiraginoGyoDS-W4-90msp-RKSJ-H      (DShirgy4.ttc)  1 ;     % ヒラギノ行書

% 原ノ味フォント OTF
%   縦書き時の文字高さ(文字送り量)がおかしい。
/HaranoAjiMincho-Regular    (HaranoAjiMincho-Regular.otf) ; % 原ノ味明朝
/HaranoAjiGothic-Medium     (HaranoAjiGothic-Medium.otf)  ; % 原ノ味ゴシック

/Ryumin-Light               /IPAMincho ;
/GothicBBB-Medium           /IPAGothic ;

動作確認

上記の CIDFnmap をカレントディレクトリに、 日本語フォントファイルを fonts (./fonts) に置いて動作確認を行った。

テスト用のファイル fontexample.ps を gist に掲載しておく。

gs -Ifonts -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pngalpha -r150 -sOutputFile=result-p%d.png fontexample.ps

result-p1.png result-p2.png

Share

Latest Posts

Django Rest Framework のテストでハマったこと (4)

Django で既存データベースから inspectdb で作成した models.my は managed = False となっている。 そのままだと test を実行したときに、 テスト用データベースにモデルに対応したテーブルが作成されない。

Django Rest Framework のテストでハマったこと (3)

factory_boy の Faker() で、 取得した値を加工してから使用する話。

Django Rest Framework のテストでハマったこと (2)

Django のテスト用データを作成するのによく用いられる factory_boy で locale を指定して日本語圏用のデータを利用する話。