Deprecated: Function ereg() is deprecated in /virtual/bsakatu/module/xml_declaration.inc on line 4
メモ帳日記 : The W3C Markup Validation Service を Windows のローカルで動かす
  1. メモ帳日記 >
  2. Web >
  3. HTML / CSS >
  4. The W3C Markup Validation Service を Windows のローカルで動かす

メモ帳日記

日記書いたりメモ書いたり

2007年 8月 16日(仏滅

The W3C Markup Validation Service を Windows のローカルで動かす

The W3C Markup Validation Service をローカルで動かしたいな〜、と思って探したら、ちゃんとスクリプトが提供されていた。Another HTML-lint と同じノリでインストールは楽勝だろうと思っていたら甘かった。中途半端な知識にもかかわらず、Cygwin 内で動かそうと思ったせいでえらい時間 (丸 3 日、数十時間) がかかった上に挫折した。結局は ActivePerl。得たものは Cygwin のいろんな知識と使い方。あともちろんローカルで稼働する W3C Markup Validation。一応無駄ではなかったがむなしい。やっぱ無理して Cygwin でやらないほうがいいんだろうか?

一応挫折までの経過を書いておく。

  1. The W3C Markup Validation Service がバージョンアップしていることに気づく。
  2. Another HTML-lint (以降 AHL とする) などについて議論されていたので、AHL 同様にローカルで動かせないかと考える。
  3. スクリプトを発見する。
  4. インストールの説明を読み、インストールに取りかかる (ActivePerl を使った説明もあったが、Cygwin でやろうとしたのでとばす)。
  5. 必要なものの中で、まず OpenSP 1.5.2 (SGML Parser) のコンパイルでつまずく。ググった結果、インストールオプションを書いたページを見つけて、書いてあるまま実行し、成功。
    1. sed -i 's:32,:253,:' lib/Syntax.cxx && sed -i 's:LITLEN 240 :LITLEN 8092:' \ unicode/{gensyntax.pl,unicode.syn}
    2. ./configure --prefix=/usr --disable-static --disable-doc-build \ --enable-default-catalog=/etc/sgml/catalog --enable-http \ --enable-default-search-path=/usr/share/sgml
    3. make pkgdatadir=/usr/share/sgml/OpenSP-1.5.2
    4. make pkgdatadir=/usr/share/sgml/OpenSP-1.5.2 install
    5. 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
  6. 必要な Perl のモジュールをインストールしまくる。しかし、今度は SGML::Parser::OpenSP のインストールでつまずく。うまくインストールできないので手動でやってみる。
    1. perl makefile.pl
    2. Checking if your kit is complete...
    3. Looks good
    4. Note (probably harmless): No library found for -lstdc++
    5. Writing Makefile for SGML::Parser::OpenSP
    6. make
    7. cp lib/SGML/Parser/OpenSP.pm blib/lib/SGML/Parser/OpenSP.pm
    8. cp lib/SGML/Parser/OpenSP/Tools.pm blib/lib/SGML/Parser/OpenSP/Tools.pm
    9. /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
    10. 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
    11. cc1plus: warning: command line option "-Wdeclaration-after-statement" is valid for C/ObjC but not for C++
    12. OpenSP.c: In function `void XS_SGML__Parser__OpenSP_parse(PerlInterpreter*, CV*)':
    13. OpenSP.c:1219: warning: cast to pointer from integer of different size
    14. OpenSP.c: In function `void XS_SGML__Parser__OpenSP_get_location(PerlInterpreter*, CV*)':
    15. OpenSP.c:1250: warning: cast to pointer from integer of different size
    16. OpenSP.c: In function `void XS_SGML__Parser__OpenSP_halt(PerlInterpreter*, CV*)':
    17. OpenSP.c:1282: warning: cast to pointer from integer of different size
    18. OpenSP.c: In function `void XS_SGML__Parser__OpenSP_DESTROY(PerlInterpreter*, CV*)':
    19. OpenSP.c:1312: warning: cast to pointer from integer of different size
    20. Running Mkbootstrap for SGML::Parser::OpenSP ()
    21. chmod 644 OpenSP.bs
    22. rm -f blib/arch/auto/SGML/Parser/OpenSP/OpenSP.dll
    23. g++ -s -L/usr/local/lib OpenSP.o -o blib/arch/auto/SGML/Parser/OpenSP/OpenSP.dll \
    24. /usr/lib/perl5/5.8/cygwin/CORE/libperl.dll.a -losp \
    25. /usr/local/lib/libosp.a(MessageTable.o): In function `_ZNK6OpenSP19GettextMessageTable7getTextERKNS_15MessageFragmentERNS_6StringIcEE':
    26. /cygdrive/d/download_Files/app/perl/cgi/w3c_validator/openSP-1.5.2/lib/../include/Message.h:245: undefined reference to `_dgettext'
    27. /usr/local/lib/libosp.a(MessageTable.o): In function `_ZNK6OpenSP12MessageTable21registerMessageDomainERNS_13MessageModuleEPcS3_':
    28. /cygdrive/d/download_Files/app/perl/cgi/w3c_validator/openSP-1.5.2/lib/../include/MessageTable.h:27: undefined reference to `_bindtextdomain'
    29. /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libcygwin.a(libcmain.o):(.text+0xab): undefined reference to `_WinMain@16'
    30. collect2: ld returned 1 exit status
    31. make: *** [blib/arch/auto/SGML/Parser/OpenSP/OpenSP.dll] Error 1
    ググった結果と勘で、_dgettext_bindtextdomain に関しては、コンパイルのオプションの最後にに -lintl を足すことで解決。_WinMain@16 に関しては、OpenSP.xs空の main 関数を追加することで解決 。しかし、
    1. make test
    してみると一つを除いてすべて失敗。Segmentation Fault がでてテスト以前の問題。個別でテストして調べると、
    1. perl -Mblib t/01basic.t
    perl.exe が固まる上に core ファイルが生成されない。gdb を使って調べてみると、SGML::Parser::OpenSPmake したときに作られる OpenSP.dll の読み込むとやらかすようだ。ただ、問題はわかってもこれを解決する知識がないからここでギブアップ。ActivePerl でやることにする。
  7. Windows 用のページをちゃんと見ると、必要なActivePerl 用のモジュールは全部圧縮ファイルになって提供されていた。なんと楽な……。これを全部インストール。
    1. ppm install /Temp/Module-Name/Module-Name.ppd
    このあとは出てくるエラーをそのつど消していって終了。ちゃんとネットワーク接続を切っても稼働したことを確認。長い道のりだった……。

稼働させて気づいたが、このプログラムはかなりメモリを食う。一瞬だからいいんだけど、色々起動しまくっているときはちょっと気にしておいたほうがいいかも。パースはたいへんなのかな?