hack のためのネタ帳, etc,,,

Cygwin 用コマンドライン版パッケージ管理ツール
Debian GNU/Linux の apt-get ライクな操作が可能

License

公式 fork である transcode-open 系統は
2013-12-19 現在、Google code で公開されてるオリジナル版は GPL v2 or later で、Github で新たに公開された版は MIT license になってる。
ただし、MIT license 版も version 表示に、GPL って表示が残ってる状態なので、若干まぎらわしい。

野良 fork は GoogleCode で公開されてるオリジナル版から fork しているものがほとんどのようで、基本 GPL v2 or later である。

公式ページ等

活発さって意味では野良の cfg, ashumkin 系統には面白い修正が多数あるが、2013-12-19 現在、他の野良 fork には見るべきものはほとんどない。
むしろ現在に至っても未だに新規で野良 fork 起こしたり、公式リポジトリの root から fork し arch 対応から始める人が後を絶たないというかなり謎な状況が生じている。
Blog も 8〜9 月くらいの blog につかまり arch 対応だけして .xz 対応に気付いてない人とか大量にいるので、多分ググって最初に当たった情報で満足してそれ以上深く調べないで止まっちゃってる人が多いんだと思われ。

現状の解説

2012-12-19 現在の状況を説明すると、
まず 2013-07-22 にリリースされた Cygwin 1.7.22 で x86_64 版のサポートが追加されたことに伴い、cygwin のリポジトリの構造が変更された。
具体的には従来、 となっていた URL が のように architecture 情報を含んだ path に変更された。
これに伴い、オリジナルの apt-cyg が動作不能な状況になったため、2013-07-28 に Github に公式リポジトリが作成されると共に、公式ページの下部に、以下のようなメッセージが追加された。
If you find something that is not working or not compatible with a newer version of Cygwin, the easiest way to fix it is to fork the Github version: https://github.com/transcode-open/apt-cyg
直訳すると以下のようになる。
もしあなたが Cygwin のより新しいバージョンにおいて動作不良や非互換となる何かを見つけたなら、それを修正するための最も簡単な方法は Github バージョンである https://github.com/transcode-open/apt-cyg を fork することです。
要するに修正を共有し易いよう Github にリポジトリを用意したので、これを fork して修正を皆で共有してくれと言う趣旨だ。
また、元々 GoogleCode では GPLv2 でライセンスしていたのが、Github のリポジトリでは、より制限の緩い MIT ライセンスに変更されており、より共有し易いようにと配慮されたことが伺われる。
ただ、残念なことにこの作業以降、作者様は長い沈黙に入られており 2013-12-19 現在に至るまで apt-cyg に関連の活動には関与された形跡が見当たらない状況。
その後、公式 fork にぶら下がる形で多数の人が不具合の修正をコミットし始めたのだが、なぜかみんな重複した修正を独自かつ不完全に行っているという不思議な状況が生まれている。

実は公式 fork が作成される以前から github へ独自作成された repository が少なくとも 3 つは存在している。
これらいわゆる野良 fork のいくつかは、結構活発かつ意欲的な開発・修正が行われている。
実際、早い物だと cygwin 1.7.22 のリリース当日である 2013-07-22 のうちに patch(ashumkin / apt-cyg / 0926530)が作成されていることも確認できる。
公式 fork よりも、野良 fork の cfg, ashumkin 系統の方がかなり機能強化も進んでいるので、興味のある人はそちらを調べてみる方が面白いと思う。

2014-02-20:
状況に進展があった模様。
2014-02-17 突如として i..@skl.me 氏により Google Code / apt-cyg のリポジトリが更新され始めた。
メンテナまかされたのかな?
その後 transcode-open/apt-cyg にも更新が入り始めたんだけど、github 版は折角 MIT license 化されてたのに Google Code の方から GPLv2 のコードそのまま持って来てるし orz
committer が複数いる場合、そこはちょっと配慮が欲しい。
とりあえず、公式 fork に現状で必要だった修正を施した私家版を以下で公開している。 この件で、以前ここにごちゃごちゃ書いていたことは apt-cyg.20131025, apt-cyg.20131025 に退避したので、興味があればそちらを参照。

2013-10-26 時点で、主な修正点は以下の4点。
  1. package の .tar.xz 対応 (sieste31/apt-cyg/d0bb8af から pull)
  2. mirror の multiarch 対応 (boothj5/apt-cyg/d05f149 から pull)
  3. cache の multiarch 対応
  4. rootdir の multiarch 対応

1. は、一部のパッケージが .xz 形式で提供されるようになっているため対応が必要。
例えば 2013-10-26 現在だと、x86_64 版の vim-7.3.1314-1.tar.xz 等が該当する。
2. は、1.7.22 でサーバー側のリポジトリ構造が変更されたため対応が必要。
3. は、x86_64 版と x86 版の両方をインストールしている場合、ダウンロードしてきたパッケージ情報やパッケージ等が相互に干渉してしまうため、対応が必要。
4. は、x86_64 環境から x86 環境側のパッケージをインストール、またはその逆を行いたい場合に対応が必要。

2013-10-26 現在、1, 2 の patch は、github 上に存在してたけど、3, 4 は私家版以外存在してなさそうな雰囲気。

4. は、例えば 2013-10-26 現在 x86_64 環境には chere パッケージが提供されていないので、x86_64 環境から x86 環境の chere パッケージをインストールしたい場合等で役に立つと思う。
やり方は、新たに追加した --charch オプションを用いて、以下のようにすれば良い。
apt-cyg --charch x86 install chere
--charch オプションは x86_64 または x86 の何れかを取ることが出来る。
--charch は chroot コマンドを利用して、x86_64, x86 環境の rootdir に変更した後 apt-cyg を実行し直しすことで実現している、現在の apt-cyg はパラメーターを読んだ端から shift で捨てて行くため、他のパラメータを捨てられる前に chroot する必要がある。このため --charch は必ず第1パラメータに与える必要がある。

Cygwin 1.7.22 で導入された multiarch 対応についての修正は以上だが、その他にも以下のような修正を施してある。
  • --ignore-case,-i オプション: 検索時に大文字小文字を無視する。
  • --use-setuprc オプション: setup-x86.exe, setup-x86_64.exe の cache, mirror 情報を引き継ぐ。
  • --force-remove オプション: remove 時に強制的に削除する(.xz 非対応版で package db が壊れた場合等への対応用)。
  • --ipv4,-4 オプション: wget で ipv4 を強制する。
  • GnuPG による署名確認必須化 (-X オプションでキャンセル可能)
  • 公開鍵管理機能の追加(cygwinports 等も検証できるようにした)
  • upgrade-self サブコマンドの追加。git clone で取ってきている場合 git pull 出来るようにした。(2014-04-10)
  • --proxy,-p オプション: proxy を設定する。デフォルトは簡易版 wpad により proxy の自動設定する。APT_CYG_PROXY 環境変数でデフォルト値を指定可能。(2014-05-06)
  • depends, rdepends サブコマンドの追加。依存関係を芋づる式に辿って表示する。(2014-05-06)
  • bash completion のサポート。completion-install, complition-uninstall サブコマンドで bash completion の登録・解除を行なえるようにした。completion script は apt-cyg の更新を検出して自動更新する。--completion-disable-autoupdate オプションをつけて completion-install すると自動更新しない。(2014-05-11)

2013-12-19 現在、GnuPG による署名確認に対応している fork は見当たらない状況なので、セキュリティ気にする人にはお勧めかもしれない。
wpad による proxy 自動設定は proxy 設定しないと外に出れない環境対策。申し訳ないが wpad が提供されない環境だと1秒くらい起動にもたつく。export APT_CYG_PROXY=inherit 設定して親の環境引き継ぐようにしておいてもらえれば実害はなくなる。

今後の拡張すべき項目

2013-12-19:
  • noarch 対応(cygwinportsで必要) x86, x86_64 の setup.ini の中からパス指定して呼ばれているので、対応は不要だった。
  • last-mirror の複数 mirror 対応(cygwin と cygwinports の併用で必要)
  • upgrade 対応(mintty, bash, cygwin1.dll 等が使用中だと上書きが難しいのが難点)
  • setup wrapper(オプションつけて呼べるので自前でごちゃごちゃやるよりこっちの方が楽そう)
  • remove 時の依存関係解消
  • completion 対応 (2014-05-11 対応)
  • 高速化
オリジナルのバージョンについて、カレントディレクトリに最新版を取得するには以下のようにすれば良かったが、これは既に OBSOLETE.
wget http://apt-cyg.googlecode.com/svn/trunk/apt-cyg
chmod +x apt-cyg
Cygwin 1.7.22 で 64 bit 環境がサポートされた際、リポジトリが x86_64 と x86 に分かれた事に対応出来てないので、そもそも使えない。
作者様が github に放流してくれているので漁れば対応した fork が多数見つかるはず。

上記、私家版で良ければ、wget,ca-certificates,gnupg の3パッケージを導入した上で、以下のようにしてもらえば良い。
[ "`arch`" = "i686" -a ! -e /etc/ssl ] && ln -s /usr/ssl /etc/
wget https://raw.github.com/kou1okada/apt-cyg/master/apt-cyg
chmod +x apt-cyg
./apt-cyg --use-setuprc
x86 版の場合に /etc/ssl へシンボリックリンクを作っている理由は Cygwin - wget を参照。
setup.exe で利用していた last-cache と last-mirror は /etc/setup/setup.rc 内に記録されている。
これを apt-cyg に引き継ぐのを簡単にするため私家版では --use-setuprc オプションを追加している。
内容的としては以下の処理をやっているだけ。
apt-cyg -c "$(grep -A1 last-cache  /etc/setup/setup.rc | tail -n1 | sed -r 's/^\s*|\s*$//g')"
apt-cyg -m "$(grep -A1 last-mirror /etc/setup/setup.rc | tail -n1 | sed -r 's/^\s*|\s*$//g')"
あと、署名の検証なんて不要と言う男らしい(?)人は --no-verify または -X オプションで検証を省略出来るので GnuPG はなくても動く。

2014-04-10:
要 PowerShell だけど、cygwin 本体に加え apt-cyg と mintty here までセットにして bootstrap 的に自動セットアップする BAT ファイルも作ってみた。
apt-cyg は git clone で取って来てくるので upgrade-self も可能。

バグ

Cygwin 1.7.22 対応出来ていない版を使うと、例えば以下のようなエラーが発生する。
$ apt-cyg update
Working directory is /cygdrive/c/Users/kou/Downloads/cygwin
Mirror is http://ftp.jaist.ac.jp/pub/cygwin/
--2013-12-02 15:58:16--  http://ftp.jaist.ac.jp/pub/cygwin//setup.bz2
ftp.jaist.ac.jp をDNSに問いあわせています... 150.65.7.130, 2001:df0:2ed:feed::feed
ftp.jaist.ac.jp|150.65.7.130|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 404 Not Found
2013-12-02 15:58:16 エラー 404: Not Found。

--2013-12-02 15:58:16--  http://ftp.jaist.ac.jp/pub/cygwin//setup.ini
ftp.jaist.ac.jp をDNSに問いあわせています... 150.65.7.130, 2001:df0:2ed:feed::feed
ftp.jaist.ac.jp|150.65.7.130|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 404 Not Found
2013-12-02 15:58:16 エラー 404: Not Found。

Error updating setup.ini, reverting
$ LANG=C apt-cyg update
Working directory is /cygdrive/c/Users/kou/Downloads/cygwin
Mirror is http://ftp.jaist.ac.jp/pub/cygwin/
--2013-12-02 15:59:58--  http://ftp.jaist.ac.jp/pub/cygwin//setup.bz2
Resolving ftp.jaist.ac.jp... 150.65.7.130, 2001:df0:2ed:feed::feed
Connecting to ftp.jaist.ac.jp|150.65.7.130|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2013-12-02 15:59:58 ERROR 404: Not Found.

--2013-12-02 15:59:58--  http://ftp.jaist.ac.jp/pub/cygwin//setup.ini
Resolving ftp.jaist.ac.jp... 150.65.7.130, 2001:df0:2ed:feed::feed
Connecting to ftp.jaist.ac.jp|150.65.7.130|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2013-12-02 15:59:58 ERROR 404: Not Found.

Error updating setup.ini, reverting
これは、前述の通り cygwin 1.7.22 対応のパッチが当たった版を利用すれば解決する。
Cygwin 1.7.25 では、cygcheck -c で check-setup する際、/etc/setup/installed.db に記録されているアーカイブの末尾が .tar.gz または .tar.bz2 に決め打ちされている。
このためかどうかは分からないが、cygwin 1.7.25 では、setup-x86.exe, setup-x86_64.exe で .tar.xz 形式のパッケージをインストールした場合でも /etc/setup/installed.db には .tar.bz2 と記録される。
apt-cyg では正しく .tar.xz として記録するので、cygcheck -c で check-setup する際に、インストール済みのパッケージとして認識してもらえない。
この問題は、src/winsup/utils/dump_setup.cc#rev1.28 で修正されているので、次期バージョンの cygwin 1.7.26 では解消さるはずである。
と言うことで、cygwin 本体側のバグであるため、cygwin の更新を待つことにする。
2013-12-19:
上記の問題は、2013-11-29 にリリースされた cygwin 1.7.26 で解消した。
2014-01-14 現在、以下のようにすると、検証に失敗する。
原因は setup.bz2 が更新されているのに setup.bz2.sig が更新されていないせい。
setup.ini.sig で setup.ini を検証すると問題ない模様。
関連:
Windows8 上の cygwin64 にインストール ca-certificates パッケージを導入すると、postinstall に失敗するらしく、SSL 認証が出来ない状態に陥る。
原因は裏で呼ばれてる /usr/bin/p11-kit が seg る事なんだが、少なくとも Windows 7 Ultimate 上の cygwin64 だと再現しない。
Windows8 と p11-kit の相性が悪いのか???
とりあえず、cygwin32 も入れてるなら、そちらから pkey をコピーしておくことで場当たり的な対応は可能。 Cygwin 本家にも投げてみたが、伝わるのか?これ?

大まかなサブコマンドの対応

apt-cygcygcheckapt-getapt-cacheapt-filedpkg
installinstall
removeremove
updateupdate
show-c-l
findsearch
describeshow
packageof-S
upgrade
-l-L
-psearch,find
list,show

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます