rcmdnk's blog
Last update

Utf-8

Macで手動でインストールしているものがいつの間にか GNU screenだけになっていたのでこれもHomebrewで管理出来る様にしました。

Homebrewのデフォルトscreenと問題点

現在のHomebrewデフォルトでは 1screen.rb: https://github.com/Homebrew/homebrew-dupes/blob/master/screen.rb にあるように、 GNU screenプロジェクトから配布されてるものに対して utmp関連のwarningを抑える様なパッチを当てています。

GNU screen 最新版について

ただ、これだけだと日本語が上手く表示できない問題があって、 コレに対しても別のパッチが必要です。

Macでの文字化け対策用のGNU screenのインストール

なので、直接Homebrewは使えなかったので手動でコンパイルしてインストールしていたのですが、 そのパッチ付きのformulaを作ってそれで管理することにしました。

screenutf8

名前はscreenutf8としておきました。 GitHubにあります。

homebrew-rcmdnkpac/screenutf8.rb

使い方は

$ brew tap rcmdnk/homebrew-rcmdnkpac
$ brew install screenutf8 --utf8

とすれば上のリンク先で説明しているUTF8用の2つのパッチをあててインストールします。

--utf8を付けなければデフォルトのscreenと全く一緒です。

--HEADと組み合わせて

$ brew install screenutf8 --utf8 --HEAD

とすればHEAD版のものが入ります。

追記: 2015/03/10

Macでの文字化け対策用のGNU screenのインストール で書いたとおり http://zuse.jp/misc/screen-utf8-osc.diffが リンク切れになってたので、それに対応してFormulaも書き直しました。

追記ここまで

Formulaの覚書

今回の追加では、--utf8というオプションを追加して、 パッチをあてる部分を作りました。

オプション

オプションの追加は

option "utf8", "Apply patches for utf8"

の様に、optionの次にオプション名、その後に必要なら説明を,の後に書きます。

これで、--utf8という引数が使える様になります。

Formula内では、

if build.includ? "utf8"

と言う形でチェックが可能。

もしくは、with--XXXという形でオプションを指定すると、

if build.with? "XXX"

または

if build.include? "enable-XXX"

と言うチェックも可能になるようです。

パッチ

パッチファイルをウェブから取ってきてあてる基本的な書き方

パッチの基本的な書き方は

1
2
3
patch do
  url "https://gist.github.com/raw/626040/be6a04f0e64c56185ba5850415ac59dad4cd62a0/screen-utf8-nfd.patch"
end

な感じでpatch do~end内にパッチのURLを書いておくだけです。 これでインストール作業前にパッチがあてられる様になります。

パッチファイルをチェックしたい場合はsha1などをチェックしておいて 2

1
2
3
4
patch do
  url "https://gist.github.com/raw/626040/be6a04f0e64c56185ba5850415ac59dad4cd62a0/screen-utf8-nfd.patch"
  sha1 "75522565629e49ce42e9a332795241491a270bad"
end

と、加えて上げればOK。

また、通常はパッチをrootディレクトリ3 であてる事を想定していますが、 もし、階層が違う場合等、 patchに与える-p2オプションとかが必要な場合は、

1
2
3
4
patch :p2 do
  url "https://gist.github.com/raw/626040/be6a04f0e64c56185ba5850415ac59dad4cd62a0/screen-utf8-nfd.patch"
  sha1 "75522565629e49ce42e9a332795241491a270bad"
end

と、patchのところにオプションを与えてあげればOK。

screenutf8.rbでは(screen.rbでも) 通常はhttp://ftpmirror.gnu.org/screen/screen-4.2.1.tar.gz をダウンロードして使いますが、 この中身はソースだけで一番上にパッチをあてたいファイルたちも居ます。

一方、--HEADを指定すると、 git://git.savannah.gnu.org/screen.git からCloneしてきて使うのですが、この時は中にsrcディレクトリがあって その中にソースコードが入っています。

もともと、パッチはこのGitのレポジトリのトップディレクトリで作られてるので、 --HEADの場合が何もなく(もしくはp1)てそのままパッチをあてられます。

一方、stableな通常インストールの方で階層が1つ浅くなるので1つ階層を消すためにp2を与えないといけません。

パッチを直接書き込む

パッチの中直接パッチを書き込んでしまうことも可能です。

やり方は、Formulaファイルの最後に__END__と書き込み、 その下にパッチの記述を書きます。

__END__と書くと、それより下はFormula用コマンドとしては無視され、 この部分をDATAとして中で呼ぶ事が出来る様になります。

従って、下みたいにすればOK。

screenutf8.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
require "formula"

class Screenutf8 < Formula
  homepage "http://www.gnu.org/software/screen"

  stable do
...
    # These patches are to fix character corruptions on UTF-8
    if build.include? "utf8"
      patch :p2, :DATA
    end
...
    system "make install"
  end
end
...
__END__
diff --git a/src/ansi.c b/src/ansi.c
index fa53775..4a21f84 100644
--- a/src/ansi.c
+++ b/src/ansi.c
@@ -725,6 +725,10 @@ register int len;
 		      LPutChar(&curr->w_layer, &omc, ox, oy);
 		      LGotoPos(&curr->w_layer, curr->w_x, curr->w_y);

DATAを使う時でもp2等のオプションとの併用が可能。

同様にDATAの代わりに

patch :p2, "...patch description..."

の様にパッチの内容を直接書いてしまっても行けるみたいです。

複数まとめてパッチをあてる

また、 patchesという関数を定義することでも パッチをあてることが出来ます。

patchesの返り値を見て、それらを使ってパッチをあてます。

なので、上の1つ1つのパッチでも

1
2
3
def patches
  "https://gist.github.com/raw/626040/be6a04f0e64c56185ba5850415ac59dad4cd62a0/screen-utf8-nfd.patch"
end

と書き直せます。

複数の場合には配列にして、

1
2
3
4
def patches
  ["https://gist.github.com/raw/626040/be6a04f0e64c56185ba5850415ac59dad4cd62a0/screen-utf8-nfd.patch",
   "http://zuse.jp/misc/screen-utf8-osc.diff"]
end

としてあげればOK。

また、階層を変えるためにp2等のオプションを与えたい場合には ハッシュにして、

1
2
3
4
5
def patches
  { :p2 => ["https://gist.github.com/raw/626040/be6a04f0e64c56185ba5850415ac59dad4cd62a0/screen-utf8-nfd.patch",
   "http://zuse.jp/misc/screen-utf8-osc.diff"]
  }
end

コレを使うと、上のscreenutf8.rbはこんな感じでも書けます。

screenutf8.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
require "formula"

class Screenutf8 < Formula
  homepage "http://www.gnu.org/software/screen"

  url "http://ftpmirror.gnu.org/screen/screen-4.2.1.tar.gz"
  mirror "http://ftp.gnu.org/gnu/screen/screen-4.2.1.tar.gz"
  sha1 "21eadf5f1d64120649f3390346253c6bc8a5103c"

  head "git://git.savannah.gnu.org/screen.git", :branch => "master"

  depends_on "autoconf" => :build
  depends_on "automake" => :build

  option "utf8", "Apply patches for utf8"

  def patches
    # This patch is to disable the error message
    # "/var/run/utmp: No such file or directory" on launch
    parr = ["https://gist.githubusercontent.com/yujinakayama/4608863/raw/75669072f227b82777df25f99ffd9657bd113847/gistfile1.diff"]
    if build.include? "utf8"
      # These patches are to fix character corruptions on UTF-8
      parr = parr +
          ["https://gist.github.com/raw/626040/be6a04f0e64c56185ba5850415ac59dad4cd62a0/screen-utf8-nfd.patch",
           "http://zuse.jp/misc/screen-utf8-osc.diff"]
    end
    if build.stable?
      { :p2 => parr }
    elsif build.head?
      { :p1 => parr }
    end
  end

  def install
    if build.head?
      cd "src"
    end

    # With parallel build, it fails
    # because of trying to compile files which depend osdef.h
    # before osdef.sh script generates it.
    ENV.deparallelize

    system "./autogen.sh"
    system "./configure", "--prefix=#{prefix}",
                          "--mandir=#{man}",
                          "--infodir=#{info}",
                          "--enable-colors256"
    system "make"
    system "make install"
  end
end

大分スッキリ出来た感じです。 (一応上の方のは元の形残しておこうかな、と思って元のファイルにパッチ部分を加えただけにしてたわけですが。)

Formula Cookbook · Homebrew/homebrew Wiki

Homebrew用のパッケージの簡単な作り方

Homebrew Caskのアップデート等

まとめ

これでMacでは手動で入れなきゃいけないものが無くなったので stowとかも必要無くなりました。

stowでmake installしたパッケージを管理

コレを機に、 Linuxの方とかではオプション情報が残るpacoに戻ろうかな、 とかも考えてます。

pacoでmake installしたパッケージを管理

問題はCygwinでは使え無いのでやはりそことは別の物になってしまうのがあれですが。

ただ、Linuxで管理者権限持ってなくてローカルに沢山インストールしたい、 となる事は結構あるので 4、 そういった時に、ローカルで使えるパッケージ管理みたいのがあったら 便利だな、とか思うのですが。 (pacoやstowはインストール作業はどうしても手作業なので。。。)

上のパッチ付きのものに関しては、元の部分と競合するわけでもないので 気が向いたら homebrew-dupes にPull Requestでも送ってみようかと思っています。

Sponsored Links
  1. デフォルト、と言っても現在はHomebrewをインストールしただけでは screenのFormulaは入っていません。

    これはMac自身にすでにscreenが入っているからです。

    このような既にインストールされてるソフトについては、 homebrew-dupes: https://github.com/Homebrew/homebrew-dupes というレポジトリの中にFormulaが入っているので、これを

    $ brew tap homebrew-dupes
    

    としてtapしておく必要があります。

  2. $ shasum -a 1 screen-utf8-nfd.patch
    

  3. アーカイブを取ってきたならそれを展開して一番上のディレクトリ、GitとかからCloneしてきたならそれの一番上のディレクトリ。

  4. Linuxでのローカル初期設定

Sponsored Links

« ルータ越しでポート指定なども出来ない場合にもSSHで接続出来るようにする Vimでwrapした文章もインデント出来る様になった »

}