Cygwinの環境を複数作ったり、パッケージのインストールを自動化したりする

<div align="center">
  <a href="http://bit.ly/cyginst"><img width="426" height="67" src="https://raw.githubusercontent.com/javacommons/qiita/master/jc-banner-2017-0419-0240.gif" /></a>
</div>

<hr />

# ご注意：この記事のスクリプトは「古い(最新版ではない)」です！

改善されたバージョンのスクリプトは、こちらの記事から参照(取得)できます⇒ http://qiita.com/javacommons/items/1a182f187fd2a8df29c2
この記事で紹介してある手順よりも手数も減りますし「改善されたバージョン」の方お勧めしますが、動作に問題はないのでこの記事のやり方で作業したい方は止めはしません。

<table height="400" width="600"><tr><td>
😲<b>セーラームーン / ムーンライト伝説 (ユーロビート)ver.</b>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">セーラームーン / ムーンライト伝説 (ユーロビート)ver.<a href="https://t.co/o91qCKNtAW">https://t.co/o91qCKNtAW</a></p>&mdash; JavaCommons (@javacommons) <a href="https://twitter.com/javacommons/status/849831235933224960">2017年4月6日</a></blockquote>
</td></tr></table>

> * **追記：(本文中のスクリーンショットでは用いてますが)インストールするフォルダのパスに「#」を用いない方が良いみたいです。**

# はじめに

1台のPC上に、インストールするパッケージの違うCygwinの環境を複数作ったり、32bit版と64bit版の環境を混在させたり、複数のマシンで同じパッケージのCygwin環境をセットアップしたり・・・という時に役立つテクニックをご紹介します。
Cygwinのセットアッププログラム(「setup-x86.exe」または「setup-x86_64.exe」)のコマンドライン引数を使うやり方で、あまり知られていない(なじみがない)テクニックですが、(初期)パッケージ管理のためのベストプラクティスとも言えるでしょう。

* 追記：すでにCygwinを通常の方法でインストールしている場合に、この記事で紹介する方法でCygwinをインストールしても既存のCygwin環境に影響を与えません。また、この記事で紹介する方法でインストールした環境が要らなくなったらフォルダ(下の例での「cygwin-01」とか「cygwin-02」)を個別に消す(削除する)だけでOKです。
* 追記「5. インストールスクリプトの編集と再実行」を修正しました。「cygwin-01」(とか「cygwin-02」)を消さないでインストールスクリプトを(上書きで)実行しても大丈夫なことを確認しました。パッケージ名(指定)をどんどん追加しながら繰り返し再実行して構いません。必要なパッケージ名の一覧が完成したら、不要な(パッケージ名の一覧から除外した)パッケージを削除するために「cygwin-01」(とか「cygwin-02」)を削除しておいてからインストールスクリプトをもう一度実行します。

# 1. Cygwinのセットアッププログラムをダウンロードする。

https://www.cygwin.com/ にアクセスし、Cygwinのセットアッププログラムをダウンロードします。
今回は、32bit版と64bit版を同じPCにインストールしてみます。
「setup-x86.exe」と「setup-x86_64.exe」の両方をダウンロードします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/62c2c35a-9f6d-64c4-8d62-5c13e620223a.png)

# 2. Cygwinインストールフォルダとセットアップスクリプトを準備する

任意のドライブ配下にCygwinインストール用フォルダを作ります。

* ただし、Cドライブの直下は問題があるので避けてください(Dドライブ、Eドライブ…の直下はOK。Cドライブ配下でも「C:\cyginst」とかはOKです。)。
* **フォルダのパスに空白や日本語を含めないでください。**
* **追記：(以下のスクリーンショットでは用いてますが)フォルダのパスに「#」を用いない方が良いみたいです。**
* そこに、先ほどダウンロードした「setup-x86.exe」と「setup-x86_64.exe」をコピーします。
* 次に、「cygwin-01.bat」(32bit版用)と「cygwin-02.bat」(64bit版用)というテキストファイルを作って、それぞれに以下のスクリプトを張り付けて保存します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/d2b97198-d6b6-d8c2-cfb6-7e28f3f0b9fe.png)

```bat:cygwin-01.bat(32bit版)
setlocal
set SCRIPT=%~0
for /f "delims=\ tokens=*" %%z in ("%SCRIPT%") do (
  set SCRIPT_CURRENT_DIR=%%~dpz
)

set CYG_NAME=cygwin-01
set CYG_ROOT=%SCRIPT_CURRENT_DIR%%CYG_NAME%
set CYG_PKG=%CYG_ROOT%\pkg
set CYG_SITE=http://mirrors.kernel.org/sourceware/cygwin/

mkdir %CYG_PKG%
setup-x86.exe -q -W --packages="bash,binutils,make" --root=%CYG_ROOT% --local-package-dir=%CYG_PKG% --no-shortcuts --site=%CYG_SITE%

endlocal
pause
```

```bat:cygwin-02.bat(64bit版)
setlocal
set SCRIPT=%~0
for /f "delims=\ tokens=*" %%z in ("%SCRIPT%") do (
  set SCRIPT_CURRENT_DIR=%%~dpz
)

set CYG_NAME=cygwin-02
set CYG_ROOT=%SCRIPT_CURRENT_DIR%%CYG_NAME%
set CYG_PKG=%CYG_ROOT%\pkg
set CYG_SITE=http://mirrors.kernel.org/sourceware/cygwin/

mkdir %CYG_PKG%
setup-x86_64.exe -q -W --packages="bash,binutils,make" --root=%CYG_ROOT% --local-package-dir=%CYG_PKG% --no-shortcuts --site=%CYG_SITE%

endlocal
pause
```

# 3. インストールスクリプトを実行する

スクリプトを保存した「cygwin-01.bat」と「cygwin-02.bat」を順番に実行します。
「cygwin-01.bat」または「cygwin-02.bat」をエクスプローラからダブルクリックすると以下のようなインストーラーの画面が表示されます。

* スクリプト内で指定(指定のし方は後述)されたパッケージが(依存するパッケージを含めて)インストールされます。
* デスクトップやスタートメニュー等にCygwinのショートカットは作成されないようにしています(複数インストールすると衝突するので)。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/bb29486f-642a-63d3-9298-804453c9997a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/e079e170-446a-8f52-b8f4-b3975753900d.png)

# 4. Cygwin.batのショートカットを作成する

「cygwin-01.bat」と「cygwin-02.bat」の実行が終わったら以下のように「cygwin-01」と「cygwin-02」というフォルダができているはずです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/ac7e22c1-69d9-e22c-c0c7-1a15e7d04f8e.png)

インストールされた「cygwin-01」フォルダと「cygwin-02」フォルダを、順番に開いて「Cygwin.bat」へのショートカットをデスクトップ上などに作成しておくと便利でしょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/40da9c01-c2d0-5fe6-9354-c95b33c4ba22.png)

# 5. インストールスクリプトの編集と再実行

「cygwin-01.bat」をテキストエディタで開いて「--packages="bash,binutils,make"」という風になっている部分を修正しましょう。
例えば、「--packages="bash,binutils,make,perl,emacs"」のように変更して「cygwin-01.bat」を再実行するとPerlとEmacsが追加でインストールされます。

* パッケージを増やして「cygwin-01.bat」を再実行する場合には「cygwin-01」フォルダーを残したまま(上書きで)実行してください。既にインストール済みのパッケージについてはダウンロードもインストール処理もされず、追加で指定したパッケージのみがダウンロードおよびインストールされます。再インストール後、Cygwin.batを起動して確認・テストをしてください。
* 必要と思われるパッケージを全てインストールし終わったら、一旦「cygwin-01」フォルダーを消して「cygwin-01.bat」を再実行します。「--packages="～"」からパッケージ名(指定)を消して再実行してもパッケージは削除されないので、完全にフォルダを消してから実行することによって不要なパッケージを一掃します。(もしパッケージ名を追加するだけで、追加したパッケージ名を一度も削除することがなければ、この手順は不要です。ただ、(何かの間違いがあってもいけないので) 最終的にできたスクリプトを何もない状態から実行した上で使っておく方がスクリプトの正しさの確認になって良いと思います)

# 6. 自分でインストールスクリプトを作成する際の変更点

* 「set CYG_NAME=cygwin-01」という行の「cygwin-01」を任意の名前にします。この名前でフォルダーができるので英数字およびハイフン、アンダースコア、ピリオド等の文字で名前を構成しましょう。
* 「--packages="bash,binutils,make"」となっている個所の「"bash,binutils,make"」の部分を変更します。カンマ区切りでCygwinのパッケージの名前を列挙します。ちなみに「bash」は指定しなくてもインストールされるみたいです。(パッケージ名は、「setup-x86.exe」または「setup-x86_64.exe」を手動で起動するなどして調べてください。~~Cygwinのパッケージ名を一覧できるサイトとかないですかね?~~ ここでパッケージ名を調べられますね⇒ https://cygwin.com/packages/package_list.html)
* 「setup-x86.exe」または「setup-x86_64.exe」の部分を32bit版・64bit版のどちらをインストールするのかによって変更します。(32bit版の場合は「cygwin-01.bat」、64bit版の場合は「cygwin-02.bat」を元に作成するのも良いかもしれません)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/a7785f7c-18a8-a26d-b764-b8c5a44ea734.png)

# 7. 最後に

なんか、ものすごい面倒くさい(または、回りくどい)ことをしているようですが、この手順でインストールしておくと：

* 「setup-x86.exe」と「setup-x86_64.exe」と自分で作ったインストールスクリプトを持ち歩く(またはGoogleドライブやDropboxに入れておく)だけで、同じ環境がどこでも作れます。(スクリプトをダブルクリックして待つだけ。パッケージの入れ忘れとかもなし！)
* 複数の、そして32bit版と64bit版の混在した開発環境を構築できます。
* インストールスクリプト(バッチファイル)を見るだけで、どのパッケージがインストールされているかすぐに分かります。

# 参考(スクリーンショットについて)

* この記事のスクリーンショットは「[Screenpresso](https://goo.gl/66wA5x)」というソフトを使って撮りました。(参考記事 ⇒ [機能はSkitch超え！画像に美しい注釈を加えられる「Screenpresso」がスゴい](https://goo.gl/66wA5x)) [※](https://goo.gl/#analytics/goo.gl/66wA5x/all_time)
* また、この記事を書く際には、スクリーンショットを画像ファイルに保存することなくクリップボードからQiitaに画像を直接(魔法で！)アップロードしました。(参考記事 ⇒ [http://qiita.com/javacommons/items/344c752ccd46f485126c](https://goo.gl/li0DFh)) [※](https://goo.gl/#analytics/goo.gl/li0DFh/all_time)

```
    2017/03/23 227views
    2017/03/19 181views
    2017/03/17 128views
```