(Introduction to Informatics 2)
Win + Pause -> 設定画面
→ システムの詳細設定
または
Win+R か 検索欄で sysdm.cpl
=>「システムのプロパティ」
-> 詳細設定 → 環境変数
PATHは システム ユーザ 両方にまたがってる
make コマンドの、デフォルトのルールファイル名が Makefile ですが、
そのルールファイルの名前を、別の名前(’Makefile’以外の名前)にした場合は、
make -f その名前 ターゲット名
のように、-f
オプションで指定してあげてください
(というような話も make -h
で表示される筈です)。
Makefile 記述時の注意事項として、アクション行の先頭に入れる(つもりで打鍵した)Tab文字が、テキストエディタによって勝手に複数の空白文字に分解されてしまわないよう注意する必要がある。
Makefile には、前回示した内容が書かれていることを前提とする(以下に再掲する)。
Makefile(ルール部分)
%.html:%.md
pandoc -o $@ $< # 行の頭(pandocの左)は Tab文字
また、このMakefileと同じフォルダに、何か Markdownで書かれたソースファイルが 置かれていることを前提とする(この説明/実演では、1.md を想定する)。
make
make 1.html
よく使われるターゲット名として、all, clean 等がある。
Makefileの中で、最初に書かれたルールがデフォルトのターゲットとなる。
ここに all を指定することがよく行われている。
Makefile の 基本を学ぶページでは、ターゲットの名前をMakefile 内に列挙する書き方が よく見られる(これはこれで必要だが)。が、ここでは、 「このフォルダに置かれた、同じ種類のファイルすべて」のような漠然とした指定方法を 紹介しておく。
Makefile(変数部分)
MD=$(wildcard *.md)
HTML=$(MD:.md=.html)
これをルール記述に先立って入れておく。
変数 MD には、wildcard 関数によって ワイルドカードを含む表現
*.md
が展開され、 「そこに置かれた .md ファイル
を列挙したリスト」が代入される。
次の行では、そのリストの各要素の、拡張子部分をそれぞれ .md から .html に変更したファイル名のリスト(それぞれのファイルは存在していなくていい)が代入される。
こうしてリストを定義しておいて、
Makefile(デフォールトターゲット指定部分)
all : $(HTML)
のような定義を(変数定義をのぞいた)先頭部に書いておくと、それがデフォルトのターゲットとなる。
結果的に makefile は 上にリストで提示した 「Makefile(変数部分)」と「Makefile(デフォールトターゲット指定部分)」「Makefile(ルール部分)」が(この順番が最も適当だろう)すべて含まれるものになる筈。
デフォルトのターゲットをMakefileに記述したら、
make
のように引数なしで呼んでみよう。
板書の説明では、図のような3つのソースファイルが置かれた状態のフォルダを想定する。
make all または make コマンドにより、この3つのターゲットファイルに対するルールの呼び出しが行われることになる(右図)。
もう一度 make 呼んだ場合(2回め以降は)何もしないですぐに終了することも確認。
以下のいずれかの操作を行い、
そのあとあらためて make を起動すると、
変更のあったソース、または消去されたターゲット、に関係する変換プログラムだけ起動されることも確認されたい。
また、clean ターゲットも作っておこう。
Makefile(Cleanターゲット部分)
clean :
del $(HTML) # 行頭はTab
ここでは、依存ファイル(コロンの右)は空でいい。
del コマンドがこのままで動作しない時は、
clean :
cmd /c del $(HTML)
のように cmd コマンド(コマンドプロンプトそのもの)の /c オプションに 実行したいコマンドを渡すようにする。
そうした上で、
make clean
で、(そのフォルダにある)*.html がすべて消されることを確認する。
(この章は読んでおいて下さい)
ビルドツールはなるべく少ない処理数で、望ましい状態を維持するためのツールの1つ。
たとえば(その意味では同じ目的を持つツールである)バックアップツールは、 「コピー」の側に「オリジナル」と同じものが揃っているという状態を維持しようとする。 そのため、「コピー」側に
のいずれかの場合にデータ転送を行い、
「コピー」側の方が新しければそのファイルについては何もしない。
ビルドツールの論理もほぼ同様。
なお、ファイルの新旧比較には、ファイルに付与されている情報として「最終更新日時(タイムスタンプ)を用いる。