学生実験 1 : Make の使い方
- 目的
- 進め方
- make とは何か
- ワンポイント
- とりあえず使ってみる: Level 1-3
- make の挙動
- makefile を書く: Level 4
- make の利用例
- ネット上に公開されているソフトウェアをコンパイルしてみる
- 課題と提出方法
- 用語説明
- 参考文献・サイト
- 目的
-
- 計算機実験ではプログラミングが必須である.本実験ではシステム開発上で必要不可欠なツールの一つ make の使い方を習得する.オンラインマニュアル(man)を良く読むこと.
- Level 1-5 の課題と,他の make 利用法の紹介により理解度を高める.
- (サブ)レポート作成の際に必要となる図作成の方法(gnuplot, tgifなど)についても,時間が許す範囲でやります.
- 進め方
-
- make とは何か: Level 1-3
- make の挙動
- makefile を書く: Level 4-5
- make の利用例
- ネット上に公開されているソフトウェアをコンパイルしてみる
- 課題と提出方法
- gnuplot/tgif...
- レポートの書き方(一週目「TeXの使い方」より)
make とは何か
オンラインマニュアルを読む癖をつけるということで,man から抜粋.NAME make - GNU make utility to maintain groups of programs DESCRIPTION The purpose of the make utility is to determine automatically which pieces of a large program need to be recompiled, and issue the commands to recompile them.
ワンポイント
- 再コンパイルが必要なら,必要な部分を自動的に決定し,コンパイルしてくれる.
→どのように自動化しているのか?/自動化させるためには?
- 簡単な説明として「utility to maintain groups of programs」とありますが,要はコンパイルするためのツールと考えてください.汎用性があるためコンパイル専用ツールでは無いんですが,今回は一般的な使い方についてのみ実習します.
- 「pieces of a large program」とありますが,複数ファイルで構成されるプログラムなら make は便利です.1ファイルの場合でも,「コンパイル時に指定するオプションがある」,「ライブラリ等のパスを指定する必要がある」といった場合には,一々コンパイルの都度長ったらしいオプションを書く必要なく「make」だけでコンパイルすることが可能です.
→ソースは1ファイルのみ,コンパイルも gcc hoge.c するだけの場合は?
とりあえず使ってみる
サンプルプログラム:make-sample.tar.gz- Level 1
- 上記サンプルプログラムをダウンロードし,make を実行せよ.make 実行時,端末上にその動作が表示されるはずである.表示された内容を記録し,その内容が何を意味するのか説明せよ.
# gzip -cd make-sample.tar.gz | tar xvf - # cd make-sample # make (何が実行されているのか,観察し考察せよ.)
- Level 2
- どれか1つ以上のソースファイルを編集・保存し,make を実行せよ(コンパイルが通るのであれば編集内容は問わない).編集対象毎に make の動作は異なるはずである.どのファイルを編集するとどう動作するのかを確認せよ.
- Level 3
- touch コマンドにより1つ以上のソースファイルのタイムスタンプを更新し,make を実行せよ.この時の make の動作は Level 2 と比較して同じはずである.何故このような動作になっているのか考察せよ.
make の挙動
SYNOPSIS make [ -f makefile ] [ option ] ... target ... (DESCRIPTION) To prepare to use make, you must write a file called the makefile that describes the relationships among files in your program, and the states the commands for updating each file. In a program, typically the exe- cutable file is updated from object files, which are in turn made by compiling source files. Once a suitable makefile exists, each time you change some source files, this simple shell command: make suffices to perform all necessary recompilations. The make program uses the makefile data base and the last-modification times of the files to decide which of the files need to be updated. For each of those files, it issues the commands recorded in the data base. make executes commands in the makefile to update one or more target names, where name is typically a program. If no -f option is present, make will look for the makefiles GNUmakefile, makefile, and Makefile, in that order. Normally you should call your makefile either makefile or Makefile. (We recommend Makefile because it appears prominently near the begin- ning of a directory listing, right near other important files such as README.) The first name checked, GNUmakefile, is not recommended for most makefiles. You should use this name if you have a makefile that is specific to GNU make, and will not be understood by other versions of make. If makefile is `-', the standard input is read. make updates a target if it depends on prerequisite files that have been modified since the target was last modified, or if the target does not exist.
ワンポイント
- make を使うには makefile が必要(デフォルトは Makefile).
→複数の makefile がある場合,ファイルを指定するにはどうするのか?
- makefile では「ファイル間の関係と,各ファイルを更新するためのプログラム」を記述する.
例:a.out を作成するためには sampleA.o, sampleB.o が必要であり,これらは sampleA.c, sampleB.c を gcc -c でコンパイルすることで作成する.
→Level 1 のサンプルはどのような構成になっているか?
- make は Makefile とファイルの最終更新時刻を利用して更新する必要のあるファイルを決定し,必要に応じて更新する.
→どういうときに再コンパイルする必要があるのか?
makefileを書く
基本形
target: [source] [command]
- 「: source」や「 command」の空白は「タブ」で入力すること.
- ソースやコマンドは省略可能である.(ソースを省略すると,常にコマンドが実行される)
- 複数のターゲットが存在する場合,(make 時にターゲットを指定しなければ)最初に書かれたターゲットを生成しようとする.この時,該当ターゲットの生成に関係の無いターゲットは生成しない.
- Level 4
- サンプルには幾つかの Makefile 例があり,makefile2 は詳細動作まで記述した例である.makefile2 の source や command を削除し,make を実行せよ.この例では全く同一の動作になっているはずである.これは make に推論機能が実装されているためである.各自削除した source / command について,具体的に何が推論により補われているのかを示せ.
→ソースとして「hoge.o」を指定した場合,「hoge.c」があれば make はそのソースが cc によりコンパイルします.これは make がそのような関係を知っているからですが,知らないものに対してはどのように教えれば良いのか?
マクロ
CC = gcc CFLAGS = -Wall -O2 LOADLIBS = -lm USER_DEFILED_MACRO = hoge1 hoge2 hoge3
- 上記のように定義した変数(マクロ)は,makefile 中で「$(CC)」のように記述すると,make 実行時に定義した文字列に置き換えて実行する.
→例1:ダウンロードしたサンプル内のmakefile3
→例2:GA for Knapsack
コマンドの応用例
clean: rm -f a.out *.o *~
- Level 5
- 上記の clean は大抵の makefile に定義されている内容である(コマンドやその引数は必要に応じてマクロを使うことが多い).これは何をしているのか.Level 1 でダウンロードした Makefile に類似の機能を記述し,実行せよ.その際,clean 実行前後で何がどう変わるのかを示せ.
make の利用例
「makefileを書く」で見て来たように,command 部では gcc のようなコンパイラだけでなく,コマンドライン上で実行出来るソフトウェアならば何でも利用することが可能である.いくつか例を見てみよう.
- (TA?)
- LaTeX: Makefile.latex
ネット上に公開されているソフトウェアをコンパイルしてみる
Makefile は自分が楽するためだけではなく,他の人が利用しやすくするために用意する物でもあります.最近は rpm/fink/epkg などでコンパイル済みのバイナリファイルを直接インストール(コピーするだけ)する方式が増えてきました. make により自分でコンパイルするのと比較した場合の rpm 等の利点・欠点は下記に示したものがあります.
- rpm 等の利点
-
- 自分でコンパイルする必要が無い.
- パッケージの管理が便利(なことが多い).
- rpm 等の欠点
-
- 誰かがパッケージを作成(&公開)するまで待つ必要がある.(epkg は誰が用意しているのか?)
- オプションの指定により機能追加したい等,カスタマイズしたパッケージが欲しい場合には,そのパッケージを探し出す必要がある.(自分でコンパイルした方が早い?)
今回は,例題としてApacheをコンパイルしてみよう.
- ダウンロード: Apache→ダウンロード→適当なサーバを選択→apache_1.3.33.tar.gzをダウンロード
- 作業用ディレクトリに移動し,解凍.
% cd (working dir) % gzip -cd apache_1.3.33.tar.gz | tar xvf - % cd apache_1.3.33
- コンパイル/インストール方法を確認: README, 1stREADME, INSTALL, LICENSE, doc/, src/, conf/
(一般的な手順) % ./configure % (./configure --prefix=/install/directory) % make % make test % sudo make install (今回はやらない事!!)
課題と提出方法
- 課題
-
- 全員必須:全ての Level にトライし,レポートとしてまとめよ.
- オプション:gcc以外にどのような使い道があるか?検討/調査/実験し,その結果を報告せよ.
- 提出方法
-
- 1人1レポート提出.
- レポートは LaTeX で作成し,印刷物を提出すること.
用語説明
- make
- 自動コンパイラ.
- makefile
- make にコンパイル対象・方法を指定するための設定ファイル.
- target, ターゲット
- make で生成したい対象名のこと(例:a.out).指定したターゲットが存在しない場合や,生成元ファイル(ソースと呼びます)の日付が新しい場合に,そのターゲットを生成しようとします.
- source, ソース
- ソースファイル名(例:hello.c).
- command, コマンド
- ソースからターゲットを生成するためのコマンドのこと(例:gcc).