学生実験 1 : Make の使い方






目的
  • 計算機実験ではプログラミングが必須である.本実験ではシステム開発上で必要不可欠なツールの一つ make の使い方を習得する.オンラインマニュアル(man)を良く読むこと.
  • Level 1-5 の課題と,他の make 利用法の紹介により理解度を高める.
  • (サブ)レポート作成の際に必要となる図作成の方法(gnuplot, tgifなど)についても,時間が許す範囲でやります.
進め方
  1. make とは何か: Level 1-3
  2. make の挙動
  3. makefile を書く: Level 4-5
  4. make の利用例
  5. ネット上に公開されているソフトウェアをコンパイルしてみる
  6. 課題と提出方法
  7. gnuplot/tgif...
  8. レポートの書き方(一週目「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.

ワンポイント

とりあえず使ってみる

サンプルプログラム: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.

ワンポイント


makefileを書く

基本形

target:	[source]
	[command]
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

コマンドの応用例

clean:
	rm -f a.out *.o *~
Level 5
上記の clean は大抵の makefile に定義されている内容である(コマンドやその引数は必要に応じてマクロを使うことが多い).これは何をしているのか.Level 1 でダウンロードした Makefile に類似の機能を記述し,実行せよ.その際,clean 実行前後で何がどう変わるのかを示せ.

make の利用例

makefileを書く」で見て来たように,command 部では gcc のようなコンパイラだけでなく,コマンドライン上で実行出来るソフトウェアならば何でも利用することが可能である.いくつか例を見てみよう.


ネット上に公開されているソフトウェアをコンパイルしてみる

Makefile は自分が楽するためだけではなく,他の人が利用しやすくするために用意する物でもあります.最近は rpm/fink/epkg などでコンパイル済みのバイナリファイルを直接インストール(コピーするだけ)する方式が増えてきました. make により自分でコンパイルするのと比較した場合の rpm 等の利点・欠点は下記に示したものがあります.

rpm 等の利点
  • 自分でコンパイルする必要が無い.
  • パッケージの管理が便利(なことが多い).
rpm 等の欠点
  • 誰かがパッケージを作成(&公開)するまで待つ必要がある.(epkg は誰が用意しているのか?)
  • オプションの指定により機能追加したい等,カスタマイズしたパッケージが欲しい場合には,そのパッケージを探し出す必要がある.(自分でコンパイルした方が早い?)

今回は,例題としてApacheをコンパイルしてみよう.

  1. ダウンロード: Apache→ダウンロード→適当なサーバを選択→apache_1.3.33.tar.gzをダウンロード
  2. 作業用ディレクトリに移動し,解凍.
    % cd (working dir)
    % gzip -cd apache_1.3.33.tar.gz | tar xvf -
    % cd apache_1.3.33
    
  3. コンパイル/インストール方法を確認: 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).
参考文献・サイト