情報学概論2 第9回(6/16)
(Introduction to Informatics 2)
ビルドツール(Make と Makefile)
makefile
- インストールについて:
- パッケージマネージャ(ScoopやChocolatey)で導入できるし、
- GNU make(Windowsで動くmakeとしては安定的に使えているもの)の
サイトからダウンロードしてもいい。
- 後者の場合、自分で「PATHの設定」が必要になるようだ。
(右下補足を参照)
make コマンドの、デフォルトのルールファイル名が Makefile
ですが、
そのルールファイルの名前を、別の名前(’Makefile’以外の名前)にした場合は、
make -f その名前 ターゲット名
のように、-f
オプションで指定してあげてください
(というような話も make -h
で表示される筈です)。
- 一部のテキストエディタ(たとえばVSCodeがそうだと思う)は
保存時にMakefile用の拡張子を勝手に付加することがあるようです (たとえば
Makefile.mak など)。
その時も上記のオプションでファイル名を(拡張子付きの名前で)
指定してやって下さい。
Makefile
に書くべきこと(と、書けること):
- ルール(タスク): ルールは、
- あるターゲット(となるファイル)を生成するために、必要となる(「依存する」とも言う)ファイル(材料)が何であるか(をルールの1行目に)、
- (2行目以降に)そのターゲットを生成するために行うべきこと(「アクション」とも呼ぶ)を、必要ならば複数行にまたがって
から成り立つ。後者は、(先頭にTAB文字が入ることを除いて)BATファイル(Unixだとシェルスクリプト)に書かれるような命令・コマンドの列とほぼ同等のもの。
変数
- また、(一般的なプログラミング言語と同様に)変数を定義して値を代入しておくこともできる。
- 変数はルールの中なので参照することができる。
- Makefileでは変数名は大文字の名前にすることになっている。
字下げ言語
- こうした先頭のTabや空白による字下げの扱いについては、Makefile以外にも
いくつかのプログラミング言語(右図)でも問題になるケースがあるので、
違いを意識しておこう。
実習
makeコマンド
- ルールの実行:
- 前回、インストールと、Makefileの作成までを行った。
Makefile
には、前回示した内容が書かれていることを前提とする(以下に再掲する)。
Makefile(ルール部分)
%.html:%.md
pandoc -o $@ $< # 行の頭(pandocの左)は Tab文字
また、このMakefileと同じフォルダに、何か
Markdownで書かれたソースファイルが
置かれていることを前提とする(この説明/実演では、1.md
を想定する)。
- これを、実行してみましょう。このMakefileが置かれたフォルダからコマンドプロンプトを起動して、
make
- 実は、これでは(現時点では)何も起きません(デフォルトのターゲットを次節で指定したら使える)。
- ターゲット名として、そこに置いてあるソースファイル(.md)と同じ名前で、拡張子を
.html に変えたファイル名を指定します。
make 1.html
- ターゲットとして指定したhtmlファイルが生成されていることを確認。
- また、2回めに(同じ呼び方で)読んだ時には何も起きないことも確認する。
- ターゲットが存在しないか、ターゲットよりもソースの方が新しい時に、
(Makefileのルールに指定した)アクションを実行する、という動作原理なので。
- デフォルトのターゲットを指定する
- よく使われるターゲット名として、all, clean 等がある。
- all
は、「このフォルダで行うべきすべてのこと」というような意味で使われる
- clean
は、その逆で、ソースから自動で作られるファイルを一旦すべて消去するときに使われるターゲット名。
- いずれも、all, clean
といった名前のファイルを生成する、という意味では使われない。
- Makefileの中で、最初に書かれたルールがデフォルトのターゲットとなる。
![デフォルトターゲット]()
- ここに all を指定することがよく行われている。
- Makefile の 基本を学ぶページでは、ターゲットの名前をMakefile
内に列挙する書き方が
よく見られる(これはこれで必要だが)。が、ここでは、
「このフォルダに置かれた、同じ種類のファイルすべて」のような漠然とした指定方法を
紹介しておく。
Makefile(変数部分)
MD=$(wildcard *.md)
HTML=$(MD:.md=.html)
- 結果的に makefile は 上にリストで提示した
「Makefile(変数部分)」と「Makefile(デフォールトターゲット指定部分)」「Makefile(ルール部分)」が(この順番が最も適当だろう)すべて含まれるものになる筈。
- 変数 HTML に、3つのターゲットファイルの名前が並ぶことになる。
![make の動作]()
- make all または make
コマンドにより、この3つのターゲットファイルに対するルールの呼び出しが行われることになる(右図)。
状態維持のための判断と処理
- もう一度 make
呼んだ場合(2回め以降は)何もしないですぐに終了することも確認。
- すでにターゲットがすべて作成済である場合は、何も変換作業を行う必要がないため、
それを判断した make は、何もしない。
- 以下のいずれかの操作を行い、
- いずれかのソースファイル(板書の説明では
1.mdを例にとる)を、編集し、保存する
- ターゲットファイル(たとえば 1.html)を消去する
そのあとあらためて make を起動すると、
変更のあったソース、または消去されたターゲット、に関係する変換プログラムだけ起動されることも確認されたい。
で、(そのフォルダにある)*.html がすべて消されることを確認する。
ビルドツールの動作
(この章は読んでおいて下さい)
- ビルドツールはなるべく少ない処理数で、望ましい状態を維持するためのツールの1つ。
- たとえば(その意味では同じ目的を持つツールである)バックアップツールは、
「コピー」の側に「オリジナル」と同じものが揃っているという状態を維持しようとする。
そのため、「コピー」側に
- オリジナル側と同じものが、存在しない時、または
- 存在するがオリジナルよりも古い時
のいずれかの場合にデータ転送を行い、
「コピー」側の方が新しければそのファイルについては何もしない。
![ビルドツール]()
- ビルドツールの論理もほぼ同様。
- データを転送する(オリジナル側と同じ内容のファイルをコピー側に作る)代わりに、
- ルールに従ってプログラムを起動し、ソース側のファイルをもとにターゲットファイルを作成する。
![タイムスタンプ]()
- なお、ファイルの新旧比較には、ファイルに付与されている情報として「最終更新日時(タイムスタンプ)を用いる。
課題
- make を実際に使ってみて下さい。
- makeファイルを(今回解説に沿って)作る
- いくつかの Markdownファイルを(上記と同じ場所に)作り
- 同じ場所でコマンドプロンプトを起動して make を呼び出す。
- やってみたこと、その結果、考察したこと、などを報告ください。
2 ファイルフォーマットを知る
- ここでは、いわゆる「マルチメディア」系のファイルのうち、
- 圧縮が行われない伝統的なファイル形式を2つ、仔細に見ていきます。
- Atomを使ったダンプ表示と、
- 各ファイル形式の「フォーマット」の解説(検索で見つけて下さい)を比較対象しましょう。
2.1 画像ファイル(BMP)
題材ファイル:
補足
リトルエンディアン
- 2byte, 4byte の長さのデータが含まれる際、
- 「リトルエンディアン」の語順で格納されていることを知っておく必要がある
- (インテル系CPUでの昔からのルールに沿ったもの)。