The W3C Markup Validation Service を Windows のローカルで動かす
- Created Date
- 2007-08-16T03:41:20+09:00
- Modified Date
- 2007-08-18T12:50:38+09:00
- Category
-
- PermaLink
- http://bsakatu.s201.xrea.com/mt/2007/08/16/03-41-20
The W3C Markup Validation Service をローカルで動かしたいな〜、と思って探したら、ちゃんとスクリプトが提供されていた。Another HTML-lint と同じノリでインストールは楽勝だろうと思っていたら甘かった。中途半端な知識にもかかわらず、Cygwin 内で動かそうと思ったせいでえらい時間 (丸 3 日、数十時間) がかかった上に挫折した。結局は ActivePerl。得たものは Cygwin のいろんな知識と使い方。あともちろんローカルで稼働する W3C Markup Validation。一応無駄ではなかったがむなしい。やっぱ無理して Cygwin でやらないほうがいいんだろうか?
一応挫折までの経過を書いておく。
- The W3C Markup Validation Service がバージョンアップしていることに気づく。
- Another HTML-lint (以降 AHL とする) などについて議論されていたので、AHL 同様にローカルで動かせないかと考える。
- スクリプトを発見する。
- インストールの説明を読み、インストールに取りかかる (ActivePerl を使った説明もあったが、Cygwin でやろうとしたのでとばす)。
- 必要なものの中で、まず OpenSP 1.5.2 (SGML Parser) のコンパイルでつまずく。ググった結果、インストールオプションを書いたページを見つけて、書いてあるまま実行し、成功。
- sed -i 's:32,:253,:' lib/Syntax.cxx &&
sed -i 's:LITLEN 240 :LITLEN 8092:' \
unicode/{gensyntax.pl,unicode.syn}
- ./configure --prefix=/usr --disable-static --disable-doc-build \
--enable-default-catalog=/etc/sgml/catalog --enable-http \
--enable-default-search-path=/usr/share/sgml
- make pkgdatadir=/usr/share/sgml/OpenSP-1.5.2
- make pkgdatadir=/usr/share/sgml/OpenSP-1.5.2 install
- ln -v -sf onsgmls /usr/bin/nsgmls &&
ln -v -sf osgmlnorm /usr/bin/sgmlnorm &&
ln -v -sf ospam /usr/bin/spam &&
ln -v -sf ospcat /usr/bin/spcat &&
ln -v -sf ospent /usr/bin/spent &&
ln -v -sf osx /usr/bin/sx &&
ln -v -sf osx /usr/bin/sgml2xml &&
ln -v -sf libosp.so /usr/lib/libsp.so
-
必要な Perl のモジュールをインストールしまくる。しかし、今度は
SGML::Parser::OpenSP
のインストールでつまずく。うまくインストールできないので手動でやってみる。
- perl makefile.pl
- Checking if your kit is complete...
- Looks good
- Note (probably harmless): No library found for -lstdc++
- Writing Makefile for SGML::Parser::OpenSP
- make
- cp lib/SGML/Parser/OpenSP.pm blib/lib/SGML/Parser/OpenSP.pm
- cp lib/SGML/Parser/OpenSP/Tools.pm blib/lib/SGML/Parser/OpenSP/Tools.pm
- /usr/bin/perl.exe /usr/lib/perl5/5.8/ExtUtils/xsubpp -C++ -typemap /usr/lib/perl5/5.8/ExtUtils/typemap -typemap typemap OpenSP.xs > OpenSP.xsc && mv OpenSP.xsc OpenSP.c
- g++ -c -DPERL_USE_SAFE_PUTENV -fno-strict-aliasing -pipe -Wdeclaration-after-statement -DUSEIMPORTLIB -O3 -DVERSION=\"0.99\" -DXS_VERSION=\"0.99\" "-I/usr/lib/perl5/5.8/cygwin/CORE" -DSP_MULTI_BYTE=1 OpenSP.c
- cc1plus: warning: command line option "-Wdeclaration-after-statement" is valid for C/ObjC but not for C++
- OpenSP.c: In function `void XS_SGML__Parser__OpenSP_parse(PerlInterpreter*, CV*)':
- OpenSP.c:1219: warning: cast to pointer from integer of different size
- OpenSP.c: In function `void XS_SGML__Parser__OpenSP_get_location(PerlInterpreter*, CV*)':
- OpenSP.c:1250: warning: cast to pointer from integer of different size
- OpenSP.c: In function `void XS_SGML__Parser__OpenSP_halt(PerlInterpreter*, CV*)':
- OpenSP.c:1282: warning: cast to pointer from integer of different size
- OpenSP.c: In function `void XS_SGML__Parser__OpenSP_DESTROY(PerlInterpreter*, CV*)':
- OpenSP.c:1312: warning: cast to pointer from integer of different size
- Running Mkbootstrap for SGML::Parser::OpenSP ()
- chmod 644 OpenSP.bs
- rm -f blib/arch/auto/SGML/Parser/OpenSP/OpenSP.dll
- g++ -s -L/usr/local/lib OpenSP.o -o blib/arch/auto/SGML/Parser/OpenSP/OpenSP.dll \
- /usr/lib/perl5/5.8/cygwin/CORE/libperl.dll.a -losp \
-
- /usr/local/lib/libosp.a(MessageTable.o): In function `_ZNK6OpenSP19GettextMessageTable7getTextERKNS_15MessageFragmentERNS_6StringIcEE':
- /cygdrive/d/download_Files/app/perl/cgi/w3c_validator/openSP-1.5.2/lib/../include/Message.h:245: undefined reference to `_dgettext'
- /usr/local/lib/libosp.a(MessageTable.o): In function `_ZNK6OpenSP12MessageTable21registerMessageDomainERNS_13MessageModuleEPcS3_':
- /cygdrive/d/download_Files/app/perl/cgi/w3c_validator/openSP-1.5.2/lib/../include/MessageTable.h:27: undefined reference to `_bindtextdomain'
- /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libcygwin.a(libcmain.o):(.text+0xab): undefined reference to `_WinMain@16'
- collect2: ld returned 1 exit status
- make: *** [blib/arch/auto/SGML/Parser/OpenSP/OpenSP.dll] Error 1
ググった結果と勘で、_dgettext
、_bindtextdomain
に関しては、コンパイルのオプションの最後にに -lintl
を足すことで解決。_WinMain@16
に関しては、OpenSP.xs
に空の main
関数を追加
することで解決 。しかし、
- make test
してみると一つを除いてすべて失敗。Segmentation Fault がでてテスト以前の問題。個別でテストして調べると、
- perl -Mblib t/01basic.t
perl.exe
が固まる上に core ファイルが生成されない。gdb
を使って調べてみると、SGML::Parser::OpenSP
を make したときに作られる OpenSP.dll
の読み込むとやらかすようだ。ただ、問題はわかってもこれを解決する知識がないからここでギブアップ。ActivePerl でやることにする。
- Windows 用のページをちゃんと見ると、必要なActivePerl 用のモジュールは全部圧縮ファイルになって提供されていた。なんと楽な……。これを全部インストール。
- ppm install /Temp/Module-Name/Module-Name.ppd
このあとは出てくるエラーをそのつど消していって終了。ちゃんとネットワーク接続を切っても稼働したことを確認。長い道のりだった……。
稼働させて気づいたが、このプログラムはかなりメモリを食う。一瞬だからいいんだけど、色々起動しまくっているときはちょっと気にしておいたほうがいいかも。パースはたいへんなのかな?