GNU make make v make GNU make GNU











































![Make の仕事を見てみよう ¡ make によるコンパイル $ make Make 実行 ===> src/main make[1]: Entering directory Make の仕事を見てみよう ¡ make によるコンパイル $ make Make 実行 ===> src/main make[1]: Entering directory](https://slidetodoc.com/presentation_image_h/dd84f31ad47da5978eb37401c15eb7a7/image-44.jpg)
![Make の仕事を見てみよう ¡ make によるコンパイル $ make ===> src/main C コンパイラ gcc によって make[1]: Make の仕事を見てみよう ¡ make によるコンパイル $ make ===> src/main C コンパイラ gcc によって make[1]:](https://slidetodoc.com/presentation_image_h/dd84f31ad47da5978eb37401c15eb7a7/image-45.jpg)
![Make の仕事を見てみよう ¡ make によるインストール $ make install make[1]: Entering directory. . . Make Make の仕事を見てみよう ¡ make によるインストール $ make install make[1]: Entering directory. . . Make](https://slidetodoc.com/presentation_image_h/dd84f31ad47da5978eb37401c15eb7a7/image-46.jpg)
![Make の仕事を見てみよう ¡ make によるインストール $ make install make[1]: Entering directory. . . Apache Make の仕事を見てみよう ¡ make によるインストール $ make install make[1]: Entering directory. . . Apache](https://slidetodoc.com/presentation_image_h/dd84f31ad47da5978eb37401c15eb7a7/image-47.jpg)














- Slides: 61








御託はいいから使ってみよう ¡ GNU make のコマンド名の確認 $ make –v make コマンドが GNU make であ ることを確認 GNU Make 3. 80 Copyright (C) 2002 Free Software. . . This is free software; see the source. . There is NO warranty; not even for. . . PARTICULAR PURPOSE. ¡ もし make が GNU make で無いときは. . . l l “gmake” を代わりに使ってみる chkgmake. sh (自作スクリプト) を使って調べる.

御託はいいから使ってみよう ¡ Fortran のソースコードを準備 $ vi main. f 90 program main print *, "Hello, World!" end program main ¡ ちなみに, 手動でコンパイルする場合は. . . $ g 95 main. f 90 –o main $. /main Hello, World!

御託はいいから使ってみよう ¡ Makefile を書いてみる $ vi Makefile main: g 95 main. f 90 -o main

御託はいいから使ってみよう ¡ いざ, make 実行!! $ make main g 95 main. f 90 -o main $ ls –l -rw-r--r--rwxr-xr-x -rw-r--r-- . . . $. /main Hello, World! 2006 -06 -29 22: 45 22: 51 22: 32 22: 51 Makefile main* main. f 90 main. o









依存関係のチェック ファイル同士の依存関係をチェック ¡ 以下のような場合を考えよう. ¡ reidai. f 90 program reidai : external maxmin call maxmin(a, b, c, x, y) maxmin. f 90 : subroutine maxmin(a, b, c, max, min) end program reidai integer, external : : min 2 : min = min 2(b, c) : end subroutine maxmin 依存先を示す min 2. f 90 function min 2(i, j) result(m) : end function min 2


依存関係のチェック ¡ 動作の仕組み $ make Makefile all: reidai: min 2. o maxmin. o reidai. f 90 min 2. o g 95 reidai. f 90 maxmin. o min 2. o -o とreidai maxmin. o: min 2. o maxmin. f 90 min 2. f 90 のタ g 95 –c maxmin. f 90 イムスタンプをチ min 2. o: min 2. f 90 ェック g 95 –c min 2. f 90 $ g 95 –c min 2. f 90

依存関係のチェック ¡ 動作の仕組み $ make maxmin. o と Makefile maxmin. f 90 all: reidai のタイムスタンプ reidai: min 2. o maxmin. o reidai. f 90 をチェック g 95 reidai. f 90 maxmin. o min 2. o -o reidai maxmin. o: min 2. o maxmin. f 90 g 95 –c maxmin. f 90 min 2. o: min 2. f 90 g 95 –c min 2. f 90 $ g 95 –c maxmin. f 90

依存関係のチェック ¡ 動作の仕組み $ make Makefile all: reidai: min 2. o maxmin. o reidai. f 90 g 95 reidai. f 90 maxmin. o min 2. o -o reidai maxmin. o: min 2. o maxmin. f 90 g 95 –c maxmin. f 90 reidai と min 2. o: min 2. f 90 reidai. f 90 のタ g 95 –c min 2. f 90 イムスタンプをチ ェック $ g 95 –c min 2. f 90 $ g 95 –c maxmin. f 90 $ g 95 reidai. f 90 maxmin. o min 2. o -o reidai





変数 (マクロ) ¡ 変数の利用によって管理が楽に Makefile FC = g 95 all: reidai: min 2. o maxmin. o reidai. f 90 $(FC) reidai. f 90 maxmin. o min 2. o -o reidai maxmin. o: min 2. o maxmin. f 90 $(FC) –c maxmin. f 90 min 2. o: min 2. f 90 $(FC) –c min 2. f 90 FC = g 95 が代入される

自動変数 ¡ 二度書くのは面倒じゃありません. . . ? Makefile FC = g 95 同じもの all: reidai: min 2. o maxmin. o reidai. f 90 $(FC) reidai. f 90 maxmin. o min 2. o -o reidai maxmin. o: maxmin. f 90 $(FC) –c maxmin. f 90 min 2. o: min 2. f 90 $(FC) –c min 2. f 90 同じもの


自動変数 ¡ 自動変数を使うと. . . ? Makefile FC = g 95 min 2. o maxmin. o reidai. f 90 が代入される all: reidai: min 2. o maxmin. o reidai. f 90 $(FC) $^ -o $@ reidai が代入される maxmin. o: maxmin. f 90 $(FC) –c $< min 2. o: min 2. f 90 $(FC) –c $< maxmin. f 90 が代入される







実践 Makefile = g 95 # Fortran コンパイラ = -O -I/usr/include # コンパイル用のフラグ (オプションなど) LDFLAGS = -L/usr/lib -lnetcdf-g 95 # リンク用のフラグ (ライブラリなど) FC FFLAGS all: reidai: min 2. o maxmin. o %. o: %. f 90 $(FC) –c $(FFLAGS) $< %: %. o $(FC) $(FFLAGS) $^ $(LDLAGS) -o $@



Make の仕事を見てみよう ¡ Apache で働く make を見てみる l (まずは準備) $ cd /usr/local/src ソースコード 置き場へ移 動 $ wget http: //www. apache. jp/dist/ httpd/apache_1. 3. 36. tar. gz $ tar xvfz Apache の tar ボールをダウン apache_1. 3. 36. tar. gz ロード $ cd apache_1. 3. 36 $. /configure

Make の仕事を見てみよう ¡ Apache で働く make を見てみる l (まずは準備) $ cd /usr/local/src $ wget http: //www. apache. jp/dist/ httpd/apache_1. 3. 36. tar. gz Tar ボール を展開 $ tar xvfz apache_1. 3. 36. tar. gz $ cd apache_1. 3. 36 $. /configure コンパイルを行なう環 境が どのようなもの であるかを調査
![Make の仕事を見てみよう make によるコンパイル make Make 実行 srcmain make1 Entering directory Make の仕事を見てみよう ¡ make によるコンパイル $ make Make 実行 ===> src/main make[1]: Entering directory](https://slidetodoc.com/presentation_image_h/dd84f31ad47da5978eb37401c15eb7a7/image-44.jpg)
Make の仕事を見てみよう ¡ make によるコンパイル $ make Make 実行 ===> src/main make[1]: Entering directory `/usr/local/src/ apache_1. 3. 34/src/main' gcc -c -I. . /os/unix -I. . /include src/main ディ レクトリへ移 -DLINUX=22. . . http_config. c 動 : ar cr libmain. a. . http_config. o http_core. o. . make[1]: Leaving directory `/usr/local/src/ apache_1. 3. 34' <=== src
![Make の仕事を見てみよう make によるコンパイル make srcmain C コンパイラ gcc によって make1 Make の仕事を見てみよう ¡ make によるコンパイル $ make ===> src/main C コンパイラ gcc によって make[1]:](https://slidetodoc.com/presentation_image_h/dd84f31ad47da5978eb37401c15eb7a7/image-45.jpg)
Make の仕事を見てみよう ¡ make によるコンパイル $ make ===> src/main C コンパイラ gcc によって make[1]: Entering directoryhttp_config. c `/usr/local/src/ をコンパイル apache_1. 3. 34/src/main' アーカイブコマンド ar によって gcc -c -I. . /os/unix -I. . /include ライブラリ libmain. a を作成 -DLINUX=22. . . http_config. c : ar cr libmain. a. . http_config. o http_core. o. . 仕事を終えてもと make[1]: Leaving directory `/usr/local/src/ のディレクトリへ戻 apache_1. 3. 34' る <=== src
![Make の仕事を見てみよう make によるインストール make install make1 Entering directory Make Make の仕事を見てみよう ¡ make によるインストール $ make install make[1]: Entering directory. . . Make](https://slidetodoc.com/presentation_image_h/dd84f31ad47da5978eb37401c15eb7a7/image-46.jpg)
Make の仕事を見てみよう ¡ make によるインストール $ make install make[1]: Entering directory. . . Make 実行 ===> [mktree: Creating Apache installation tree]. /src/helpers/mkdir. sh /usr/local/apache/bin mkdir /usr/local/apache/bin : ===> [programs: Installing Apache httpd ディレクトリツ program. . ] リーの作成. /src/helpers/install. sh -c -m 755 -s. /src/httpd /usr/local/apache/bin/httpd : ===> [config: Installing Apache config files]. /src/helpers/install. sh -c -m 644 conf/httpd. conf /usr/local/apache/conf/httpd. conf : make[1]: Leaving directory. . .
![Make の仕事を見てみよう make によるインストール make install make1 Entering directory Apache Make の仕事を見てみよう ¡ make によるインストール $ make install make[1]: Entering directory. . . Apache](https://slidetodoc.com/presentation_image_h/dd84f31ad47da5978eb37401c15eb7a7/image-47.jpg)
Make の仕事を見てみよう ¡ make によるインストール $ make install make[1]: Entering directory. . . Apache の実行プログラム ===> [mktree: Creating Apache installation tree] httpd のインストール. /src/helpers/mkdir. sh /usr/local/apache/bin mkdir /usr/local/apache/bin : 設定ファイル httpd. conf のイ ===> [programs: Installing Apache httpd program. . ]. /src/helpers/install. sh -c -m 755 ンストール -s. /src/httpd /usr/local/apache/bin/httpd : ===> [config: Installing Apache config files] 仕事を終えてもと. /src/helpers/install. sh -c -m 644 conf/httpd. conf /usr/local/apache/conf/httpd. conf のディレクトリへ戻 る : make[1]: Leaving directory. . .



いろいろ応用 (1) ¡ Te. X から DVI, PDF へ Makefile PTEX = platex DVIPDF = dvipdfmx all: ronbun. pdf %. dvi: %. tex $(PTEX) $< %. pdf: %. dvi $(DVIPDF) $< # La. Te. X コマンド # DVI -> PDF コンバータ ronbun. tex から ronbun. dvi を経て ronbun. pdf を生成

いろいろ応用 (2) ¡ RD から HTML Makefile RD = rd 2 # rdtool RDFLAGS = -r rd/rd 2 html-lib --with-css=$(CSS) # オプション CSS = zagaku. css # スタイルシート all: zagaku. htm %. htm: %. rd $(RD) $(RDFLAGS) $< > $@ zagaku. rd から zagaku. htm を生成 http: //www. gfd-dennou. org/library/dcmodel/doc/sample_Makefile/Makefile. rd 2 html にもう少し凝った Makefile 置いてあります.








シェルスクリプト ¡ 基本的に sh (Bourne Shell) が書けます. Makefile FC = g 95 # Fortran コンパイラ FFLAGS = -O -I/usr/include IF 文を書くとき LDFLAGS = -L/usr/lib -lnetcdf-g 95 部分の行末に all: reidai: min 2. o maxmin. o if [ -f $@ ] ; then chmod g+w $@ ; fi FI までの “” を付 けるよう注意 %. o: %. f 90 $(FC) –c $(FFLAGS) $< %: %. o $(FC) $(FFLAGS) $^ $(LDLAGS) -o $@


参考資料 ¡ GNU Make マニュアル (日本語訳) l http: //www. ecoop. net/coop/translated/GN UMake 3. 77/ Andrew Oram, Steve Talbott 著, 矢吹 道 朗 監訳, 菊池 彰 訳, 1997: make 改訂版. オライリージャパン, 150 pp. ¡ “mk” に関して ¡ l ¡ http: //plan 9. aichi-u. ac. jp/mk/ Windows 上で動作する GNU make を同梱 するソフトウェア Min. GW l http: //www. mingw. org/