スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ckwでコピペして改行が消えないようにする

前はそんなことがなかったんですが,いつの頃か気づいたら ckwでコピペをすると改行が消えてしまうようになっていました.不便とは思いつつ放置していたのですが,「不便じゃね?」というコメントをいただきましたので試行錯誤してみました.

!注意!

適当にソースを検索して見つけた箇所を,さらに適当に修正したので,副作用があるかどうか分かっていません.何か見つかりましたら,連絡いただけると幸いです.


ビルド手順

コンパイルには Visual C++ Expressを使用します.具体的な手順は以下のとおりです.

ソース入手&展開
[/]# mkdir /c/tmp
[/]# cd /c/tmp
[/c/tmp]# wget 'http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fgnupack%2F46328%2Fckw-mod-0.9.0-d1-src.zip'
[/c/tmp]# unzip ckw-mod-0.9.0-d1-src.zip
[/c/tmp]# wget 'http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fgnupack%2F46328%2Ficon_icon48.gz'
[/c/tmp]# gzip -d -N icon_icon48.gz
[/c/tmp]# mv icon.ico deflis-ckw-mod-dc6317a/rsrc

ソース修正
[/c/tmp]# cd deflis-ckw-mod-dc6317a
[/c/tmp/vc2008/deflis-ckw-mod-dc6317a]# cp misc.cpp misc.cpp.org
[/c/tmp/vc2008/deflis-ckw-mod-dc6317a]# vi misc.cpp
[/c/tmp/vc2008/deflis-ckw-mod-dc6317a]# diff misc.cpp misc.cpp.org
46,49c46,49
<               //if(*str == '\r') {
<               //      str++;
<               //      length--;
<               //}
---
>               if(*str == '\r') {
>                       str++;
>                       length--;
>               }
[/c/tmp/vc2008/deflis-ckw-mod-dc6317a]# cp makefile makefile.org
[/c/tmp/vc2008/deflis-ckw-mod-dc6317a]# vi makefile
[/c/tmp/vc2008/deflis-ckw-mod-dc6317a]# diff makefile makefile.org
9c9
< ULIB = ShLwApi.Lib user32.lib gdi32.lib shell32.lib
---
> ULIB = user32.lib gdi32.lib shell32.lib

ビルド
[/c/tmp/vc2008/deflis-ckw-mod-dc6317a]# nmake

次のgnupackリリースから上記のバイナリに置き換える予定です.

Cygwinパッケージマネージャ自作中

cyg-apt.pyは Pythonを知らないので,実装を読み解くのに時間がかかりそうなため,自分でPerlを使って作ってみることにしました.スクリプトの名前は,他に使われていないところでcyg-pm.plとしました.とりあえず,setup.iniを解析するところまではなんとかできたので,来週にでも Cygwinインストールのロジックを調査しようと思います.

実行イメージは以下のような感じです.まだ公開できるようなレベルではありませんが…

# ヘルプ表示.「*」付きはまだ設計・実装中
#  cyg-pm.pl help
cyg-pm - Cygwin Package Manager (Version 0.01)

  Usage: cyg-pm [Option]... Command [PACKAGE]...

  Command:
    help              display this message.
    setup             download leaset setup.ini.
    search PACKAGE    search package information.
  * require PACKAGE   search package which depended.
  * list [PACKAGE]    print installed package information.
  * download PACKAGE  download pakage.
  * install PACKAGE   download and install package.

  Option:
    -root DIR         set Cygwin root directory.
    -inifile FILE     set used setup.ini path.
    -mirror URL       set mirror-site URL.
    -output DIR       set download directory for command download.
    -dist NAME        set dist name. (*curr*, prev, test)
    -regexp           available regular expression for PACKAGE.

NOTE
  * is function that is not implemented.

Copyright (C) 2010 ksugita <ksugita0510@gmail.com>

# setup.iniの取得,再取得もsetupで行う
#  cyg-pm.pl setup
* Download setup.ini (ftp://ftp.jaist.ac.jp/pub/cygwin/setup.ini -> C:/gnupack/app/cygwin/1.7.7/etc/setup/setup.ini)


# searchで特定パッケージの情報を表示.
#  cyg-pm.pl search cygwin
* Analyze setup.ini (C:/gnupack/app/cygwin/1.7.7/etc/setup/setup.ini)

* Search package (cygwin [curr])
    Version     : 1.7.7-1
    Description : "The UNIX emulation engine"
    Category    : Base
    Requires    : base-passwd base-cygwin


# さらに -regexpオプションでパッケージで正規表現が利用可能.
# cyg-pm.pl -regexp search cygwin
* Analyze setup.ini (C:/gnupack/app/cygwin/1.7.7/etc/setup/setup.ini)

* Search package (base-cygwin [curr])
    Version     : 2.1-1
    Description : "Upgrade helper scripts from 1.5.x to 1.7.x"
    Category    : Base
    Requires    : cygwin

* Search package (cygwin [curr])
    Version     : 1.7.7-1
    Description : "The UNIX emulation engine"
    Category    : Base
    Requires    : base-passwd base-cygwin

* Search package (cygwin-doc [curr])
    Version     : 1.7-1
    Description : "Cygwin-specific documentation, including man pages and User's Guide"
    Category    : Doc Base
    Requires    : cygwin coreutils man texinfo cygutils _update-info-dir

* Search package (cygwin-x-doc [curr])
    Version     : 1.1.0-1
    Description : "Cygwin/X-specific documentation"
    Category    : X11 Doc
    Requires    : cygwin

追記.Pythonを抜くと gnupack develは 113MB -> 107MB,basicは89MB -> 83MBまで減る模様.

gnupack 4.07aリリース

今回のリリースでは,配布するアーカイブのサイズ削減を目的に Cygwinパッケージを減らしました.とはいえ,まだ gnupack develで 113MB,gnupack basicで 89MBなのでもう少し減らせるといいなと思っています.

話は変わりますが,NOD32で「gnupack_devel-4.06a.exeに新種・未知のNewHeur_PEである可能性」といった内容の警告が表示されたとのコメントをいただきました. gnupackのアーカイブファイル(自己解凍ファイル)は,7-Zipで作成して,先のアーカイブファイルは7-Zip 9.15 betaで作成しました.McAfeeのウィルス対策ソフトで検査したところ,私の環境ではウィルスの検知はされませんでしたが,非常に気になります.もし追加で情報があれば,ご連絡いただけると幸いです.


追記.NOD32の体験版をインストールして検査してみたところ,gnupack_devel-4.06a.exeに対してスキャンすると確かに NewHeur_PEというのが出ました.

ただ,展開後のフォルダ C:\gnupack_devel-4.06aに対してスキャンすると検出されません.ESET Smart Security / ESET NOD32アンチウイルスにおける誤検出についてという事象があるようですが…


10/7 追記.またもや NOD32でNewHeur_PEが表示されたとの報告をいただきました.ただし,今回は C:\gnupack_xxx-xxx\emacs.exeではなく,C:\gnupack_xxx-xxx\app\emacs\emacs\bin\emacs.exeとのこと.どちらもバイナリ名は同じですが,ソースはまったくの別物(前者は私の自作,後者は GNU Emacs製)なので関連性はないのですが...NOD32の開発元に誤検知かどうかの問い合わせをしようと思ったのですが,それらしき問合せ先が見つけられず,いまだ未対処です.申し訳ありません.


10/9 追記.親切にも問合せ先についてコメントをいただきましたので,販売元に問い合わせしてみました.とはいえ,名も知られていないソフトの身元不明の人間からの問い合わせに果たして答えてもらえるのか不安です.とりあえず,問題がでているのは emacs.exeのようなので,同じ内容になりますが,再度ビルドしたもので gnupackをリリースし直そうかなと思っています.

Cygwinパッケージの追加方法(試行錯誤中)

本日,cyg-aptをバンドルした gnupack 4.06aをリリースしました.詳細はgnupack Users Guideをご覧ください.

ここからが本題です.gnupackの Cygwinには私の考える必要最低限のパッケージを含めていますが,人にとっては必要最低限を満たせていない可能性があります.しかし,万人向けに対応しようとすると,パッケージがどんどん増えて,ファイルサイズが大変なことになります.

そこで,不足のパッケージがあれば,利用者自身で追加する仕組みを組み込むことにしました.Webで調べたところ,cyg-aptというコマンドラインからパッケージが管理できるツールがあるようなので,今回はこれを利用します.ちなみに,導入したばかりでなんですが,xinitのインストールを試してみたところ,うまくインストールできていませんでした.また,rubyのインストールを試したところ,コマンド実行はうまく言っていたようですが,cygcheck -c rubyの結果が「Incomplete」となっていました.まだ見直しが必要そうなので,今後の検討課題にしようと思います.

実行イメージはこんな感じです.

  • 引数なし,あるいは「help」指定で起動するとヘルプを表示します.
    [Path: /tmp]# /app/script/cyg-apt.py help
    cyg-apt [OPTION]... COMMAND [PACKAGE]...
    Commands:
        available -  show packages available to be installed
        ball - print tarball name
        build - build package from source in CWD
        download - download package
        find - package containing file
        help - help COMMAND
        install - download and install packages, including dependencies
        list - installed packages
        md5 - check md5 sum
        missing - print missing dependencies
        new - list available upgrades to currently installed packages
        remove - uninstall packages
        requires - print requires: for package
        search - search package list
        setup - cygwin environment
        source - download, build and install
        update - setup.ini
        upgrade - all installed packages
        url - print tarball url
        version - print installed version
    
    Options: -d,--download download only -i,--ini=FILE use setup.ini [%(setup_ini)s] -m,--mirror=URL use mirror [%(mirror)s] -r,--root=DIR set cygwin root [%(root)s] -t,--t=NAME set dist name (*curr*, test, prev) -x,--no-deps ignore dependencies
  • 初回実行時は setup.iniを取得するために,cyg-apt setupを実行します.setup.iniを再取得する場合には,cyg-apt updateを実行します.
    [Path: /tmp]# /app/script/cyg-apt.py setup
    getting C:/gnupack_devel-4.06a/app/cygwin/cygwin/etc/setup/setup.ini
    ...100%
    
    [Path: /tmp]# /app/script/cyg-apt.py update ...100%
  • パッケージを検索する場合,cyg-apt searchを実行します.例えば,「ruby」文字列が含まれるパッケージを表示するには,cyg-apt search rubyを実行します.
    [Path: /tmp]# /app/script/cyg-apt.py search ruby
    ruby - Interpreted object-oriented scripting language
    subversion-ruby - A version control system (ruby bindings)
    
  • パッケージをインストールする場合,cyg-apt installを実行します.例えば,「ruby」をインストールするには,cyg-apt install rubyを実行します.
    [Path: /tmp]# which ruby
    which: no ruby in (/app/emacs/emacs/bin:GVIM_DIR%/bin:/app/mingw/tdm/bin:/usr/local/bin:/usr/bin:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/system32/Wbem:/app/gdi++)
    
    [Path: /tmp]# /app/script/cyg-apt.py install ruby Fetching http://ftp.jaist.ac.jp/pub/cygwin/release/ruby/ruby-1.8.7-p72-2.tar.bz2 ...100% C:/gnupack_devel-4.06a/app/cygwin/cygwin/var/cache/setup/http%3a%2f%2fftp.jaist.ac.jp%2fpub%2fcygwin/release/ruby/ruby-1.8.7-p72-2.tar.bz2
    bc133aeeb536c68f2fa815ffff1473f5 ruby-1.8.7-p72-2.tar.bz2 - remote bc133aeeb536c68f2fa815ffff1473f5 ruby-1.8.7-p72-2.tar.bz2 - local installing ruby 1.8.7.p.72-2

    [Path: /tmp]# which ruby /usr/bin/ruby

NTEmacs 23.2.1のビルド手順

既にgnupack Users Guide - ビルド手順で記載していますが,手順の説明を補足したものを再掲します.


ビルド環境の準備

ビルド環境を用意します.コンパイラには MinGW(TDM's GCC/mingw32 Builds),coreutilsや patchなどの UNIX系コマンドには Cygwin/を利用します.今回,環境の構築には,gnupackを使います.gnupackのインストール手順は以下のとおりです.

  1. Sourceforge.jpから最新の gnupack develを取得.(ここでは gnupack_devel-4.05a.exeと仮定)
  2. 取得した gnupack_devel-4.05a.exeを実行し,C:\に展開.
  3. C:\gnupack_devel-4.05a\bash.exeを実行.
  4. Bash上で gcc --versionを実行し,以下のように表示されることを確認.
    [/]# gcc --version
    gcc.exe (tdm-1) 4.5.1
    Copyright (C) 2010 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    

ビルド前の準備

作業ディレクトリに移動します.今回は C:\tmpを作成し,そこで作業します.

[/]# # 作業ディレクトリの移動
[/]# mkdir "C:\tmp"
[/]# cd "C:\tmp"
[/c/tmp]#

ソースファイルを取得します.取得には wgetを使わずに,ブラウザからダウンロードしても問題はありません.

[/]# # ソースファイルの取得
[/c/tmp]# wget http://ftp.gnu.org/pub/gnu/emacs/emacs-23.2.tar.gz
[/c/tmp]# cksum emacs-23.2.tar.gz
4109369907 46831697 emacs-23.2.tar.gz
[/c/tmp]# tar zxf emacs-23.2.tar.gz

パッチファイルを取得します.取得には wgetを使わずに,ブラウザからダウンロードしても問題はありません.なお,wgetで取得する場合,引数で指定するURLを「'(シングルクォート)」で囲んでください.「'(シングルクォート)」がないと,bashが「&」などを構文解析してしまい,正しくファイルがダウンロードできません.

[/c/tmp]# # Emacs-23.1.92-IME+a.patchの取得
[/c/tmp]# wget 'http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fgnupack%2F46325%2FEmacs-23.1.92-IME%2Ba.patch.gz'
[/c/tmp]# cksum Emacs-23.1.92-IME+a.patch.gz
3263424522 22264 Emacs-23.1.92-IME+a.patch.gz
[/c/tmp]# gzip -d Emacs-23.1.92-IME+a.patch.gz

[/c/tmp]# # Emacs-23.1.92-IME_ReConversion.patchの取得
[/c/tmp]# wget 'http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fgnupack%2F46325%2FEmacs-23.1.92-IME_ReConversion.patch.gz'
[/c/tmp]# cksum Emacs-23.1.92-IME_ReConversion.patch.gz
24490718 481 Emacs-23.1.92-IME_ReConversion.patch.gz
[/c/tmp]# gzip -d Emacs-23.1.92-IME_ReConversion.patch.gz

パッチファイルを適用します.パッチ適用の成功は,echo $?の実行結果0で確認できます.

[/c/tmp]# cd emacs-23.2
[/c/tmp/emacs-23.2]# # Emacs-23.1.92-IME+a.patchの適用
[/c/tmp/emacs-23.2]# patch -b -p1 < ../Emacs-23.1.92-IME+a.patch
patching file lib-src/makefile.w32-in
patching file lisp/international/w32-ime.el
patching file lisp/loadup.el
patching file nt/configure.bat
patching file src/keyboard.c
patching file src/w32.c
patching file src/w32fns.c
Hunk #10 succeeded at 6401 (offset 4 lines).
Hunk #11 succeeded at 8190 (offset 4 lines).
Hunk #12 succeeded at 8238 (offset 4 lines).
Hunk #13 succeeded at 8297 (offset 4 lines).
Hunk #14 succeeded at 8309 (offset 4 lines).
Hunk #15 succeeded at 8329 (offset 4 lines).
patching file src/w32term.c
patching file src/w32term.h
patching file src/window.c
[/c/tmp/emacs-23.2]# echo $?
0

[/c/tmp]# # Emacs-23.1.92-IME_ReConversion.patchの適用 [/c/tmp/emacs-23.2]# patch -b -p1 < ../Emacs-23.1.92-IME_ReConversion.patch patching file src/w32fns.c Hunk #1 succeeded at 3228 (offset 57 lines). [/c/tmp/emacs-23.2]# echo $? 0

バイナリファイルのアイコンは,emacs-23.2/nt/icons/emacs.icoを置換することで変更することができます.gnupackで配布しているバイナリはhttp://sourceforge.jp/projects/gnupack/downloads/46325/emacs_icon48.gz/で置換しています.


外部DLLの準備

画像フォーマットに対応させる場合,GnuWin32から以下のファイルを入手します。

なお,gnupack develを利用している場合,必要なファイルを以下に格納済みのため,個別にダウンロードする必要はありません.

[/c/tmp/emacs-23.2]# # DLLファイルの格納場所
[/c/tmp/emacs-23.2]# ls -R "C:/gnupack_devel-4.05a/app/gnuwin32/dll"
C:/gnupack_devel-4.05a/app/gnuwin32/dll:
jpeg62.dll*     libtiff3.dll*   xpm4.dll*
libpng12.dll*   libungif4.dll*  zlib1.dll*

[/c/tmp/emacs-23.2]# # ヘッダの格納場所
[/c/tmp/emacs-23.2]# ls -R "C:/gnupack_devel-4.05a/app/gnuwin32/include"
C:/gnupack_devel-4.05a/app/gnuwin32/include:
gif_lib.h       jpeglib.h       simx.h          tiffvers.h
jconfig.h       libpng12/       tiff.h          X11/
jerror.h        png.h           tiffconf.h      zconf.h
jmorecfg.h      pngconf.h       tiffio.h        zlib.h

C:/gnupack_devel-4.05a/app/gnuwin32/include/libpng12:
png.h  pngconf.h

[/c/tmp/emacs-23.2]# # ライブラリの格納場所
[/c/tmp/emacs-23.2]# ls -R "C:/gnupack_devel-4.05a/app/gnuwin32/lib"
C:/gnupack_devel-4.05a/app/gnuwin32/lib:
jpeg.def                libpng-bcc.lib          libXpm.dll.a
jpeg.lib                libtiff.def             libXpm.lib
jpeg-bcc.lib            libtiff.dll.a           libXpm-bcc.lib
libjpeg.dll.a           libtiff.lib             libz.a
libpng.dll.a            libtiff-bcc.lib         libz.dll.a
libpng.la               libungif.def            pkgconfig/
libpng.lib              libungif.dll.a          xpm.def
libpng12.def            libungif.lib            zlib.def
libpng12.dll.a          libungif-bcc.lib        zlib.lib
libpng12.la             libXpm.a                zlib-bcc.lib

C:/gnupack_devel-4.05a/app/gnuwin32/lib/pkgconfig:
libpng.pc  libpng12.pc  xpm.pc

ビルドの実行

まず configure.batを実行し,makefileを生成します.ここでは便宜上,GnuWin32の格納パスと NTEmacsのインストールパスを環境変数に設定しています.このとき,パスの区切り文字に「\(バックスラッシュ)」を指定すると make install時にパスの構文解析が失敗し,インストールが失敗するのでご注意ください.

[/c/tmp/emacs-23.2]# # GnuWin32格納パスの設定
[/c/tmp/emacs-23.2]# gnuwin32="C:/gnupack_devel-4.05a/app/gnuwin32"
[/c/tmp/emacs-23.2]# echo $gnuwin32
C:/gnupack_devel-4.05a/app/gnuwin32

[/c/tmp/emacs-23.2]# # NTEmacsインストールパスの設定
[/c/tmp/emacs-23.2]# prefix="C:/emacs"
[/c/tmp/emacs-23.2]# echo $prefix
C:/emacs

[/c/tmp/emacs-23.2]# cd nt
[/c/tmp/emacs-23.2/nt]# ./configure.bat --prefix $prefix --no-debug --with-gcc --no-cygwin --enable-w32-ime --cflags -O3 --cflags -fno-tree-vectorize --cflags -funsigned-char --cflags -mthreads --cflags -pipe --cflags -DRECONVERSION --cflags -D_UNICODE --cflags -I"$gnuwin32/include" --ldflags -L"$gnuwin32/lib"
Checking for 'cp'...
Checking for 'rm'...
Checking for Windows Version ...
Checking whether W32 API headers are too old...

C:\tmp\emacs-23.2\nt>gcc -O3 -fno-tree-vectorize -funsigned-char -mthreads -pipe -DRECONVERSION -D_UNICODE -IC:\gnupack_devel-4.05a\app\gnuwin32\include -DWINVER=0x0501 -mno-cygwin -c junk.c
Using 'gcc'
Checking for libpng...
...PNG header available, building with PNG support.
Checking for jpeg-6b...
...JPEG header available, building with JPEG support.
Checking for libgif...
...GIF header available, building with GIF support.
Checking for tiff...
...TIFF header available, building with TIFF support.
Checking for libXpm...
...XPM header available, building with XPM support.

<snip>

Emacs successfully configured.
Run `make' to build, then run `make install' to install.

なお,configure.batの結果,「XXX header available, building with XXX support.」にならずに「xxx.h not found, building without XXX support.」と表示された場合,画像関連のライブラリが正しく設定できていないため,画像フォーマット対応のバイナリは作成できませんのでご注意ください.特に simx.hは見逃しがちのようなのでご注意ください(xpm-3.5.1-1-src.zipsrc/xpm/3.5.1/libXpm-3.5.1-src/lib/simx.hにあります)

画像フォーマットのサポートが不要な場合,configure.batを以下のように実行してください.

[/c/tmp/emacs-23.2/nt]# ./configure.bat --prefix $prefix --no-debug --with-gcc --no-cygwin --enable-w32-ime --cflags -O3 --cflags -fno-tree-vectorize --cflags -funsigned-char --cflags -mthreads --cflags -pipe --cflags -DRECONVERSION --cflags -D_UNICODE --without-png --without-jpeg --without-gif --without-tiff --without-xpm

makefaileが作成できたら,makeを実行します.今回,コンパイラに MinGW(TDM's GCC/mingw32 Builds)を使用するので,makeコマンドは mingw32-makeを使います.

なお,makeの際,コンパイルオプションを指定することでビルド環境に最適なバイナリを生成することも可能です.ちなみに,私の環境(Intel Core2Duo 6600/Memory 2GB)で mingw32-make bootstrapは約30分かかりました.

[/c/tmp/emacs-23.2/nt]# mingw32-make ARCH_CFLAGS="-c -march=pentium-m -msse4.1 -mfpmath=sse -pipe" bootstrap

makeが成功したら,make installを実行し,画像関連のDLLを emacs.exeと同じディレクトリにコピーしてビルド終了です.

[/c/tmp/emacs-23.2/nt]# mingw32-make install
[/c/tmp/emacs-23.2/nt]# cp $gnuwin32/dll/* $prefix/bin

ビルドした NTEmacsは C:\emacs\bin\runemacs.exeの実行で起動できます.NTEmacsの起動後に M-: (eval 'image-types)と実行して,「(png gif tiff jpeg xpm xbm pbm)」が表示されれば画像フォーマットのサポートができていることが確認できます.

リンク
最新コメント
カテゴリー
最近の記事
月別アーカイブ
ブログ内検索
最新トラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。