List of Gcc - text.Baldanders.info
tag:text.Baldanders.info,2018-03-31:/tags
2018-03-31T21:12:23+09:00
帰ってきた「しっぽのさきっちょ」
https://text.baldanders.info/images/avatar.jpg
https://text.baldanders.info/images/avatar.jpg
Go 言語で SQLite を使う(Windows 向けの紹介)
tag:text.Baldanders.info,2018-03-31:/golang/sqlite-with-golang-in-windows/
2018-03-31T12:12:23+00:00
2020-03-06T11:35:54+00:00
今回はパッケージの紹介のみ。つか,Windows で cgo を使うための覚え書きのようなものか。
Spiegel
https://baldanders.info/profile/
<p>今回はパッケージの紹介のみ。
つか, Windows で cgo を使うための覚え書きのようなものか。</p>
<p><a href="https://www.sqlite.org/">SQLite</a> はアプリケーションに組み込み可能な簡易 RDBMS で,公有(public domain)のソフトウェアとして公開されている。
C 言語で書かれているため多くのプラットフォームまたは(C 言語とバインド可能な)多くのプログラミング言語で利用可能である。
コア部分のコードが(他の製品に比べて)小さいため組込みソフトウェアで使われることもある。</p>
<h2>mattn/go-sqlite3</h2>
<p><a href="https://golang.org/" title="The Go Programming Language">Go 言語</a>で利用可能な <a href="https://www.sqlite.org/">SQLite</a> パッケージはいくつか存在するが,標準の database/<a href="https://golang.org/pkg/database/sql/" title="sql - The Go Programming Language">sql</a> に対応しているのは <a href="https://github.com/mattn/go-sqlite3" title="mattn/go-sqlite3: sqlite3 driver for go using database/sql">mattn/go-sqlite3</a> のみのようだ。</p>
<ul>
<li><a href="https://github.com/mattn/go-sqlite3">mattn/go-sqlite3: sqlite3 driver for go using database/sql</a></li>
</ul>
<p>このパッケージを利用するには <a href="https://gcc.gnu.org/" title="GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF)">GCC</a> が必要である(内部で C 言語コードのコンパイルを行うため)。
<a href="https://gcc.gnu.org/" title="GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF)">GCC</a> がない状態で <code>go get</code> しようとすると以下のようにエラーになる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go get -v github.com/mattn/go-sqlite3
</span></span><span class="line"><span class="cl">github.com/mattn/go-sqlite3
</span></span><span class="line"><span class="cl"># github.com/mattn/go-sqlite3
</span></span><span class="line"><span class="cl">exec: "gcc": executable file not found in %PATH%
</span></span></code></pre></div><p>なお,必要なコードは <a href="https://github.com/mattn/go-sqlite3" title="mattn/go-sqlite3: sqlite3 driver for go using database/sql">mattn/go-sqlite3</a> に組み込まれているため <a href="https://www.sqlite.org/">SQLite</a> サイトからソースコードや DLL などのバイナリを別途取ってくる必要はない<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</p>
<h3>GCC の導入</h3>
<p>Linux などのプラットフォームには最初から <a href="https://gcc.gnu.org/" title="GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF)">GCC</a> が入っているが, Windows 環境には残念ながら入ってないので別途用意する必要がある<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>。
Windows 環境で <a href="https://gcc.gnu.org/" title="GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF)">GCC</a> <strong>のみ</strong> が必要なのであれば <a href="http://mingw-w64.org/" title="Mingw-w64 - GCC for Windows 64 & 32 bits [mingw-w64]">MinGW-w64</a> から Windows 用のバイナリを取得するのがお勧めである<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>。</p>
<ul>
<li><a href="https://text.baldanders.info/remark/2018/03/mingw-w64/">Mingw-w64 を導入する</a></li>
</ul>
<h2>サンプルをコンパイルしてみる</h2>
<p><a href="https://github.com/mattn/go-sqlite3" title="mattn/go-sqlite3: sqlite3 driver for go using database/sql">mattn/go-sqlite3</a> に <code>_example/simple/simple.go</code> というサンプルファイルがあるので,これを動かして動作確認してみる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go run simple.go
</span></span></code></pre></div><p>これで <code>foo.db</code> ファイルができていたら成功だ。
適当なブラウザツールで中身を確認してみるといいだろう。</p>
<p>あぁ <a href="https://www.sqlite.org/">SQLite</a> 用の SQL 方言を覚えないと。
なんで製品ごとに SQL の方言がこんなに微妙な感じなんだろうねぇ。
特定の製品にロックインさせるための陰謀なのだろうか(笑)</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="http://sqlitebrowser.org/">DB Browser for SQLite</a>
<ul>
<li><a href="https://forest.watch.impress.co.jp/library/software/sqldbbrowser/">「DB Browser for SQLite」“SQLite”のデータベースを管理できるソフト - 窓の杜ライブラリ</a></li>
</ul>
</li>
<li><a href="https://siguniang.wordpress.com/2012/11/10/notes-on-sqlite-vacuum/">SQLiteのVACUUMメモ | Siguniang’s Blog</a> : pragma を使って自動で vacuum できるらしい</li>
</ul>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://github.com/mattn/go-sqlite3" title="mattn/go-sqlite3: sqlite3 driver for go using database/sql">mattn/go-sqlite3</a> に組み込まれている <a href="https://www.sqlite.org/">SQLite</a> のバージョンは 2018-03-31 時点で 3.22.0 のようだ。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p>Windows 10 用の Linux 系サブシステムになら入ってると思うが,私は Windows 10 を使ったことがないのでよく知らない。 <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3">
<p><a href="https://gcc.gnu.org/" title="GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF)">GCC</a> だけでなく autotools などの周辺ツールも必要なら <a href="http://www.msys2.org/">MSYS2</a> を導入するほうがいいかもしれない(参考: <a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-2/">MSYS2 による gcc 開発環境の構築 ― gcc パッケージ群の導入</a>)。今回は <a href="http://mingw-w64.org/" title="Mingw-w64 - GCC for Windows 64 & 32 bits [mingw-w64]">MinGW-w64</a> で全く問題ない。 <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
MinGW-w64 を導入する
tag:text.Baldanders.info,2018-03-31:/remark/2018/03/mingw-w64/
2018-03-31T08:40:56+00:00
2021-10-02T00:47:40+00:00
MinGW-w64 は Windows 用のバイナリを出力可能な GCC を含む開発環境を提供している。もちろん Windows 用のバイナリも存在する。
Spiegel
https://baldanders.info/profile/
<p><a href="http://mingw-w64.org/" title="Mingw-w64 - GCC for Windows 64 & 32 bits [mingw-w64]">MinGW-w64</a> は <a href="http://www.mingw.org/">MinGW (Minimalist GNU for Windows)</a> の後継とも言えるプロジェクトで Windows 用のバイナリを出力可能な <a href="https://gcc.gnu.org/" title="GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF)">GCC</a> を含む開発環境を提供している。
<a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> も <a href="http://mingw-w64.org/" title="Mingw-w64 - GCC for Windows 64 & 32 bits [mingw-w64]">MinGW-w64</a> の成果を取り込んでいるので馴染みのある人もいるだろう<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</p>
<p><a href="http://www.mingw.org/" title="MinGW | Minimalist GNU for Windows">MinGW</a> および <a href="http://mingw-w64.org/" title="Mingw-w64 - GCC for Windows 64 & 32 bits [mingw-w64]">MinGW-w64</a> はどちらかと言うと Linux 系のプラットフォームで Windows 向けのビルドを行うクロスコンパイラとしての側面が強いが,もちろん Windows 用のバイナリも存在する。
<a href="http://mingw-w64.org/" title="Mingw-w64 - GCC for Windows 64 & 32 bits [mingw-w64]">MinGW-w64</a> の Windows 用インストーラは以下で取得できる<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>。</p>
<ul>
<li><a href="https://www.mingw-w64.org/downloads/#mingw-builds">Downloads - Mingw-w64</a></li>
</ul>
<p>インストーラを起動すると以下のウィザード画面になる。</p>
<figure style='margin:0 auto;text-align:center;'><a href="./mingw-w64-install-1.png"><img src="./mingw-w64-install-1.png" srcset="./mingw-w64-install-1.png 527w" sizes="(min-width:600px) 500px, 80vw" alt="Installing Mingw-w64 (1)" loading="lazy"></a><figcaption><div><a href="./mingw-w64-install-1.png">Installing Mingw-w64 (1)</a></div></figcaption>
</figure>
<p>このまま <code>[Next >]</code>。</p>
<figure style='margin:0 auto;text-align:center;'><a href="./mingw-w64-install-2.png"><img src="./mingw-w64-install-2.png" srcset="./mingw-w64-install-2.png 527w" sizes="(min-width:600px) 500px, 80vw" alt="Installing Mingw-w64 (2)" loading="lazy"></a><figcaption><div><a href="./mingw-w64-install-2.png">Installing Mingw-w64 (2)</a></div></figcaption>
</figure>
<p>この画面でインストールする <a href="https://gcc.gnu.org/" title="GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF)">GCC</a> の種別を指定する。</p>
<ul>
<li><em>Version</em> : <a href="https://gcc.gnu.org/" title="GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF)">GCC</a> のバージョン。特に理由がない限り最新版でいいだろう(2021-10-01 時点の最新は 8.1.0)</li>
<li><em>Architecture</em> : ターゲットシステムのアーキテクチャ。 <code>i686</code> か <code>x86_64</code> のいずれかを選択する。 <code>x86_64</code> が64ビット版なのでご注意を</li>
<li><em>Thread</em> : スレッドモデル。 <code>posix</code> か <code>win32</code> のいずれかを選択する。 <code>win32</code> は Windows ネイティブ関数を使っていて速いのだが C++ 11 以降の thread, mutex, future が使えなくなる。特に理由がないのであれば <code>posix</code> でいいだろう</li>
<li><em>Exception</em> : 例外処理ハンドリング。アーキテクチャによって以下を選択できる。
<ul>
<li><code>i686</code>
<ul>
<li><code>dwarf</code> : <a href="http://ja.wikipedia.org/wiki/DWARF">DWARF</a></li>
<li><code>sjlj</code> : SetJump/LongJump</li>
</ul>
</li>
<li><code>x86_64</code>
<ul>
<li><code>seh</code> : Structured Exception Handling (Windows ネイティブ。おすすめ)</li>
<li><code>sjlj</code> : SetJump/LongJump</li>
</ul>
</li>
</ul>
</li>
<li><em>Build Version</em> : ビルドバージョン。特に理由がなければ最新版でいいだろう</li>
</ul>
<p>種別を指定したら <code>[Next >]</code>。</p>
<figure style='margin:0 auto;text-align:center;'><a href="./mingw-w64-install-4.png"><img src="./mingw-w64-install-4.png" srcset="./mingw-w64-install-4.png 527w" sizes="(min-width:600px) 500px, 80vw" alt="Installing Mingw-w64 (3)" loading="lazy"></a><figcaption><div><a href="./mingw-w64-install-4.png">Installing Mingw-w64 (3)</a></div></figcaption>
</figure>
<p>インストール先のフォルダを指定する。
既定のままではめっさ長い名前になるので変更したほうがいいかも?</p>
<p><code>[Next >]</code> でインストールを開始する。</p>
<figure style='margin:0 auto;text-align:center;'><a href="./mingw-w64-install-6.png"><img src="./mingw-w64-install-6.png" srcset="./mingw-w64-install-6.png 527w" sizes="(min-width:600px) 500px, 80vw" alt="Installing Mingw-w64 (4)" loading="lazy"></a><figcaption><div><a href="./mingw-w64-install-6.png">Installing Mingw-w64 (4)</a></div></figcaption>
</figure>
<p>どうもネットから指定した種別に対応する圧縮ファイルをダウンロードしてバイナリを展開しているようだ。
完了したら <code>[Next >]</code>。</p>
<figure style='margin:0 auto;text-align:center;'><a href="./mingw-w64-install-7.png"><img src="./mingw-w64-install-7.png" srcset="./mingw-w64-install-7.png 527w" sizes="(min-width:600px) 500px, 80vw" alt="Installing Mingw-w64 (5)" loading="lazy"></a><figcaption><div><a href="./mingw-w64-install-7.png">Installing Mingw-w64 (5)</a></div></figcaption>
</figure>
<p>これで完了。
お疲れ様でした。</p>
<p>試しに gcc を起動してみる。
こんな感じ。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ gcc -v
</span></span><span class="line"><span class="cl">Using built-in specs.
</span></span><span class="line"><span class="cl">COLLECT_GCC=gcc
</span></span><span class="line"><span class="cl">COLLECT_LTO_WRAPPER=C:/Program\ Files/mingw-w64/latest/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe
</span></span><span class="line"><span class="cl">Target: x86_64-w64-mingw32
</span></span><span class="line"><span class="cl">Configured with: ../../../src/gcc-8.1.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-seh-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/lib -L/c/mingw810/prerequisites/x86_64-zlib-static/lib -L/c/mingw810/prerequisites/x86_64-w64-mingw32-static/lib '
</span></span><span class="line"><span class="cl">Thread model: posix
</span></span><span class="line"><span class="cl">gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
</span></span></code></pre></div><p>インストーラ自体は環境変数を変更しないのだがインストールしたフォルダに <code>mingw-w64.bat</code> というのができていて,これを起動すると PATH を追加してコマンドプロンプトを起動する。
常用するのであれば自前で環境変数を変更すればよい。</p>
<p>削除する際はコントロールパネルの「プログラムと機能」から可能だがメチャメチャ分かりにくい名前になっている。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://photo.baldanders.info/flickr/40235231465/"><img src="https://photo.baldanders.info/flickr/image/40235231465_m.png" srcset="https://photo.baldanders.info/flickr/image/40235231465_m.png 500w" sizes="(min-width:600px) 500px, 80vw" alt="Uninstalling Mingw-w64" loading="lazy"></a><figcaption><div><a href="https://photo.baldanders.info/flickr/40235231465/">Uninstalling Mingw-w64</a></div></figcaption>
</figure>
<p>「プログラムと機能」の右上に検索窓があるのでそこで「mingw」と入力すれば上の画面のようになるので,これで該当プログラムを選択して削除すればいいだろう。</p>
<h2>みんな大好き Hello World</h2>
<p>では動作確認。
以下のコードを用意する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">"stdio.h"</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nf">printf</span><span class="p">(</span><span class="s">"hello world</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>これをコンパイルして実行する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ gcc hello.c
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ a.exe
</span></span><span class="line"><span class="cl">hello world
</span></span></code></pre></div><p>よーし,うむうむ,よーし。</p>
<h2>参考図書</h2>
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/4320026926?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/41W69WGATNL._SL160_.jpg" width="112" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/4320026926?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">プログラミング言語C 第2版 ANSI規格準拠</a></dt>
<dd>B.W. カーニハン (著), D.M. リッチー (著), 石田 晴久 (翻訳)</dd>
<dd>共立出版 1989-06-15</dd>
<dd>単行本</dd>
<dd>4320026926 (ASIN), 9784320026926 (EAN), 4320026926 (ISBN)</dd>
<dd>評価<abbr class="rating fa-sm" title="5"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i></abbr></dd>
</dl>
<p class="description">通称 “K&R”。その筋の人々には「バイブル」と呼ばれる名著(当時は)。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2018-12-07">2018-12-07</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- プログラミング言語C -->
<div class="hreview">
<div class="photo"><a href="https://www.amazon.co.jp/dp/4873117364?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1"><img src="https://m.media-amazon.com/images/I/51ng4usMVYL._SL160_.jpg" width="125" alt="photo"></a></div>
<dl>
<dt class="item"><a class="fn url" href="https://www.amazon.co.jp/dp/4873117364?tag=baldandersinf-22&linkCode=ogi&th=1&psc=1">Effective Modern C++ ―C++11/14プログラムを進化させる42項目</a></dt>
<dd>Scott Meyers (著), 千住 治郎 (翻訳)</dd>
<dd>オライリージャパン 2015-09-18</dd>
<dd>大型本</dd>
<dd>4873117364 (ASIN), 9784873117362 (EAN), 4873117364 (ISBN)</dd>
<dd>評価<abbr class="rating fa-sm" title="4"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="far fa-star"></i></abbr></dd>
</dl>
<p class="description">C++ 再勉強中。</p>
<p class="powered-by">reviewed by <a href='#maker' class='reviewer'>Spiegel</a> on <abbr class="dtreviewed" title="2016-09-22">2016-09-22</abbr> (powered by <a href="https://affiliate.amazon.co.jp/assoc_credentials/home">PA-APIv5</a>)</p>
</div> <!-- Effective Modern C++ -->
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> のインストールについては拙文「<a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-1/">MSYS2 による gcc 開発環境の構築 ― MSYS2 のインストールから初期化処理まで</a>」を参照のこと。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p>SourceForge からのダウンロードなので取扱いに注意。ページの余計なところを触らないこと(笑) <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
MSYS2 による gcc 開発環境の構築 ― pgpdump をビルドする
tag:text.Baldanders.info,2016-03-01:/remark/2016/03/gcc-msys2-3/
2016-03-01T13:02:47+00:00
2019-07-01T13:48:09+00:00
前回で gcc を導入できたので,実際にビルドを試してみる。今回はターゲットとして pgpdump を用いる。
Spiegel
https://baldanders.info/profile/
<ol>
<li><a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-1/">MSYS2 のインストールから初期化処理まで</a></li>
<li><a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-2/">gcc パッケージ群の導入</a></li>
<li><a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-3/">pgpdump をビルドする</a> (← イマココ)</li>
</ol>
<p><a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-2/" title="MSYS2 による gcc 開発環境の構築 ― gcc パッケージ群の導入">前回</a>で gcc を導入できたので,実際にビルドを試してみる。
今回はターゲットとして <a href="https://github.com/kazu-yamamoto/pgpdump" title="kazu-yamamoto/pgpdump: A PGP packet visualizer">pgpdump</a> を用いる。</p>
<h2>pgpdump</h2>
<p><a href="https://github.com/kazu-yamamoto/pgpdump" title="kazu-yamamoto/pgpdump: A PGP packet visualizer">pgpdump</a> は山本和彦さんによる <a href="http://tools.ietf.org/html/rfc4880" title="RFC 4880 - OpenPGP Message Format">OpenPGP</a> パケットの<a href="http://www.mew.org/~kazu/proj/pgpdump/ja/">視覚化ツール</a>。
ソースコードは <a href="https://github.com/kazu-yamamoto/pgpdump" title="kazu-yamamoto/pgpdump: A PGP packet visualizer">GitHub で公開</a>されているが, UNIX 系のプラットフォームを前提に作られているため <a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> 上でビルドを行う。</p>
<p>まずは <a href="https://github.com/kazu-yamamoto/pgpdump" title="kazu-yamamoto/pgpdump: A PGP packet visualizer">pgpdump</a> のソースコードをダウンロードする。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ git clone https://github.com/kazu-yamamoto/pgpdump.git
</span></span><span class="line"><span class="cl">Cloning into 'pgpdump'...
</span></span><span class="line"><span class="cl">remote: Counting objects: 492, done.
</span></span><span class="line"><span class="cl">Receiving objects: 59% (291remote: Total 492 (delta 0), reused 0 (delta 0), pack-reused 492 92
</span></span><span class="line"><span class="cl">Receiving objects: 100% (492/492), 180.29 KiB | 0 bytes/s, done.
</span></span><span class="line"><span class="cl">Resolving deltas: 100% (320/320), done.
</span></span><span class="line"><span class="cl">Checking connectivity... done.
</span></span></code></pre></div><h2>32bit 版のビルド</h2>
<p><a href="https://github.com/kazu-yamamoto/pgpdump" title="kazu-yamamoto/pgpdump: A PGP packet visualizer">pgpdump</a> のビルド手順は <code>configure</code> を実行した後 make を実行する<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。
まずは何も考えずに <code>configure</code> の実行してみる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ cd pgpdump/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ ./configure
</span></span><span class="line"><span class="cl">checking for gcc... gcc
</span></span><span class="line"><span class="cl">checking whether the C compiler works... yes
</span></span><span class="line"><span class="cl">checking for C compiler default output file name... a.exe
</span></span><span class="line"><span class="cl">checking for suffix of executables... .exe
</span></span><span class="line"><span class="cl">checking whether we are cross compiling... no
</span></span><span class="line"><span class="cl">checking for suffix of object files... o
</span></span><span class="line"><span class="cl">checking whether we are using the GNU C compiler... yes
</span></span><span class="line"><span class="cl">checking whether gcc accepts -g... yes
</span></span><span class="line"><span class="cl">checking for gcc option to accept ISO C89... none needed
</span></span><span class="line"><span class="cl">checking for inflate in -lz... yes
</span></span><span class="line"><span class="cl">checking for BZ2_bzBuffToBuffDecompress in -lbz2... yes
</span></span><span class="line"><span class="cl">checking how to run the C preprocessor... gcc -E
</span></span><span class="line"><span class="cl">checking for grep that handles long lines and -e... /usr/bin/grep
</span></span><span class="line"><span class="cl">checking for egrep... /usr/bin/grep -E
</span></span><span class="line"><span class="cl">checking for ANSI C header files... yes
</span></span><span class="line"><span class="cl">checking for sys/types.h... yes
</span></span><span class="line"><span class="cl">checking for sys/stat.h... yes
</span></span><span class="line"><span class="cl">checking for stdlib.h... yes
</span></span><span class="line"><span class="cl">checking for string.h... yes
</span></span><span class="line"><span class="cl">checking for memory.h... yes
</span></span><span class="line"><span class="cl">checking for strings.h... yes
</span></span><span class="line"><span class="cl">checking for inttypes.h... yes
</span></span><span class="line"><span class="cl">checking for stdint.h... yes
</span></span><span class="line"><span class="cl">checking for unistd.h... yes
</span></span><span class="line"><span class="cl">checking for unistd.h... (cached) yes
</span></span><span class="line"><span class="cl">checking sys/time.h usability... yes
</span></span><span class="line"><span class="cl">checking sys/time.h presence... yes
</span></span><span class="line"><span class="cl">checking for sys/time.h... yes
</span></span><span class="line"><span class="cl">checking unixlib/local.h usability... no
</span></span><span class="line"><span class="cl">checking unixlib/local.h presence... no
</span></span><span class="line"><span class="cl">checking for unixlib/local.h... no
</span></span><span class="line"><span class="cl">checking whether time.h and sys/time.h may both be included... yes
</span></span><span class="line"><span class="cl">checking whether struct tm is in sys/time.h or time.h... time.h
</span></span><span class="line"><span class="cl">checking for struct tm.tm_zone... no
</span></span><span class="line"><span class="cl">checking whether tzname is declared... yes
</span></span><span class="line"><span class="cl">checking for tzname... yes
</span></span><span class="line"><span class="cl">configure: creating ./config.status
</span></span><span class="line"><span class="cl">config.status: creating Makefile
</span></span><span class="line"><span class="cl">config.status: WARNING: 'Makefile.in' seems to ignore the --datarootdir setting
</span></span><span class="line"><span class="cl">config.status: creating config.h
</span></span></code></pre></div><p><a href="https://github.com/kazu-yamamoto/pgpdump" title="kazu-yamamoto/pgpdump: A PGP packet visualizer">pgpdump</a> ではパケット内の圧縮データを扱うため <code>libz</code> および <code>libbz2</code> が必要となるが,ちゃんと認識しているようだ。
これによって作成された <code>Makefile</code> がこれ。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-makefile" data-lang="makefile"><span class="line"><span class="cl"><span class="nv">prefix</span> <span class="o">=</span> /usr/local
</span></span><span class="line"><span class="cl"><span class="nv">exec_prefix</span> <span class="o">=</span> <span class="si">${</span><span class="nv">prefix</span><span class="si">}</span>
</span></span><span class="line"><span class="cl"><span class="nv">bindir</span> <span class="o">=</span> <span class="si">${</span><span class="nv">exec_prefix</span><span class="si">}</span>/bin
</span></span><span class="line"><span class="cl"><span class="nv">mandir</span> <span class="o">=</span> <span class="si">${</span><span class="nv">prefix</span><span class="si">}</span>/share/man
</span></span><span class="line"><span class="cl"><span class="nv">LIBS</span> <span class="o">=</span> -lbz2 -lz
</span></span><span class="line"><span class="cl"><span class="nv">CFLAGS</span> <span class="o">=</span> -g -O2 -O -Wall
</span></span><span class="line"><span class="cl"><span class="nv">LDFLAGS</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl"><span class="nv">VERSION</span> <span class="o">=</span> <span class="sb">`</span>git tag <span class="p">|</span> tail -1 <span class="p">|</span> sed -e <span class="s1">'s/v//'</span><span class="sb">`</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">RM</span> <span class="o">=</span> rm -f
</span></span><span class="line"><span class="cl"><span class="nv">INSTALL</span> <span class="o">=</span> install
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">INCS</span> <span class="o">=</span> pgpdump.h
</span></span><span class="line"><span class="cl"><span class="nv">SRCS</span> <span class="o">=</span> pgpdump.c types.c tagfuncs.c packet.c subfunc.c signature.c keys.c <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> buffer.c uatfunc.c
</span></span><span class="line"><span class="cl"><span class="nv">OBJS</span> <span class="o">=</span> pgpdump.o types.o tagfuncs.o packet.o subfunc.o signature.o keys.o <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> buffer.o uatfunc.o
</span></span><span class="line"><span class="cl"><span class="nv">PROG</span> <span class="o">=</span> pgpdump
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">MAN</span> <span class="o">=</span> pgpdump.1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">CNF</span> <span class="o">=</span> config.h config.status config.cache config.log
</span></span><span class="line"><span class="cl"><span class="nv">MKF</span> <span class="o">=</span> Makefile
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">.c.o</span><span class="o">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>CC<span class="k">)</span> -c <span class="k">$(</span>CFLAGS<span class="k">)</span> $<
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">all</span><span class="o">:</span> <span class="k">$(</span><span class="nv">PROG</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">$(PROG)</span><span class="o">:</span> <span class="k">$(</span><span class="nv">OBJS</span><span class="k">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>CC<span class="k">)</span> <span class="k">$(</span>CFLAGS<span class="k">)</span> -o <span class="k">$(</span>PROG<span class="k">)</span> <span class="k">$(</span>OBJS<span class="k">)</span> <span class="k">$(</span>LIBS<span class="k">)</span> <span class="k">$(</span>LDFLAGS<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">clean</span><span class="o">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>RM<span class="k">)</span> <span class="k">$(</span>OBJS<span class="k">)</span> <span class="k">$(</span>PROG<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">distclean</span><span class="o">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>RM<span class="k">)</span> <span class="k">$(</span>OBJS<span class="k">)</span> <span class="k">$(</span>PROG<span class="k">)</span> <span class="k">$(</span>CNF<span class="k">)</span> <span class="k">$(</span>MKF<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">install</span><span class="o">:</span> <span class="n">all</span>
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>INSTALL<span class="k">)</span> -d <span class="k">$(</span>DESTDIR<span class="k">)$(</span>bindir<span class="k">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>INSTALL<span class="k">)</span> -cp -pm755 <span class="k">$(</span>PROG<span class="k">)</span> <span class="k">$(</span>DESTDIR<span class="k">)$(</span>bindir<span class="k">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>INSTALL<span class="k">)</span> -d <span class="k">$(</span>DESTDIR<span class="k">)$(</span>mandir<span class="k">)</span>/man1
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>INSTALL<span class="k">)</span> -cp -pm644 <span class="k">$(</span>MAN<span class="k">)</span> <span class="k">$(</span>DESTDIR<span class="k">)$(</span>mandir<span class="k">)</span>/man1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">archive</span><span class="o">:</span>
</span></span><span class="line"><span class="cl"> git archive master -o ~/pgpdump-<span class="k">$(</span>VERSION<span class="k">)</span>.tar --prefix<span class="o">=</span>pgpdump-<span class="k">$(</span>VERSION<span class="k">)</span>/
</span></span><span class="line"><span class="cl"> gzip ~/pgpdump-<span class="k">$(</span>VERSION<span class="k">)</span>.tar
</span></span></code></pre></div><p>この時点での問題は以下のとおり。</p>
<ol>
<li><code>prefix</code> が <code>/usr/local</code> になっている。このままでもエラーにはならないが,今回は 32bit 版と 64bit 版を分けたいので <code>/mingw32</code> としたい</li>
<li>リンク時のオプション(<code>LDFLAGS</code>)に <code>-static</code> がないため,このままビルドすると DLL に依存する構成になってしまう</li>
</ol>
<p>これらについては <code>configure</code> に情報を渡せばよい。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ ./configure --prefix=/mingw32 LDFLAGS=-static
</span></span></code></pre></div><p>これで <code>Makefile</code> は以下のようになる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-makefile" data-lang="makefile"><span class="line"><span class="cl"><span class="nv">prefix</span> <span class="o">=</span> /mingw32
</span></span><span class="line"><span class="cl"><span class="nv">exec_prefix</span> <span class="o">=</span> <span class="si">${</span><span class="nv">prefix</span><span class="si">}</span>
</span></span><span class="line"><span class="cl"><span class="nv">bindir</span> <span class="o">=</span> <span class="si">${</span><span class="nv">exec_prefix</span><span class="si">}</span>/bin
</span></span><span class="line"><span class="cl"><span class="nv">mandir</span> <span class="o">=</span> <span class="si">${</span><span class="nv">prefix</span><span class="si">}</span>/share/man
</span></span><span class="line"><span class="cl"><span class="nv">LIBS</span> <span class="o">=</span> -lbz2 -lz
</span></span><span class="line"><span class="cl"><span class="nv">CFLAGS</span> <span class="o">=</span> -g -O2 -O -Wall
</span></span><span class="line"><span class="cl"><span class="nv">LDFLAGS</span> <span class="o">=</span> -static
</span></span><span class="line"><span class="cl"><span class="nv">VERSION</span> <span class="o">=</span> <span class="sb">`</span>git tag <span class="p">|</span> tail -1 <span class="p">|</span> sed -e <span class="s1">'s/v//'</span><span class="sb">`</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">RM</span> <span class="o">=</span> rm -f
</span></span><span class="line"><span class="cl"><span class="nv">INSTALL</span> <span class="o">=</span> install
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">INCS</span> <span class="o">=</span> pgpdump.h
</span></span><span class="line"><span class="cl"><span class="nv">SRCS</span> <span class="o">=</span> pgpdump.c types.c tagfuncs.c packet.c subfunc.c signature.c keys.c <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> buffer.c uatfunc.c
</span></span><span class="line"><span class="cl"><span class="nv">OBJS</span> <span class="o">=</span> pgpdump.o types.o tagfuncs.o packet.o subfunc.o signature.o keys.o <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> buffer.o uatfunc.o
</span></span><span class="line"><span class="cl"><span class="nv">PROG</span> <span class="o">=</span> pgpdump
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">MAN</span> <span class="o">=</span> pgpdump.1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">CNF</span> <span class="o">=</span> config.h config.status config.cache config.log
</span></span><span class="line"><span class="cl"><span class="nv">MKF</span> <span class="o">=</span> Makefile
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">.c.o</span><span class="o">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>CC<span class="k">)</span> -c <span class="k">$(</span>CFLAGS<span class="k">)</span> $<
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">all</span><span class="o">:</span> <span class="k">$(</span><span class="nv">PROG</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">$(PROG)</span><span class="o">:</span> <span class="k">$(</span><span class="nv">OBJS</span><span class="k">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>CC<span class="k">)</span> <span class="k">$(</span>CFLAGS<span class="k">)</span> -o <span class="k">$(</span>PROG<span class="k">)</span> <span class="k">$(</span>OBJS<span class="k">)</span> <span class="k">$(</span>LIBS<span class="k">)</span> <span class="k">$(</span>LDFLAGS<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">clean</span><span class="o">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>RM<span class="k">)</span> <span class="k">$(</span>OBJS<span class="k">)</span> <span class="k">$(</span>PROG<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">distclean</span><span class="o">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>RM<span class="k">)</span> <span class="k">$(</span>OBJS<span class="k">)</span> <span class="k">$(</span>PROG<span class="k">)</span> <span class="k">$(</span>CNF<span class="k">)</span> <span class="k">$(</span>MKF<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">install</span><span class="o">:</span> <span class="n">all</span>
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>INSTALL<span class="k">)</span> -d <span class="k">$(</span>DESTDIR<span class="k">)$(</span>bindir<span class="k">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>INSTALL<span class="k">)</span> -cp -pm755 <span class="k">$(</span>PROG<span class="k">)</span> <span class="k">$(</span>DESTDIR<span class="k">)$(</span>bindir<span class="k">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>INSTALL<span class="k">)</span> -d <span class="k">$(</span>DESTDIR<span class="k">)$(</span>mandir<span class="k">)</span>/man1
</span></span><span class="line"><span class="cl"> <span class="k">$(</span>INSTALL<span class="k">)</span> -cp -pm644 <span class="k">$(</span>MAN<span class="k">)</span> <span class="k">$(</span>DESTDIR<span class="k">)$(</span>mandir<span class="k">)</span>/man1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">archive</span><span class="o">:</span>
</span></span><span class="line"><span class="cl"> git archive master -o ~/pgpdump-<span class="k">$(</span>VERSION<span class="k">)</span>.tar --prefix<span class="o">=</span>pgpdump-<span class="k">$(</span>VERSION<span class="k">)</span>/
</span></span><span class="line"><span class="cl"> gzip ~/pgpdump-<span class="k">$(</span>VERSION<span class="k">)</span>.tar
</span></span></code></pre></div><p>では make を実行しよう。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ make
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall pgpdump.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall types.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall tagfuncs.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall packet.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall subfunc.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall signature.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall keys.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall buffer.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall uatfunc.c
</span></span><span class="line"><span class="cl">cc -g -O2 -O -Wall -o pgpdump pgpdump.o types.o tagfuncs.o packet.o subfunc.o signature.o keys.o buffer.o uatfunc.o -lbz2 -lz -static
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ strip pgpdump.exe
</span></span></code></pre></div><p>できた実行ファイルをコマンドプロンプトから起動してみる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">C:>pgpdump.exe -v
</span></span><span class="line"><span class="cl">pgpdump.exe version 0.29, Copyright (C) 1998-2014 Kazu Yamamoto
</span></span></code></pre></div><p>うまくいったようである。</p>
<h2>64bit 版のビルド</h2>
<p>32bit 版で要領は分かったので一気に終わらせてしまおう。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ git clone https://github.com/kazu-yamamoto/pgpdump.git
</span></span><span class="line"><span class="cl">Cloning into 'pgpdump'...
</span></span><span class="line"><span class="cl">remote: Counting objects: 492, done.
</span></span><span class="line"><span class="cl">Receiving objects: 62% (306remote: Total 492 (delta 0), reused 0 (delta 0), pack-reused 492/92
</span></span><span class="line"><span class="cl">Receiving objects: 100% (492/492), 180.29 KiB | 0 bytes/s, done.
</span></span><span class="line"><span class="cl">Resolving deltas: 100% (320/320), done.
</span></span><span class="line"><span class="cl">Checking connectivity... done.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ cd pgpdump/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ ./configure --prefix=/mingw64 LDFLAGS=-static
</span></span><span class="line"><span class="cl">checking for gcc... gcc
</span></span><span class="line"><span class="cl">checking whether the C compiler works... yes
</span></span><span class="line"><span class="cl">checking for C compiler default output file name... a.exe
</span></span><span class="line"><span class="cl">checking for suffix of executables... .exe
</span></span><span class="line"><span class="cl">checking whether we are cross compiling... no
</span></span><span class="line"><span class="cl">checking for suffix of object files... o
</span></span><span class="line"><span class="cl">checking whether we are using the GNU C compiler... yes
</span></span><span class="line"><span class="cl">checking whether gcc accepts -g... yes
</span></span><span class="line"><span class="cl">checking for gcc option to accept ISO C89... none needed
</span></span><span class="line"><span class="cl">checking for inflate in -lz... yes
</span></span><span class="line"><span class="cl">checking for BZ2_bzBuffToBuffDecompress in -lbz2... yes
</span></span><span class="line"><span class="cl">checking how to run the C preprocessor... gcc -E
</span></span><span class="line"><span class="cl">checking for grep that handles long lines and -e... /usr/bin/grep
</span></span><span class="line"><span class="cl">checking for egrep... /usr/bin/grep -E
</span></span><span class="line"><span class="cl">checking for ANSI C header files... yes
</span></span><span class="line"><span class="cl">checking for sys/types.h... yes
</span></span><span class="line"><span class="cl">checking for sys/stat.h... yes
</span></span><span class="line"><span class="cl">checking for stdlib.h... yes
</span></span><span class="line"><span class="cl">checking for string.h... yes
</span></span><span class="line"><span class="cl">checking for memory.h... yes
</span></span><span class="line"><span class="cl">checking for strings.h... yes
</span></span><span class="line"><span class="cl">checking for inttypes.h... yes
</span></span><span class="line"><span class="cl">checking for stdint.h... yes
</span></span><span class="line"><span class="cl">checking for unistd.h... yes
</span></span><span class="line"><span class="cl">checking for unistd.h... (cached) yes
</span></span><span class="line"><span class="cl">checking sys/time.h usability... yes
</span></span><span class="line"><span class="cl">checking sys/time.h presence... yes
</span></span><span class="line"><span class="cl">checking for sys/time.h... yes
</span></span><span class="line"><span class="cl">checking unixlib/local.h usability... no
</span></span><span class="line"><span class="cl">checking unixlib/local.h presence... no
</span></span><span class="line"><span class="cl">checking for unixlib/local.h... no
</span></span><span class="line"><span class="cl">checking whether time.h and sys/time.h may both be included... yes
</span></span><span class="line"><span class="cl">checking whether struct tm is in sys/time.h or time.h... time.h
</span></span><span class="line"><span class="cl">checking for struct tm.tm_zone... no
</span></span><span class="line"><span class="cl">checking whether tzname is declared... yes
</span></span><span class="line"><span class="cl">checking for tzname... yes
</span></span><span class="line"><span class="cl">configure: creating ./config.status
</span></span><span class="line"><span class="cl">config.status: creating Makefile
</span></span><span class="line"><span class="cl">config.status: WARNING: 'Makefile.in' seems to ignore the --datarootdir setting
</span></span><span class="line"><span class="cl">config.status: creating config.h
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ make
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall pgpdump.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall types.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall tagfuncs.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall packet.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall subfunc.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall signature.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall keys.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall buffer.c
</span></span><span class="line"><span class="cl">cc -c -g -O2 -O -Wall uatfunc.c
</span></span><span class="line"><span class="cl">cc -g -O2 -O -Wall -o pgpdump pgpdump.o types.o tagfuncs.o packet.o subfunc.o signature.o keys.o buffer.o uatfunc.o -lbz2 -lz -static
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ strip pgpdump.exe
</span></span></code></pre></div><p>これもコマンドプロンプト上で起動してみる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">C:>pgpdump.exe -v
</span></span><span class="line"><span class="cl">pgpdump.exe version 0.29, Copyright (C) 1998-2014 Kazu Yamamoto
</span></span></code></pre></div><p>問題なし。</p>
<h2>動作確認</h2>
<p>実際にちゃんと動くかどうか <a href="https://www.jpcert.or.jp/jpcert-pgp.html" title="JPCERT コーディネーションセンター PGP公開鍵">JPCERT/CC の公開鍵</a>をを使って確認してみる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">C:>pgpdump.exe info-0x69ECE048.asc
</span></span><span class="line"><span class="cl">Old: Public Key Packet(tag 6)(269 bytes)
</span></span><span class="line"><span class="cl"> Ver 4 - new
</span></span><span class="line"><span class="cl"> Public key creation time - Tue Jun 02 14:43:57 東京 (標準時) 2009
</span></span><span class="line"><span class="cl"> Pub alg - RSA Encrypt or Sign(pub 1)
</span></span><span class="line"><span class="cl"> RSA n(2048 bits) - ...
</span></span><span class="line"><span class="cl"> RSA e(17 bits) - ...
</span></span><span class="line"><span class="cl">Old: User ID Packet(tag 13)(29 bytes)
</span></span><span class="line"><span class="cl"> User ID - JPCERT/CC <info@jpcert.or.jp>
</span></span><span class="line"><span class="cl">Old: Signature Packet(tag 2)(316 bytes)
</span></span><span class="line"><span class="cl"> Ver 4 - new
</span></span><span class="line"><span class="cl"> Sig type - Generic certification of a User ID and Public Key packet(0x10).
</span></span><span class="line"><span class="cl"> Pub alg - RSA Encrypt or Sign(pub 1)
</span></span><span class="line"><span class="cl"> Hash alg - SHA1(hash 2)
</span></span><span class="line"><span class="cl"> Hashed Sub: preferred symmetric algorithms(sub 11)(3 bytes)
</span></span><span class="line"><span class="cl"> Sym alg - AES with 256-bit key(sym 9)
</span></span><span class="line"><span class="cl"> Sym alg - CAST5(sym 3)
</span></span><span class="line"><span class="cl"> Sym alg - Triple-DES(sym 2)
</span></span><span class="line"><span class="cl"> Hashed Sub: key server preferences(sub 23)(4 bytes)
</span></span><span class="line"><span class="cl"> Flag - No-modify
</span></span><span class="line"><span class="cl"> Hashed Sub: key flags(sub 27)(4 bytes)
</span></span><span class="line"><span class="cl"> Flag - This key may be used to certify other keys
</span></span><span class="line"><span class="cl"> Flag - This key may be used to sign data
</span></span><span class="line"><span class="cl"> Flag - This key may be used to encrypt communications
</span></span><span class="line"><span class="cl"> Flag - This key may be used to encrypt storage
</span></span><span class="line"><span class="cl"> Flag - The private component of this key may be in the possession of more than one person
</span></span><span class="line"><span class="cl"> Hashed Sub: preferred compression algorithms(sub 22)(2 bytes)
</span></span><span class="line"><span class="cl"> Comp alg - ZLIB <RFC1950>(comp 2)
</span></span><span class="line"><span class="cl"> Comp alg - ZIP <RFC1951>(comp 1)
</span></span><span class="line"><span class="cl"> Hashed Sub: features(sub 30)(4 bytes)
</span></span><span class="line"><span class="cl"> Flag - Modification detection (packets 18 and 19)
</span></span><span class="line"><span class="cl"> Hashed Sub: preferred hash algorithms(sub 21)(3 bytes)
</span></span><span class="line"><span class="cl"> Hash alg - SHA256(hash 8)
</span></span><span class="line"><span class="cl"> Hash alg - SHA384(hash 9)
</span></span><span class="line"><span class="cl"> Hash alg - SHA512(hash 10)
</span></span><span class="line"><span class="cl"> Hashed Sub: signature creation time(sub 2)(4 bytes)
</span></span><span class="line"><span class="cl"> Time - Tue Jun 16 12:51:22 東京 (標準時) 2009
</span></span><span class="line"><span class="cl"> Sub: issuer key ID(sub 16)(8 bytes)
</span></span><span class="line"><span class="cl"> Key ID - 0x317D97A469ECE048
</span></span><span class="line"><span class="cl"> Hash left 2 bytes - cd 79
</span></span><span class="line"><span class="cl"> RSA m^d mod n(2047 bits) - ...
</span></span><span class="line"><span class="cl"> -> PKCS-1
</span></span><span class="line"><span class="cl">Old: Signature Packet(tag 2)(277 bytes)
</span></span><span class="line"><span class="cl"> Ver 3 - old
</span></span><span class="line"><span class="cl"> Hash material(5 bytes):
</span></span><span class="line"><span class="cl"> Sig type - Generic certification of a User ID and Public Key packet(0x10).
</span></span><span class="line"><span class="cl"> Creation time - Tue Jun 02 14:43:57 東京 (標準時) 2009
</span></span><span class="line"><span class="cl"> Key ID - 0xE7734FA60C7BDE12
</span></span><span class="line"><span class="cl"> Pub alg - RSA Encrypt or Sign(pub 1)
</span></span><span class="line"><span class="cl"> Hash alg - SHA1(hash 2)
</span></span><span class="line"><span class="cl"> Hash left 2 bytes - e9 53
</span></span><span class="line"><span class="cl"> RSA m^d mod n(2047 bits) - ...
</span></span><span class="line"><span class="cl"> -> PKCS-1
</span></span><span class="line"><span class="cl">Old: Signature Packet(tag 2)(156 bytes)
</span></span><span class="line"><span class="cl"> Ver 4 - new
</span></span><span class="line"><span class="cl"> Sig type - Generic certification of a User ID and Public Key packet(0x10).
</span></span><span class="line"><span class="cl"> Pub alg - RSA Encrypt or Sign(pub 1)
</span></span><span class="line"><span class="cl"> Hash alg - SHA1(hash 2)
</span></span><span class="line"><span class="cl"> Hashed Sub: signature creation time(sub 2)(4 bytes)
</span></span><span class="line"><span class="cl"> Time - Mon Jun 15 14:51:27 東京 (標準時) 2009
</span></span><span class="line"><span class="cl"> Sub: issuer key ID(sub 16)(8 bytes)
</span></span><span class="line"><span class="cl"> Key ID - 0x8C756B2E2C94D4ED
</span></span><span class="line"><span class="cl"> Hash left 2 bytes - 35 fd
</span></span><span class="line"><span class="cl"> RSA m^d mod n(1022 bits) - ...
</span></span><span class="line"><span class="cl"> -> PKCS-1
</span></span><span class="line"><span class="cl">Old: Public Subkey Packet(tag 14)(269 bytes)
</span></span><span class="line"><span class="cl"> Ver 4 - new
</span></span><span class="line"><span class="cl"> Public key creation time - Tue Jun 02 14:43:57 東京 (標準時) 2009
</span></span><span class="line"><span class="cl"> Pub alg - RSA Encrypt or Sign(pub 1)
</span></span><span class="line"><span class="cl"> RSA n(2048 bits) - ...
</span></span><span class="line"><span class="cl"> RSA e(17 bits) - ...
</span></span><span class="line"><span class="cl">Old: Signature Packet(tag 2)(577 bytes)
</span></span><span class="line"><span class="cl"> Ver 4 - new
</span></span><span class="line"><span class="cl"> Sig type - Subkey Binding Signature(0x18).
</span></span><span class="line"><span class="cl"> Pub alg - RSA Encrypt or Sign(pub 1)
</span></span><span class="line"><span class="cl"> Hash alg - SHA1(hash 2)
</span></span><span class="line"><span class="cl"> Hashed Sub: signature creation time(sub 2)(4 bytes)
</span></span><span class="line"><span class="cl"> Time - Tue Jun 02 14:43:58 東京 (標準時) 2009
</span></span><span class="line"><span class="cl"> Hashed Sub: key flags(sub 27)(4 bytes)
</span></span><span class="line"><span class="cl"> Flag - This key may be used to encrypt communications
</span></span><span class="line"><span class="cl"> Flag - This key may be used to encrypt storage
</span></span><span class="line"><span class="cl"> Hashed Sub: embedded signature(sub 32)(284 bytes)
</span></span><span class="line"><span class="cl"> Ver 4 - new
</span></span><span class="line"><span class="cl"> Sig type - Primary Key Binding Signature(0x19).
</span></span><span class="line"><span class="cl"> Pub alg - RSA Encrypt or Sign(pub 1)
</span></span><span class="line"><span class="cl"> Hash alg - SHA256(hash 8)
</span></span><span class="line"><span class="cl"> Hashed Sub: signature creation time(sub 2)(4 bytes)
</span></span><span class="line"><span class="cl"> Time - Tue Jun 02 14:43:57 東京 (標準時) 2009
</span></span><span class="line"><span class="cl"> Sub: issuer key ID(sub 16)(8 bytes)
</span></span><span class="line"><span class="cl"> Key ID - 0x09D704B753BA1622
</span></span><span class="line"><span class="cl"> Hash left 2 bytes - 71 2d
</span></span><span class="line"><span class="cl"> RSA m^d mod n(2048 bits) - ...
</span></span><span class="line"><span class="cl"> -> PKCS-1
</span></span><span class="line"><span class="cl"> Sub: issuer key ID(sub 16)(8 bytes)
</span></span><span class="line"><span class="cl"> Key ID - 0x317D97A469ECE048
</span></span><span class="line"><span class="cl"> Hash left 2 bytes - 1d e2
</span></span><span class="line"><span class="cl"> RSA m^d mod n(2046 bits) - ...
</span></span><span class="line"><span class="cl"> -> PKCS-1
</span></span></code></pre></div><p>うむ,問題ないようだな。
ちなみに Windows バイナリは<a href="https://baldanders.info/spiegel/pgpdump/">うちのサイトでも公開</a>しているのでご自由にどうぞ。</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-2/" title="MSYS2 による gcc 開発環境の構築 ― gcc パッケージ群の導入">前回</a>インストールした <code>base-devel</code> パッケージグループは今回の <a href="https://github.com/kazu-yamamoto/pgpdump" title="kazu-yamamoto/pgpdump: A PGP packet visualizer">pgpdump</a> ビルドには必要なく,インストールしなくても問題ない。まぁ今回は単純なビルドだし。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
MSYS2 による gcc 開発環境の構築 ― gcc パッケージ群の導入
tag:text.Baldanders.info,2016-03-01:/remark/2016/03/gcc-msys2-2/
2016-03-01T13:02:44+00:00
2019-07-01T13:48:09+00:00
いよいよ gcc をインストールする。
Spiegel
https://baldanders.info/profile/
<ol>
<li><a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-1/">MSYS2 のインストールから初期化処理まで</a></li>
<li><a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-2/">gcc パッケージ群の導入</a> (← イマココ)</li>
<li><a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-3/">pgpdump をビルドする</a></li>
</ol>
<p>いよいよ gcc をインストールする。
その前に…</p>
<h2>pacman によるパッケージ管理</h2>
<p><a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-1/" title="MSYS2 による gcc 開発環境の構築 ― インストールから初期化処理まで">前回</a>の初期化でもちょっとだけ出てきたが, <a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> のパッケージ管理には pacman コマンドを使う。
pacman は元々 Arch Linux のパッケージ管理ツールで,使い方もこれと同じようだ。</p>
<ul>
<li><a href="https://archlinuxjp.kusakata.com/wiki/Pacman">pacman - ArchWiki</a></li>
</ul>
<p>よく使うコマンドとしては</p>
<table>
<thead>
<tr>
<th style="text-align:left">コマンドライン</th>
<th style="text-align:left">処理内容</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>pacman -S <package_name1> [package_name2...]</code></td>
<td style="text-align:left">指定したパッケージをインストールする</td>
</tr>
<tr>
<td style="text-align:left"><code>pacman -Sl [repository]</code></td>
<td style="text-align:left">パッケージを一覧表示する(リポジトリを指定可能)</td>
</tr>
<tr>
<td style="text-align:left"><code>pacman -Ss [regex...]</code></td>
<td style="text-align:left">パッケージを一覧・検索する(キーワードを指定可能)</td>
</tr>
<tr>
<td style="text-align:left"><code>pacman -Su</code></td>
<td style="text-align:left">インストール済みのパッケージを更新する</td>
</tr>
<tr>
<td style="text-align:left"><code>pacman -Sy</code></td>
<td style="text-align:left">パッケージのデータベースを更新する</td>
</tr>
<tr>
<td style="text-align:left"><code>pacman -Syu</code></td>
<td style="text-align:left"><code>-Su</code>, <code>-Sy</code> の同時指定</td>
</tr>
<tr>
<td style="text-align:left"><code>pacman -Q [package_name...]</code></td>
<td style="text-align:left">インストール済みパッケージを一覧・検索する(パッケージを指定可能)</td>
</tr>
<tr>
<td style="text-align:left"><code>pacman -Qs [regex...]</code></td>
<td style="text-align:left">インストール済みパッケージを一覧・検索する(をキーワードを指定可能)</td>
</tr>
<tr>
<td style="text-align:left"><code>pacman -R <package_name></code></td>
<td style="text-align:left">指定したパッケージを削除する</td>
</tr>
<tr>
<td style="text-align:left"><code>pacman -Rs <package_name></code></td>
<td style="text-align:left">依存関係を含めて指定したパッケージを削除する(指定したパッケージにのみ依存するパッケージを削除)</td>
</tr>
</tbody>
</table>
<p>あたりか。</p>
<h3>MSYS2 のリポジトリ</h3>
<p><code>/etc/pacman.conf</code> を見ると MSYS2 では <code>mingw32</code>, <code>mingw64</code>, <code>msys</code> の3つのリポジトリを管理していることが分かる。</p>
<table>
<thead>
<tr>
<th style="text-align:left">リポジトリ名</th>
<th style="text-align:left">参照ファイル</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>mingw32</code></td>
<td style="text-align:left"><code>/etc/pacman.d/mirrorlist.mingw32</code></td>
</tr>
<tr>
<td style="text-align:left"><code>mingw64</code></td>
<td style="text-align:left"><code>/etc/pacman.d/mirrorlist.mingw64</code></td>
</tr>
<tr>
<td style="text-align:left"><code>msys</code></td>
<td style="text-align:left"><code>/etc/pacman.d/mirrorlist.msys</code></td>
</tr>
</tbody>
</table>
<p>実際には「参照ファイル」にリポジトリへの URI が書かれている。
たとえば <code>/etc/pacman.d/mirrorlist.mingw32</code> ならこんな感じ。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">##
</span></span><span class="line"><span class="cl">## 32-bit Mingw-w64 repository mirrorlist
</span></span><span class="line"><span class="cl">##
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Primary
</span></span><span class="line"><span class="cl">## msys2.org
</span></span><span class="line"><span class="cl">Server = http://repo.msys2.org/mingw/i686
</span></span><span class="line"><span class="cl">Server = http://downloads.sourceforge.net/project/msys2/REPOS/MINGW/i686
</span></span><span class="line"><span class="cl">Server = http://www2.futureware.at/~nickoe/msys2-mirror/i686/
</span></span></code></pre></div><p>では実際にリポジトリの中を覗いてみよう。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ pacman -Sl | grep gcc
</span></span><span class="line"><span class="cl">mingw32 mingw-w64-i686-gcc 7.3.0-1
</span></span><span class="line"><span class="cl">mingw32 mingw-w64-i686-gcc-ada 7.3.0-1
</span></span><span class="line"><span class="cl">mingw32 mingw-w64-i686-gcc-fortran 7.3.0-1
</span></span><span class="line"><span class="cl">mingw32 mingw-w64-i686-gcc-libgfortran 7.3.0-1
</span></span><span class="line"><span class="cl">mingw32 mingw-w64-i686-gcc-libs 7.3.0-1
</span></span><span class="line"><span class="cl">mingw32 mingw-w64-i686-gcc-objc 7.3.0-1
</span></span><span class="line"><span class="cl">mingw64 mingw-w64-x86_64-gcc 7.3.0-1
</span></span><span class="line"><span class="cl">mingw64 mingw-w64-x86_64-gcc-ada 7.3.0-1
</span></span><span class="line"><span class="cl">mingw64 mingw-w64-x86_64-gcc-fortran 7.3.0-1
</span></span><span class="line"><span class="cl">mingw64 mingw-w64-x86_64-gcc-libgfortran 7.3.0-1
</span></span><span class="line"><span class="cl">mingw64 mingw-w64-x86_64-gcc-libs 7.3.0-1
</span></span><span class="line"><span class="cl">mingw64 mingw-w64-x86_64-gcc-objc 7.3.0-1
</span></span><span class="line"><span class="cl">msys gcc 6.4.0-3
</span></span><span class="line"><span class="cl">msys gcc-fortran 6.4.0-3
</span></span><span class="line"><span class="cl">msys gcc-libs 6.4.0-3 [インストール済み]
</span></span><span class="line"><span class="cl">msys mingw-w64-cross-gcc 6.4.0-2
</span></span></code></pre></div><p>どれを使うかはユーザ次第だが,今回は <a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> 内ではなく Windows 環境で動作するアプリケーションを作りたいので, <code>mingw32</code> および <code>mingw64</code> リポジトリのものを導入する。</p>
<ul>
<li><a href="http://qiita.com/chromabox/items/fd07bad3f426101fc4a6">Windowsでgccなどを利用できるMSYS2の環境設定など - Qiita</a></li>
</ul>
<h2>gcc のインストール</h2>
<p>では gcc のインストールを始めよう。
今回は以下のパッケージグループを導入する。</p>
<ul>
<li><code>base-devel</code></li>
<li><code>mingw-w64-i686-toolchain</code></li>
<li><code>mingw-w64-x86_64-toolchain</code></li>
</ul>
<p>ものすごく分かりにくいが <code>mingw-w64-x86_64-toolchain</code> が 64bit 用である。
コマンドラインは以下の通り(ログがかなり長くなるので省略)。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ pacman -S base-devel mingw-w64-i686-toolchain mingw-w64-x86_64-toolchain
</span></span></code></pre></div><h3>gcc の動作確認</h3>
<p>まずは 32bit 版の動作確認。
<code>mingw32.exe</code> を起動,または 環境変数 <code>MSYSTEM</code> に <code>MINGW32</code> をセットして shell を起動する。
<a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-1/" title="MSYS2 による gcc 開発環境の構築 ― インストールから初期化処理まで">前回</a>紹介した <a href="https://conemu.github.io/" title="ConEmu - Handy Windows Terminal">ConEmu</a> を使うのであれば以下のシーケンスで起動できる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">set MSYSTEM=MINGW32 & chcp 65001 & C:\msys64\usr\bin\bash.exe --login -i
</span></span></code></pre></div><p>gcc を起動して動作確認。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ gcc -v
</span></span><span class="line"><span class="cl">Using built-in specs.
</span></span><span class="line"><span class="cl">COLLECT_GCC=C:\msys64\mingw32\bin\gcc.exe
</span></span><span class="line"><span class="cl">COLLECT_LTO_WRAPPER=C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.3.0/lto-wrapper.exe
</span></span><span class="line"><span class="cl">Target: i686-w64-mingw32
</span></span><span class="line"><span class="cl">Configured with: ../gcc-7.3.0/configure --prefix=/mingw32 --with-local-prefix=/mingw32/local --build=i686-w64-mingw32 --host=i686-w64-mingw32 --target=i686-w64-mingw32 --with-native-system-header-dir=/mingw32/i686-w64-mingw32/include --libexecdir=/mingw32/lib --enable-bootstrap --with-arch=i686 --with-tune=generic --enable-languages=c,lto,c++,objc,obj-c++,fortran,ada --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-time=yes --enable-libstdcxx-filesystem-ts=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw32 --with-mpfr=/mingw32 --with-mpc=/mingw32 --with-isl=/mingw32 --with-pkgversion='Rev1, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld --disable-sjlj-exceptions --with-dwarf2
</span></span><span class="line"><span class="cl">Thread model: posix
</span></span><span class="line"><span class="cl">gcc version 7.3.0 (Rev1, Built by MSYS2 project)
</span></span></code></pre></div><p>次に 64bit 版の動作確認。
動作確認には <code>mingw64.exe</code> を起動,または 環境変数 <code>MSYSTEM</code> に <code>MINGW64</code> をセットして shell を起動する。
<a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-1/" title="MSYS2 による gcc 開発環境の構築 ― インストールから初期化処理まで">前回</a>紹介した <a href="https://conemu.github.io/" title="ConEmu - Handy Windows Terminal">ConEmu</a> を使うのであれば以下のシーケンスで起動できる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">set MSYSTEM=MINGW64 & chcp 65001 & C:\msys64\usr\bin\bash.exe --login -i
</span></span></code></pre></div><p>gcc を起動して動作確認。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ gcc -v
</span></span><span class="line"><span class="cl">Using built-in specs.
</span></span><span class="line"><span class="cl">COLLECT_GCC=C:\msys64\mingw64\bin\gcc.exe
</span></span><span class="line"><span class="cl">COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe
</span></span><span class="line"><span class="cl">Target: x86_64-w64-mingw32
</span></span><span class="line"><span class="cl">Configured with: ../gcc-7.3.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,objc,obj-c++,fortran,ada --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-time=yes --enable-libstdcxx-filesystem-ts=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev1, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld
</span></span><span class="line"><span class="cl">Thread model: posix
</span></span><span class="line"><span class="cl">gcc version 7.3.0 (Rev1, Built by MSYS2 project)
</span></span></code></pre></div><p>ターゲット名が <code>x86_64-w64-mingw32</code> となっていて非常に分かりにくいが, mingw32 版では <code>i686-w64-mingw32</code> となっているので,なんとか区別して欲しい。</p>
<h2>gcc のスレッドモデルと例外処理</h2>
<p><a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> で提供される gcc のスレッドモデルと例外処理は以下のようになっているらしい。</p>
<figure lang="en">
<blockquote>
<q>On MSYS2 I maintain only one configuration:<br>
32-bit: threads=posix, exceptions=dwarf<br>
64-bit: threads=posix, exceptions=seh</q>
</blockquote>
<figcaption><div>via <q><a href="http://sourceforge.net/p/msys2/tickets/24/">MSYS2 / Tickets / #24 Mingw64 downloads through msys2?</a></q></div></figcaption>
</figure>
<p><a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> のベースになっている <a href="http://mingw-w64.org/" title="Mingw-w64 - GCC for Windows 64 & 32 bits [mingw-w64]">MinGW-w64</a> のスレッドモデルには win32 と posix が提供されている。 win32 は Windows ネイティブなスレッド関連関数を使っているため速いが, C++11 の thread, mutex, future はサポートしていないらしい。
一方,例外処理には SJLJ(SetJump/LongJump), <a href="http://ja.wikipedia.org/wiki/DWARF">DWARF</a>2, SEH(Structured Exception Handling)があり,この中では Windows ネイティブな SEH が一番速い。ただし SEH は 64bit gcc でしか対応していないため 32bit 環境では使えない<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</p>
<p><a href="http://mingw-w64.org/" title="Mingw-w64 - GCC for Windows 64 & 32 bits [mingw-w64]">MinGW-w64</a> のもうひとつの実装である <a href="http://tdm-gcc.tdragon.net/" title="TDM-GCC">TDM-GCC</a> では,スレッドモデルには posix,例外処理には SJLJ(32bit)または SEH(64bit)が設定されているようだ。</p>
<figure lang="en">
<blockquote>
<q>TDM-GCC includes a pthreads emulation layer for Microsoft Windows systems, called "winpthreads". This lets you use std::thread and other C++11 concurrency features in your programs, out of the box.<br>
[...]<br>
64-bit binaries use "SEH", which stands for "Structured Exception Handling".<br>
[...]<br>
If you create a 32-bit binary with the TDM64 edition, it will use SJLJ exception handling. DW2 exception handling is not available in this edition.</q>
</blockquote>
<figcaption><div>via <q><a href="http://tdm-gcc.tdragon.net/quirks">TDM-GCC : Quirks</a></q></div></figcaption>
</figure>
<p><a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-3/" title="MSYS2 による gcc 開発環境の構築 ― pgpdump をビルドする">次回</a>は実際にビルドを行う。</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>ちなみにオリジナルの <a href="http://mingw-w64.org/" title="Mingw-w64 - GCC for Windows 64 & 32 bits [mingw-w64]">MinGW-w64</a> ではインストール時にスレッドモデルと例外処理を選択できる。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
MSYS2 による gcc 開発環境の構築 ― MSYS2 のインストールから初期化処理まで
tag:text.Baldanders.info,2016-03-01:/remark/2016/03/gcc-msys2-1/
2016-03-01T13:02:41+00:00
2019-07-01T13:48:09+00:00
MSYS の後継(?)とも言える MSYS2 では開発環境を 32bit と 64bit で併設できるらしい。
Spiegel
https://baldanders.info/profile/
<p>これは Qiita の以下の記事からの再構成である。</p>
<ul>
<li><a href="http://qiita.com/spiegel-im-spiegel/items/ba4e8d2418bdfe0c8049">MSYS2 による gcc 開発環境の構築 - Qiita</a></li>
<li><a href="http://qiita.com/spiegel-im-spiegel/items/877cbfb970509b272fc1">MSYS2 による gcc 開発環境の構築(2) - Qiita</a></li>
</ul>
<p>ここでは以下の3部構成になっている。</p>
<ol>
<li><a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-1/">MSYS2 のインストールから初期化処理まで</a> (← イマココ)</li>
<li><a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-2/">gcc パッケージ群の導入</a></li>
<li><a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-3/">pgpdump をビルドする</a></li>
</ol>
<h2>gcc と MSYS2</h2>
<p>MSYS の後継(?)とも言える <a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> では gcc を含む開発環境を 32bit と 64bit で併設できるらしい。</p>
<ul>
<li><a href="http://msys2.github.io/">MSYS2 installer</a></li>
<li><a href="https://github.com/msys2">msys2</a> : GitHub ページ</li>
</ul>
<p>今回は <a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> を使って gcc 開発環境を構築する。</p>
<p>なお,単に gcc が欲しいのであれば <a href="http://mingw-w64.org/" title="Mingw-w64 - GCC for Windows 64 & 32 bits [mingw-w64]">MinGW-w64</a> から Windows 用のバイナリを取得するほうがお勧めである<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</p>
<ul>
<li><a href="https://text.baldanders.info/remark/2018/03/mingw-w64/">MinGW-w64 を導入する</a></li>
</ul>
<p>そうではなく autotools などを含む UNIX 互換の環境が必要なのであれば,今回紹介する <a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> が適切と思われる(UNIX 系のコマンドを Windows にポーティングする場合など)。
また開発環境は要らないが UNIX 互換の動作環境が欲しいだけなら <a href="http://git-for-windows.github.io/" title="Git for Windows">Git for Windows</a> を導入する手もある<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>。</p>
<h2>MSYS2 のインストール</h2>
<p>では早速 64bit 版インストーラ(今回は <code>msys2-x86_64-20161025.exe</code> を使用)でインストールを行ってみる。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://photo.baldanders.info/flickr/25210363812/"><img src="https://photo.baldanders.info/flickr/image/25210363812_m.png" srcset="https://photo.baldanders.info/flickr/image/25210363812_m.png 500w" sizes="(min-width:600px) 500px, 80vw" alt="MSYS2 Installing (1)" loading="lazy"></a><figcaption><div><a href="https://photo.baldanders.info/flickr/25210363812/">MSYS2 Installing (1)</a></div></figcaption>
</figure>
<p>わお! 日本語だ。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://photo.baldanders.info/flickr/25032985150/"><img src="https://photo.baldanders.info/flickr/image/25032985150_m.png" srcset="https://photo.baldanders.info/flickr/image/25032985150_m.png 500w" sizes="(min-width:600px) 500px, 80vw" alt="MSYS2 Installing (2)" loading="lazy"></a><figcaption><div><a href="https://photo.baldanders.info/flickr/25032985150/">MSYS2 Installing (2)</a></div></figcaption>
</figure>
<figure style='margin:0 auto;text-align:center;'><a href="https://photo.baldanders.info/flickr/24960938719/"><img src="https://photo.baldanders.info/flickr/image/24960938719_m.png" srcset="https://photo.baldanders.info/flickr/image/24960938719_m.png 500w" sizes="(min-width:600px) 500px, 80vw" alt="MSYS2 Installing (3)" loading="lazy"></a><figcaption><div><a href="https://photo.baldanders.info/flickr/24960938719/">MSYS2 Installing (3)</a></div></figcaption>
</figure>
<figure style='margin:0 auto;text-align:center;'><a href="https://photo.baldanders.info/flickr/25235500391/"><img src="https://photo.baldanders.info/flickr/image/25235500391_m.png" srcset="https://photo.baldanders.info/flickr/image/25235500391_m.png 500w" sizes="(min-width:600px) 500px, 80vw" alt="MSYS2 Installing (5)" loading="lazy"></a><figcaption><div><a href="https://photo.baldanders.info/flickr/25235500391/">MSYS2 Installing (5)</a></div></figcaption>
</figure>
<figure style='margin:0 auto;text-align:center;'><a href="https://photo.baldanders.info/flickr/25235500391/"><img src="https://photo.baldanders.info/flickr/image/25235500391_m.png" srcset="https://photo.baldanders.info/flickr/image/25235500391_m.png 500w" sizes="(min-width:600px) 500px, 80vw" alt="MSYS2 Installing (5)" loading="lazy"></a><figcaption><div><a href="https://photo.baldanders.info/flickr/25235500391/">MSYS2 Installing (5)</a></div></figcaption>
</figure>
<p>このまま「完了」するとターミナル(<a href="https://mintty.github.io/" title="Mintty — Cygwin Terminal emulator">mintty</a>)が起動する。
のだが,ここでちょっと寄り道する。
「MSYS2 64bit を実行中」のチェックを外して「完了」しよう。</p>
<h3>MSYS2 起動モード</h3>
<p><a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> には3つの起動モジュールがある(64bit 版をインストールした場合)。</p>
<ul>
<li><code>mingw32.exe</code></li>
<li><code>mingw64.exe</code></li>
<li><code>msys2.exe</code></li>
</ul>
<p>またそれぞれに ini ファイルが用意されている。
たとえば <code>msys2.exe</code> であればこんな感じ。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="c1">#MSYS=winsymlinks:nativestrict</span>
</span></span><span class="line"><span class="cl"><span class="c1">#MSYS=error_start:mingw64/bin/qtcreator.exe|-debug|<process-id></span>
</span></span><span class="line"><span class="cl"><span class="c1">#CHERE_INVOKING=1</span>
</span></span><span class="line"><span class="cl"><span class="c1">#MSYS2_PATH_TYPE=inherit</span>
</span></span><span class="line"><span class="cl"><span class="na">MSYSTEM</span><span class="o">=</span><span class="s">MSYS</span>
</span></span></code></pre></div><p>どうやら ini ファイルの内容をそのまま環境変数として渡しているようだ。
このうち <code>MSYSTEM</code> に注目すると以下のようになっている。</p>
<table>
<thead>
<tr>
<th style="text-align:left">バッチファイル</th>
<th style="text-align:left">セットする値</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>mingw32.exe</code></td>
<td style="text-align:left"><code>MINGW32</code></td>
</tr>
<tr>
<td style="text-align:left"><code>mingw64.exe</code></td>
<td style="text-align:left"><code>MINGW64</code></td>
</tr>
<tr>
<td style="text-align:left"><code>msys2.exe</code></td>
<td style="text-align:left"><code>MSYS</code></td>
</tr>
</tbody>
</table>
<p><code>MSYSTEM</code> は <code>/etc/profile</code> 内で参照される。
以下に <code>/etc/profile</code> の一部を引用する。</p>
<pre tabindex="0"><code class="language-test" data-lang="test">MSYS2_PATH="/usr/local/bin:/usr/bin:/bin"
MANPATH='/usr/local/man:/usr/share/man:/usr/man:/share/man'
INFOPATH='/usr/local/info:/usr/share/info:/usr/info:/share/info'
case "${MSYS2_PATH_TYPE:-minimal}" in
strict)
# Do not inherit any path configuration, and allow for full customization
# of external path. This is supposed to be used in special cases such as
# debugging without need to change this file, but not daily usage.
unset ORIGINAL_PATH
;;
inherit)
# Inherit previous path. Note that this will make all of the Windows path
# available in current shell, with possible interference in project builds.
ORIGINAL_PATH="${ORIGINAL_PATH:-${PATH}}"
;;
*)
# Do not inherit any path configuration but configure a default Windows path
# suitable for normal usage with minimal external interference.
WIN_ROOT="$(PATH=${MSYS2_PATH} cygpath -Wu)"
ORIGINAL_PATH="${WIN_ROOT}/System32:${WIN_ROOT}:${WIN_ROOT}/System32/Wbem:${WIN_ROOT}/System32/WindowsPowerShell/v1.0/"
esac
unset MINGW_MOUNT_POINT
source '/etc/msystem'
case "${MSYSTEM}" in
MINGW32)
MINGW_MOUNT_POINT="${MINGW_PREFIX}"
PATH="${MINGW_MOUNT_POINT}/bin:${MSYS2_PATH}${ORIGINAL_PATH:+:${ORIGINAL_PATH}}"
PKG_CONFIG_PATH="${MINGW_MOUNT_POINT}/lib/pkgconfig:${MINGW_MOUNT_POINT}/share/pkgconfig"
ACLOCAL_PATH="${MINGW_MOUNT_POINT}/share/aclocal:/usr/share/aclocal"
MANPATH="${MINGW_MOUNT_POINT}/share/man:${MANPATH}"
;;
MINGW64)
MINGW_MOUNT_POINT="${MINGW_PREFIX}"
PATH="${MINGW_MOUNT_POINT}/bin:${MSYS2_PATH}${ORIGINAL_PATH:+:${ORIGINAL_PATH}}"
PKG_CONFIG_PATH="${MINGW_MOUNT_POINT}/lib/pkgconfig:${MINGW_MOUNT_POINT}/share/pkgconfig"
ACLOCAL_PATH="${MINGW_MOUNT_POINT}/share/aclocal:/usr/share/aclocal"
MANPATH="${MINGW_MOUNT_POINT}/share/man:${MANPATH}"
;;
*)
PATH="${MSYS2_PATH}:/opt/bin${ORIGINAL_PATH:+:${ORIGINAL_PATH}}"
PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/share/pkgconfig:/lib/pkgconfig"
esac
</code></pre><p><code>MINGW32</code> または <code>MINGW64</code> の場合は,新たに <code>/mingw32</code> または <code>/mingw64</code> がパス等に追加されているのがお分かりだろうか。</p>
<h3>ConEmu から MSYS2 bash を起動する</h3>
<p>以上から,環境変数 <code>MSYSTEM</code> を適切に設定すれば <a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> の起動モジュールを介さずに shell を起動しても構わないことが分かる。
ここでは <a href="https://conemu.github.io/" title="ConEmu - Handy Windows Terminal">ConEmu</a> から <a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> の bash を起動することを考える。
以下のように Tasks 設定で <a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> の bash を起動するシーケンスを設定すればよい。</p>
<figure style='margin:0 auto;text-align:center;'><a href="https://photo.baldanders.info/flickr/22388493089/"><img src="https://photo.baldanders.info/flickr/image/22388493089_m.png" srcset="https://photo.baldanders.info/flickr/image/22388493089_m.png 500w" sizes="(min-width:600px) 500px, 80vw" alt="ConEmu Setting" loading="lazy"></a><figcaption><div><a href="https://photo.baldanders.info/flickr/22388493089/">ConEmu Setting</a></div></figcaption>
</figure>
<p>起動シーケンスは以下のとおり。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">set MSYSTEM=MSYS & chcp 65001 & C:\msys64\usr\bin\bash.exe --login -i -new_console:C:"C:\msys64\msys2.ico"
</span></span></code></pre></div><p>前半で環境変数とコードページ(65001 は UTF-8)を設定し,後半で実際に bash を呼び出している。</p>
<h2>初期設定</h2>
<p>では本題に戻ろう。
<code>msys2.exe</code> または環境変数 <code>MSYSTEM</code> に <code>MSYS</code> をセットして shell を起動し,まずはコア・パッケージを最新のものに更新する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ pacman -Syu
</span></span><span class="line"><span class="cl">:: パッケージデータベースの同期中...
</span></span><span class="line"><span class="cl"> mingw32 232.6 KiB 720K/s 00:00 [##################] 100%
</span></span><span class="line"><span class="cl"> mingw32.sig 96.0 B 93.8K/s 00:00 [##################] 100%
</span></span><span class="line"><span class="cl"> mingw64 231.6 KiB 740K/s 00:00 [##################] 100%
</span></span><span class="line"><span class="cl"> mingw64.sig 96.0 B 0.00B/s 00:00 [##################] 100%
</span></span><span class="line"><span class="cl"> msys 130.7 KiB 165K/s 00:01 [##################] 100%
</span></span><span class="line"><span class="cl"> msys.sig 96.0 B 93.8K/s 00:00 [##################] 100%
</span></span><span class="line"><span class="cl">==> Checking if there are critical packages to upgrade.
</span></span><span class="line"><span class="cl">pacman 5.0.0.6348.cc5a8f1-1 -> 5.0.1.6388.dcb2397-1
</span></span><span class="line"><span class="cl">==> Core packages require updating.
</span></span><span class="line"><span class="cl">==> Please close all other MSYS2 derived windows (e.g. terminal
</span></span><span class="line"><span class="cl">==> windows, Bash sessions, etc) before proceeding.
</span></span><span class="line"><span class="cl">==> 警告: When the update has completed, you MUST close this MSYS2 window
</span></span><span class="line"><span class="cl">==> 警告: (use Alt-F4 or red [ X ], etc.), rather than 'exit'!!!
</span></span><span class="line"><span class="cl">Press [Enter] key when ready to start update...
</span></span><span class="line"><span class="cl">==> Updating core packages...
</span></span><span class="line"><span class="cl">警告: bash-4.3.042-4 は最新です -- スキップ
</span></span><span class="line"><span class="cl">警告: msys2-runtime-2.4.1.16860.40c26fc-1 は最新です -- スキップ
</span></span><span class="line"><span class="cl">依存関係を解決しています...
</span></span><span class="line"><span class="cl">衝突するパッケージがないか確認しています...
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">パッケージ (2) msys2-runtime-devel-2.4.1.16860.40c26fc-1 pacman-5.0.1.6388.dcb2397-1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">合計ダウンロード容量: 10.34 MiB
</span></span><span class="line"><span class="cl">合計インストール容量: 54.72 MiB
</span></span><span class="line"><span class="cl">最終的なアップグレード容量: 21.12 MiB
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">:: インストールを行いますか? [Y/n]
</span></span><span class="line"><span class="cl">:: パッケージを取得します ...
</span></span><span class="line"><span class="cl"> pacman-5.0.1.6388.dcb2397-1-x86_64 6.8 MiB 1248K/s 00:06 [##################] 100%
</span></span><span class="line"><span class="cl"> msys2-runtime-devel-2.4.1.16860.40c26fc-1-x86_64 3.5 MiB 1027K/s 00:04 [##################] 100%
</span></span><span class="line"><span class="cl">(2/2) キーリングのキーを確認 [##################] 100%
</span></span><span class="line"><span class="cl">(2/2) パッケージの整合性をチェック [##################] 100%
</span></span><span class="line"><span class="cl">(2/2) パッケージファイルのロード [##################] 100%
</span></span><span class="line"><span class="cl">(2/2) ファイルの衝突をチェック [##################] 100%
</span></span><span class="line"><span class="cl">(2/2) 空き容量を確認 [##################] 100%
</span></span><span class="line"><span class="cl">:: パッケージの変更を処理しています...
</span></span><span class="line"><span class="cl">(1/2) 更新 pacman [##################] 100%
</span></span><span class="line"><span class="cl">(2/2) インストール msys2-runtime-devel [##################] 100%
</span></span><span class="line"><span class="cl">Please close this window.
</span></span></code></pre></div><p>おや。
ツールが更新された。
<code>pacman -Syu</code> で更新があった場合,いったん shell を閉じて起動し直す。
このとき <code>exit</code> コマンドで終了するのではなく,強制終了する。</p>
<p>Shell を再起動したら他のインストール済みのパッケージを更新しよう。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ pacman -Su
</span></span><span class="line"><span class="cl">:: システム全体の更新を開始...
</span></span><span class="line"><span class="cl">依存関係を解決しています...
</span></span><span class="line"><span class="cl">衝突するパッケージがないか確認しています...
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">パッケージ (7) curl-7.47.1-1 file-5.25-1 gnupg-1.4.20-1 libcurl-7.47.1-1 libopenssl-1.0.2.f-1
</span></span><span class="line"><span class="cl"> mintty-1~2.2.3-1 openssl-1.0.2.f-1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">合計ダウンロード容量: 4.40 MiB
</span></span><span class="line"><span class="cl">合計インストール容量: 20.60 MiB
</span></span><span class="line"><span class="cl">最終的なアップグレード容量: 0.12 MiB
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">:: インストールを行いますか? [Y/n] y
</span></span><span class="line"><span class="cl">:: パッケージを取得します...
</span></span><span class="line"><span class="cl"> libopenssl-1.0.2.f-1-x86_64 815.3 KiB 796K/s 00:01 [##################] 100%
</span></span><span class="line"><span class="cl"> openssl-1.0.2.f-1-x86_64 1336.9 KiB 977K/s 00:01 [##################] 100%
</span></span><span class="line"><span class="cl"> libcurl-7.47.1-1-x86_64 185.0 KiB 269K/s 00:01 [##################] 100%
</span></span><span class="line"><span class="cl"> curl-7.47.1-1-x86_64 595.3 KiB 855K/s 00:01 [##################] 100%
</span></span><span class="line"><span class="cl"> file-5.25-1-x86_64 396.5 KiB 767K/s 00:01 [##################] 100%
</span></span><span class="line"><span class="cl"> gnupg-1.4.20-1-x86_64 1026.9 KiB 672K/s 00:02 [##################] 100%
</span></span><span class="line"><span class="cl"> mintty-1~2.2.3-1-x86_64 147.2 KiB 436K/s 00:00 [##################] 100%
</span></span><span class="line"><span class="cl">(7/7) キーリングのキーを確認 [##################] 100%
</span></span><span class="line"><span class="cl">(7/7) パッケージの整合性をチェック [##################] 100%
</span></span><span class="line"><span class="cl">(7/7) パッケージファイルのロード [##################] 100%
</span></span><span class="line"><span class="cl">(7/7) ファイルの衝突をチェック [##################] 100%
</span></span><span class="line"><span class="cl">(7/7) 空き容量を確認 [##################] 100%
</span></span><span class="line"><span class="cl">:: パッケージの変更を処理しています...
</span></span><span class="line"><span class="cl">(1/7) 更新 libopenssl [##################] 100%
</span></span><span class="line"><span class="cl">(2/7) 更新 openssl [##################] 100%
</span></span><span class="line"><span class="cl">(3/7) 更新 libcurl [##################] 100%
</span></span><span class="line"><span class="cl">(4/7) 更新 curl [##################] 100%
</span></span><span class="line"><span class="cl">(5/7) 更新 file [##################] 100%
</span></span><span class="line"><span class="cl">(6/7) 更新 gnupg [##################] 100%
</span></span><span class="line"><span class="cl">gpg: /etc/pacman.d/gnupg/trustdb.gpg: 信用データベースができました
</span></span><span class="line"><span class="cl">gpg: 究極的に信用する鍵が見つかりません
</span></span><span class="line"><span class="cl">gpg: Generating pacman keyring master key...
</span></span><span class="line"><span class="cl">gpg: skipping control `%no-protection' ()
</span></span><span class="line"><span class="cl">.+++++
</span></span><span class="line"><span class="cl">+++++
</span></span><span class="line"><span class="cl">gpg: 鍵CD81616Cを究極的に信用するよう記録しました
</span></span><span class="line"><span class="cl">gpg: Done
</span></span><span class="line"><span class="cl">==> 信用データベースを更新...
</span></span><span class="line"><span class="cl">gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
</span></span><span class="line"><span class="cl">gpg: 深さ: 0 有効性: 1 署名: 0 信用: 0-, 0q, 0n, 0m, 0f, 1u
</span></span><span class="line"><span class="cl">==> msys2.gpg からキーを追加...
</span></span><span class="line"><span class="cl">gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
</span></span><span class="line"><span class="cl">gpg: 深さ: 0 有効性: 1 署名: 0 信用: 0-, 0q, 0n, 0m, 0f, 1u
</span></span><span class="line"><span class="cl">==> キーリングの信頼されたキーに署名...
</span></span><span class="line"><span class="cl"> -> キーに署名 D55E7A6D7CE9BA1587C0ACACF40D263ECA25678A...
</span></span><span class="line"><span class="cl"> -> キーに署名 123D4D51A1793859C2BE916BBBE514E53E0D0813...
</span></span><span class="line"><span class="cl"> -> キーに署名 B91BCF3303284BF90CC043CA9F418C233E652008...
</span></span><span class="line"><span class="cl"> -> キーに署名 9DD0D4217D75A33B896159E6DA7EF2ABAEEA755C...
</span></span><span class="line"><span class="cl">==> 所有者信頼値をインポート...
</span></span><span class="line"><span class="cl">gpg: setting ownertrust to 4
</span></span><span class="line"><span class="cl">gpg: setting ownertrust to 4
</span></span><span class="line"><span class="cl">gpg: setting ownertrust to 4
</span></span><span class="line"><span class="cl">gpg: inserting ownertrust of 4
</span></span><span class="line"><span class="cl">==> 信用データベースを更新...
</span></span><span class="line"><span class="cl">gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
</span></span><span class="line"><span class="cl">gpg: 深さ: 0 有効性: 1 署名: 4 信用: 0-, 0q, 0n, 0m, 0f, 1u
</span></span><span class="line"><span class="cl">gpg: 深さ: 1 有効性: 4 署名: 3 信用: 0-, 0q, 0n, 4m, 0f, 0u
</span></span><span class="line"><span class="cl">gpg: 深さ: 2 有効性: 3 署名: 0 信用: 3-, 0q, 0n, 0m, 0f, 0u
</span></span><span class="line"><span class="cl">(7/7) 更新 mintty [##################] 100%
</span></span></code></pre></div><p>これで初期化は終了。
<a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-2/" title="MSYS2 による gcc 開発環境の構築 ― gcc パッケージ群の導入">次回</a>へ続く。</p>
<h2>【おまけ1】 ホームディレクトリについて</h2>
<p><a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> のホームディレクトリは,インストールフォルダ直下の <code>home\username</code> フォルダになるが, Windows 上で自前のホームディレクトリを作っている場合は,その場所を <code>/etc/fstab</code> でマウントする手もある。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">C:/home /home
</span></span></code></pre></div><p>この場合,元のフォルダにある <code>.profile</code> ファイル等の移動も忘れないこと。</p>
<h2>【おまけ2】 Proxy サーバ越しのアクセス</h2>
<p>Proxy サーバ越しに curl を使う場合は <code>~/.curlrc</code> に以下の記述を追加する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">proxy-user = "username:password"
</span></span><span class="line"><span class="cl">proxy = "http://proxy.example.com:8080"
</span></span></code></pre></div><p>パッケージ管理コマンドである <code>pacman</code> を Proxy サーバ越しに使う場合は,上述の通りに curl の設定をしたうえで <code>/etc/pacman.conf</code> ファイルの以下の記述を探し,コメントを解除する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">#XferCommand = /usr/bin/curl -C - -f %u > %o
</span></span></code></pre></div><p>GnuPG で鍵サーバにアクセスする場合も, Proxy サーバ越しにアクセスするのであれば, <code>~/.gnupg/gpg.conf</code> に以下のオプションを追記する。</p>
<pre tabindex="0"><code class="language-text:gpg.conf" data-lang="text:gpg.conf">keyserver-options http-proxy=http://username:password@proxy.example.com:8080/
</code></pre><p>実は <code>/etc/pacman.d/gnupg</code> ディレクトリにも <code>gpg.conf</code> ファイルがあって <code>pacman-key</code> コマンドはこちらを見てるっぽい<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ pacman-key -l
</span></span><span class="line"><span class="cl">/etc/pacman.d/gnupg/pubring.gpg
</span></span><span class="line"><span class="cl">-------------------------------
</span></span><span class="line"><span class="cl">pub 2048R/CD81616C 2016-03-01
</span></span><span class="line"><span class="cl">uid Pacman Keyring Master Key <pacman@localhost>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">pub 2048R/CA25678A 2014-09-28
</span></span><span class="line"><span class="cl">uid Alexey Pavlov (Alexpux) <alexey.pawlow@gmail.com>
</span></span><span class="line"><span class="cl">sub 2048R/2BBF340E 2014-09-28
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">pub 4096R/AEEA755C 2014-10-04
</span></span><span class="line"><span class="cl">uid Martell Malone (martell) <martellmalone@gmail.com>
</span></span><span class="line"><span class="cl">sub 4096R/2A292C03 2014-10-04
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">pub 4096R/3E0D0813 2014-09-28
</span></span><span class="line"><span class="cl">uid Ray Donnelly (MSYS2 Developer - master key) <mingw.android@gmail.com>
</span></span><span class="line"><span class="cl">sub 4096R/8603AA9D 2014-09-28
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">pub 2048R/3E652008 2014-09-29
</span></span><span class="line"><span class="cl">uid Ignacio Casal Quinteiro <icquinteiro@gmail.com>
</span></span><span class="line"><span class="cl">sub 2048R/64D62A76 2014-09-29
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">pub 2048D/A47D45A1 2013-11-11
</span></span><span class="line"><span class="cl">uid Alexey Pavlov (Alexpux) <alexpux@gmail.com>
</span></span><span class="line"><span class="cl">sub 2048g/31CF7700 2013-11-11
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">pub 4096R/2C51581E 2015-07-22
</span></span><span class="line"><span class="cl">uid Martell Malone (MSYS2 Developer) <martellmalone@gmail.com>
</span></span><span class="line"><span class="cl">sub 4096R/282D6707 2015-07-22
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">pub 4096R/4CA56930 2014-09-28
</span></span><span class="line"><span class="cl">uid Ray Donnelly (MSYS2 Developer) <mingw.android@gmail.com>
</span></span><span class="line"><span class="cl">sub 4096R/576CF231 2014-09-28
</span></span></code></pre></div><p>もしかしたらこちらの <code>gpg.conf</code> ファイルも修正する必要があるかもしれない(未確認)。</p>
<h2>関連するブックマーク</h2>
<ul>
<li><a href="http://qiita.com/Ted-HM/items/4f2feb9fdacb6c72083c">MSYS2で快適なターミナル生活 - Qiita</a></li>
</ul>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>この記事では今まで <a href="http://tdm-gcc.tdragon.net/" title="TDM-GCC">TDM-GCC</a> を勧めてきたが,どうも何年もメンテナンスされていないようだ。したがって今後は <a href="http://mingw-w64.org/" title="Mingw-w64 - GCC for Windows 64 & 32 bits [mingw-w64]">MinGW-w64</a> を推すことにする。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p><a href="http://git-for-windows.github.io/" title="Git for Windows">Git for Windows</a> には bash などの <a href="http://msys2.github.io/" title="MSYS2 installer">MSYS2</a> サブセットを含んでいるため, <a href="http://git-for-windows.github.io/" title="Git for Windows">Git for Windows</a> の bash (通称 git bash)を起動することで UNIX 互換の動作環境を得られる。なお <a href="http://git-for-windows.github.io/" title="Git for Windows">Git for Windows</a> の環境は git を動かすための最小限のツールしか入っていないため, Git for Windows SDK も併せて導入し,その中の pacman コマンドで必要に応じてのツールを追加する。 pacman については<a href="https://text.baldanders.info/remark/2016/03/gcc-msys2-2/" title="MSYS2 による gcc 開発環境の構築 ― gcc パッケージ群の導入">次回</a>説明する。 <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3">
<p>ちなみに <code>/etc/pacman.d/gnupg</code> ディレクトリにある鍵束を GnuPG から直接見る場合には <code>gpg --homedir /etc/pacman.d/gnupg --list-keys</code> とする。 <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>