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

Windows 用の UNIX ユーザーランド。

ライセンス

GPL.

2016-06-27:
cygwin1.dll が LGPL3 に変更されたらしい。
Cygwin が遅いことや、ソースコード互換性等を理由に
VirtualBox や VMWare で Linux や *BSD 動かしたほうがマシって意見を散見するんだけど
そういう人はそもそも cygwin を必要としていたのかどうかが疑わしい。

Cygwin の存在意義は Windows とシームレスに連携可能な POSIX 環境って点に尽きる。
具体的には以下のような点。
  • Change directory した状態で terminal を開くことが可能。
  • Win32 api を叩くことが可能。延いては OLE/COM を叩くことが可能。
  • レジストリを叩くことが可能。

逆に言えばこれらを必要としないなら無理して cygwin を使う意義はない。
速度や互換性と上記のメリットを天秤にかけてどちらを選ぶかという選択である。
もちろん無理しない範囲であれば cygwin を使う意義は大いにある。
少なくとも C 言語で hello world するとかその程度の段階であれば問題が生じる余地すらないだろう。


次に、サイズ及びインストールにかかる時間をやり玉に挙げる人がいるが、これも根本的に的外れである。
現在 Cygwin が提供しているパッケージがどれほどあるか調べた結果は以下の通りである。
$ apt-cyg update; date "+%F %T"
Cache directory is ***********************************************
Mirror is http://ftp.jaist.ac.jp/pub/cygwin
Updating setup.ini
signature verified: setup.bz2.sig
signature verified: setup.ini.sig
Updated setup.ini
2016-02-05 21:29:58

$ # number of packages
$ apt-cyg packages-total-count
7599

$ # size of archives
$ apt-cyg packages-total-size
14025501274
以上より 2016-02-05 21:29:58 現在、
http://ftp.jaist.ac.jp/pub/cygwin にミラーされているアーカイブのうち
prev や test 扱いされていない標準的なパッケージは
7,599 パッケージ、14,025,501,274B ≒ 13.1GiB に達していることが分かる。
これは小規模な Linux ディストリビューションに匹敵しており、
仮にフルインストールでもしようものなら終わるわけがないのである。

一方で、拙作の cygwin_autoinstall.bat を用いて私家版 apt-cyg を利用可能な最小構成でインストールした直後の状況は以下のようになる。
$ # files except tar file under the mirror dir
$ { cd "$(apt-cyg pathof cache/mirrordir)"; find . -type f; } | grep -v tar
./x86_64/setup.bz2
./x86_64/setup.bz2.sig
./x86_64/setup.ini
./x86_64/setup.ini.sig

$ # number of archives which was installed
$ apt-cyg packages-cached-count
107

$ # size of archives which was installed
$ apt-cyg packages-cached-size
53768498

$ # size of minimum cygwin environment that is required by apt-cyg of my own version
$ du -sb /cygdrive/c/cygwin64
270639925       /cygdrive/c/cygwin64
ご覧のようにインストールされたアーカイブは 107 パッケージ、53,768,498B ≒ 51.3MiB に過ぎず、
インストール後のサイズもたかだか 270,639,925B ≒ 258.1MiB に過ぎない。
そこそこ高速なブロードバンド環境と SSD がありさえすれば 3 分とはかからない大きさである。

さて、一般的な Linux ディストリビューションを盲目的にフルインストールして、
あまつさえその大きさに文句を言う人がどれだけいるだろうか?
普通はそんな人はいないし、仮にいたとしても情弱認定されるのが関の山だろう。
フルインストールとか酔狂な真似をしておいて、サイズに文句を言っている人は、
そもそもフルインストールが必要のない人なのである。
別の言い方をすれば、使い方を根本から間違っているのであり、
大き過ぎるというのは批判としては極めて的外れと言える。

ひょっとすると cygwin のサイズに文句を言っている人は
Windows で POSIX 環境を使うための簡易ツール的な認識なのかもしれない。
しかし cygwin を見くびってはいけない。
現実は上記の通り、
パッケージの充実度は小規模な Linux ディストリビューションに比肩している。
つまり批判の対象になっている馬鹿でかいサイズは、馬鹿でかければ馬鹿でかいほど、
それは逆にパッケージの充実度と言う意味で褒られて然るべき点なのである。

Linux を使う場合、必要最小限度の環境をインストールした後、
必要に応じてパッケージを追加して行くのがセオリーであるのと同じように、
Cygwin もインストール時は必要最小限の環境に留め、
必要に応じてパッケージを追加して行くのが正しい使い方と言えるだろう。


まとめると以下の2点になる。
  • Windows との親和性よりも速度と互換性を重視するなら仮想環境へ。
  • フルインストールは時間がかかって当り前。インストールは最小構成に。

ports

説明には
pkgsrc is a framework for building third-party software on NetBSD and other UNIX-like systems, currently containing over 14000 packages.
とあってパッケージ数がちょっとヤバイ
supported platforms にはしっかりと cygwin が挙がっているんだけどひょっとしてこれで幸せになれるの?

ネタ元:

不具合

version 2 にメジャーバージョンが挙がってからじゃないかと思うんだけど、
ネットワークドライブ上のスクリプトに chmod +x しておいても permission denied と言われて実行出来なくなった orz
ネットワークドライブ上でシンボリックリンクも出来なったし、なぜどんどん改悪されるんだ、、、(- -)

ざっと検索してみたが、あまり参考になるポストがなかった、、、

この辺は関係あるのかな???
追記: 2015-06-11
apt-cyg dist-upgrade してみたら改善した。
どうも一時的な不具合だった模様。良かった。
ネタ元:



Cygwin の kill だと exit code が 0 以外になるが、Windows の taskkill だと 0 になるという話。
因みに通常は、0〜127 がアプリケーションの終了コード、128 は未使用、128 + n はシグナル n を受け取って終了した場合のデフォルトの終了コードとなる模様。

参考:

Tips

私家版 apt-cyg には既に実装していたのだが、
Cygwin のインストールで死にそうに時間がかかるという声を耳にするので、
インストール前でも最適なミラーを決定できるようにバッチファイルを書いてみた。

以下の oneliner で実行出来る。
powershell -Command "Import-Module BitsTransfer; Start-BitsTransfer https://gist.githubusercontent.com/kou1okada/9581971e32cadc6306fc/raw/benchmark_cygwin_mirrors.bat" && benchmark_cygwin_mirrors.bat

win32 と cygwin のパスの優先順位を変える

toggle file path

~/.bashrc 辺りに追加しとくと吉

最後に使った setup.ini のパスを得る

cygcheck -sv | grep "^Last downloaded files" | sed -e "s/^[^:]*: //g" | awk '{gsub("tp:","tp%3a");gsub("/", "%2f");printf("%s\\", $0);}END{printf("setup.ini");}'
以下に解説がある。
setup.ini 作成に必用な upset package の入手先として示されている http://xarch.tu-graz.ac.at/publ/cygwin/ は 2008-10-24 現在 not responsed.
移転先は http://rurban.xarch.at/software/cygwin/ かな?
Google code に以下のプロジェクトとして登録されている。
以下も参考になるだろう
upset をインストールするためだけに上記のリポジトリを追加するのが面倒なら以下のようなスクリプトで簡易的に代替しても良いだろう。

upset.sh

もうちょっとマシなの作ってみた。

追記: 2015-06-03
cygport というパッケージがあってこれを使うと、cygwin 用の package をサックリ作れる模様。
setup.exe は GUI なので、いちいちパッケージを探して回るのが面倒臭い。
apt-get とか yum のようにコマンドラインから CUI でパッケージを自動インストールしたい場合
setup.exe に -q -P オプションを与えれば良い。
例えば、aria2 と curl パッケージをインストールしたい場合、以下の様にすれば良い。
setup.exe -q -P aria2,curl
オプションの意味は以下。
  • -q 対話処理をせず実行
  • -P インストールするパッケージの指定。与えるパッケージ名はコンマで連ねる。

ただし、Vista 以降では UAC が介入してくるので、以下のような制約が出る模様。
  • UAC のダイアログが操作出来ないので、リモートからは出来ないかも。
  • UAC の関係か Cygwin からは(実行ビット立ててても) Permission denied が出て実行出来ない。

Cygwin の公式ツールではないが、以下のようなツールもある。 これは bash で実装されており、Vista 以降でも UAC の介入を受けることなく利用出来る。
ただし、2011-10-26 現在、インストールされたファイルの GID が root ではなく None になるようなので、ひょっとすると何か不具合が出るかも?

参考:
2011-11-14 現在、Cygwin は 32bit アプリなので、64bit版 Windwos では System32 へのアクセスが SysWOW64 へリダイレクトされてしまう模様。
結果、64bit版 System32 へのアクセス手段がない状況。

参考:

64 bit 版

2013-07-22 リリースの Cygwin 1.7.22 から 64 bit 版が正式リリースされた模様。 これに伴い 2013-08-24 現在、apt-cyg動作出来なくなっており、対応待ちの状態だったが、実は 2013-07-28 の時点で fork 用に github / transcode-open / apt-cyg が既に用意されてた模様。
要 Vista 以降らしいんだけど、以下のように環境変数 CYGWIN に winsymlinks って追加しておくと ln -s で Windows native の symbolic link を張ってくれるらしい。
export CYGWIN="winsymlinks $CYGWIN"
やってみたらローカルでは上手く行くんだけど SMB 上だとショートカットになっちゃう。
まぁ cygwin 的 symbolic link も SMB 上だとファイル属性が上手く設定出来ないため、ただのファイルになっちゃうのでどっちがマシかって話ではある。
これって、昔の cygwin みたいにショートカットをシンボリックリンク扱いしてくれた方が幸せなんじゃないのか???

参考:
/dev/clipboard で読み書き出来る模様。

参考:
ネタ元:

備考

2019-08-23: 追記
上のライセンスの所でも書いているが、ソースコードの winsup 以下、つまり cygwin1.dll のライセンスは、2016-03-24 のコミットにより Cygwin version 2.5.2 以降は GPLv2+ から GPLv3+ に変更されたため、以前はあった非GPLプロダクトとのリンクの問題はなくなっている。
非 GPL のプロジェクトに利用する場合には注意が必要。
まず cygwin1.dll が GPL である。この DLL をリンクから外す必要がある。
これは -mno-cygwin オプションで行う。

C++ を使う場合は標準ライブラリのライセンスにも注意しなくてはならない。
Cygwin に付属しているC++の標準ライブラリには GPL の記述がある。
# locate iostream 等して見つかったファイルを調べて見ると良い。
従って、別途、非 GPL の標準ライブラリがを用意する必要がある。
STLport は iostream まで含むので、これを標準ライブラリといて利用すると良いかもしれない。
例外条項の記述があった、、、orz
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.

ターミナル

タグ

コメントをかく


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

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

Wiki内検索

フリーエリア

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