68
64

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

cやc++をビルドしたいので ./configureスクリプトの作り方調べた

Last updated at Posted at 2014-07-13

c、c++ でちょっとしたコマンドラインツール作ろうと思ったが、全くやったことがなかったのでビルドツールの調査からするはめとなった。

cやc++をビルドするには

cやc++のプログラムは、必要なファイル(ソース、ヘッダ、リンクするライブラリ)をコンパイル時にすべて指定してあげる必要がある。
これを、gcc等にコマンドライン引数として全て手打ちするのは大変だし、さらに、時にはgccを何度か実行して、できたものをリンクする必要があるので、必要な操作をファイルに書いておいて自動化したいのが人情。
makeは、皆のその気持ちに応えるためのツールで、必要な操作や依存ファイル、成果物のパスなどをまとめてMakefileというファイルに記述する仕組みになっている。

Makefileさえあれば、make って打ち込むとビルドすることができる。
Makefileさえあれば……。
ただし、Makefileに記述してある依存ライブラリのパスなどは、環境によって異なるため、環境によって正しいMakefileが変わってしまう。

そこで、環境ごとに正しいMakefileを生成してあげるスクリプトが、./configure
これはただのシェルスクリプトなのだが、環境ごとに必要なファイルのチェックをする等の機能の充実した シェルスクリプトを手で作成するのはめっちゃむずいので、自動で生成する。

ビルドツール色々

autoconf

autoconfは、GNUのプロジェクト。 configureスクリプトを自動で生成するツール。

configure.ac という設定ファイルを作成し、autoconf を実行することで、 configure が生成される。
という理解だったが、実際にはいくつか準備が必要だった。

  • Makefile を生成するためには、テンプレートの Makefile.in が必要。
  • Makefile.in は、必要な値が変数になったMakefileのような感じで、手で書きたくないっす。となる。
  • Makefile.am は、 Makefile.in を自動生成するための、ものすごく単純な誰でも手で書けるファイル。実際に編集するのはこれ。作成したら、 automake と実行すると、 Makefile.in が生成される。これと configure スクリプトを配布してあげると、皆が ./configure && make ってできる。
  • その他、
    • 設定をまとめた config.h を生成するための config.h.in等々、Makefile意外の成果物を作る仕組みある。

今回は僕はこれを使いました。
日本語情報を色々参考にさせていただきました。
http://d.hatena.ne.jp/fut_nis/20090624/1245849007

cmake

おそらくautoconfより後発のツールだと思われる。
Makefileのことはまったく考えなくても、CamkeLists.txt という独自形式のファイルに、必要なソース等いくつかの設定をしておいて、cmake って実行するだけでビルドが実行できる。
また、windowsなどにも対応しておるようだ。

cmakeには、依存ライブラリを管理する パッケージ という仕組みがあるが、自分で無名のツールのパッケージを作成したり、利用するやり方が正直よくわからなかったので、今回は使いませんでした。

scons

http://www.scons.org/
cmakeと競合するツールのようだがあまり調べてない。

waf

ビルド設定をpythonスクリプトとして記述できるビルドツール。
Linux/Unix、windowsに加えMacOSのxcodeプロジェクトも生成できるようだ。
Linuxならpythonは絶対入ってるだろ! という前提があるのでけっこう良いのかもしれない。

gyp

https://code.google.com/p/gyp/
Google製で、node.jsプロジェクトがwafからこれに乗り換えたというのを読んで知った。
設定ファイルがJSON(厳密にはJSON拡張)なので自分にはわかりやすかった。
node.jsのネイティブアドオンを書くなら必ずこれを使うことになる。

僕は今回は、クロスプラットフォームな機能はあまり必要なかったし、オーバースペックに思えたので使わなかった。

68
64
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
68
64

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?