情報学概論Ⅱ 第9回

企業情報学部

6/16

情報学概論2 第9回(6/16)

(Introduction to Informatics 2)

作業の自動化

ビルドツール(Make と Makefile)

makefile
  • インストールについて:
    • パッケージマネージャ(ScoopやChocolatey)で導入できるし、
    • GNU make(Windowsで動くmakeとしては安定的に使えているもの)の サイトからダウンロードしてもいい。
  • 後者の場合、自分で「PATHの設定」が必要になるようだ。 (右下補足を参照)
  • Win + Pause -> 設定画面

    → システムの詳細設定

    または

  • Win+R か 検索欄で sysdm.cpl

    =>「システムのプロパティ」
      -> 詳細設定 → 環境変数

  • PATHは システム ユーザ 両方にまたがってる

  • make コマンドの、デフォルトのルールファイル名が Makefile ですが、

    そのルールファイルの名前を、別の名前(’Makefile’以外の名前)にした場合は、

    make -f その名前 ターゲット名

    のように、-f オプションで指定してあげてください (というような話も make -h で表示される筈です)。

    • 一部のテキストエディタ(たとえばVSCodeがそうだと思う)は 保存時にMakefile用の拡張子を勝手に付加することがあるようです (たとえば Makefile.mak など)。 その時も上記のオプションでファイル名を(拡張子付きの名前で) 指定してやって下さい。

Makefile に書くべきこと(と、書けること):

  1. ルール(タスク): ルールは、
    • あるターゲット(となるファイル)を生成するために、必要となる(「依存する」とも言う)ファイル(材料)が何であるか(をルールの1行目に)、
    • (2行目以降に)そのターゲットを生成するために行うべきこと(「アクション」とも呼ぶ)を、必要ならば複数行にまたがって
    から成り立つ。後者は、(先頭にTAB文字が入ることを除いて)BATファイル(Unixだとシェルスクリプト)に書かれるような命令・コマンドの列とほぼ同等のもの。
変数
  1. また、(一般的なプログラミング言語と同様に)変数を定義して値を代入しておくこともできる。
    • 変数はルールの中なので参照することができる。
    • Makefileでは変数名は大文字の名前にすることになっている。
  • Makefile 記述時の注意事項として、アクション行の先頭に入れる(つもりで打鍵した)Tab文字が、テキストエディタによって勝手に複数の空白文字に分解されてしまわないよう注意する必要がある。

    Tab
字下げ言語
  • こうした先頭のTabや空白による字下げの扱いについては、Makefile以外にも いくつかのプログラミング言語(右図)でも問題になるケースがあるので、 違いを意識しておこう。


実習

makeコマンド
  1. ルールの実行:
    • 前回、インストールと、Makefileの作成までを行った。
      • Makefile には、前回示した内容が書かれていることを前提とする(以下に再掲する)。

        Makefile(ルール部分)

        %.html:%.md
         pandoc -o $@ $<         # 行の頭(pandocの左)は Tab文字
      • また、このMakefileと同じフォルダに、何か Markdownで書かれたソースファイルが 置かれていることを前提とする(この説明/実演では、1.md を想定する)。

  • これを、実行してみましょう。このMakefileが置かれたフォルダからコマンドプロンプトを起動して、
make
  • 実は、これでは(現時点では)何も起きません(デフォルトのターゲットを次節で指定したら使える)。
    • ターゲット名として、そこに置いてあるソースファイル(.md)と同じ名前で、拡張子を .html に変えたファイル名を指定します。
make 1.html
  • ターゲットとして指定したhtmlファイルが生成されていることを確認。
  • また、2回めに(同じ呼び方で)読んだ時には何も起きないことも確認する。
    • ターゲットが存在しないか、ターゲットよりもソースの方が新しい時に、 (Makefileのルールに指定した)アクションを実行する、という動作原理なので。
  1. デフォルトのターゲットを指定する
  • よく使われるターゲット名として、all, clean 等がある。
    • all は、「このフォルダで行うべきすべてのこと」というような意味で使われる
    • clean は、その逆で、ソースから自動で作られるファイルを一旦すべて消去するときに使われるターゲット名。
    • いずれも、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

    のように引数なしで呼んでみよう。

    • そこにある *。md ファイルそれぞれから、対応する .htmlファイルが作られていることを確認。
  • 板書の説明では、図のような3つのソースファイルが置かれた状態のフォルダを想定する。

    実験用環境
  • 変数 HTML に、3つのターゲットファイルの名前が並ぶことになる。 make の動作
  • make all または make コマンドにより、この3つのターゲットファイルに対するルールの呼び出しが行われることになる(右図)。

状態維持のための判断と処理

  • もう一度 make 呼んだ場合(2回め以降は)何もしないですぐに終了することも確認。
    • すでにターゲットがすべて作成済である場合は、何も変換作業を行う必要がないため、 それを判断した make は、何もしない。
  • 以下のいずれかの操作を行い、
    1. いずれかのソースファイル(板書の説明では 1.mdを例にとる)を、編集し、保存する
    2. ターゲットファイル(たとえば 1.html)を消去する

そのあとあらためて make を起動すると、

変更のあったソース、または消去されたターゲット、に関係する変換プログラムだけ起動されることも確認されたい。

  • また、clean ターゲットも作っておこう。

    Makefile(Cleanターゲット部分)

    clean :
      del $(HTML)     # 行頭はTab
    • ここでは、依存ファイル(コロンの右)は空でいい。

    • del コマンドがこのままで動作しない時は、

      clean :
          cmd /c del $(HTML)

      のように cmd コマンド(コマンドプロンプトそのもの)の /c オプションに 実行したいコマンドを渡すようにする。

  • そうした上で、

    make clean

で、(そのフォルダにある)*.html がすべて消されることを確認する。

ビルドツールの動作

(この章は読んでおいて下さい)

  • ビルドツールはなるべく少ない処理数で、望ましい状態を維持するためのツールの1つ。
  • たとえば(その意味では同じ目的を持つツールである)バックアップツールは、 「コピー」の側に「オリジナル」と同じものが揃っているという状態を維持しようとする。 そのため、「コピー」側に
    1. オリジナル側と同じものが、存在しない時、または
    2. 存在するがオリジナルよりも古い時
    のいずれかの場合にデータ転送を行い、

「コピー」側の方が新しければそのファイルについては何もしない。

バックアップツール ビルドツール

  • ビルドツールの論理もほぼ同様。
    • データを転送する(オリジナル側と同じ内容のファイルをコピー側に作る)代わりに、
    • ルールに従ってプログラムを起動し、ソース側のファイルをもとにターゲットファイルを作成する。 タイムスタンプ
  • なお、ファイルの新旧比較には、ファイルに付与されている情報として「最終更新日時(タイムスタンプ)を用いる。

課題

  • make を実際に使ってみて下さい。
    • makeファイルを(今回解説に沿って)作る
    • いくつかの Markdownファイルを(上記と同じ場所に)作り
    • 同じ場所でコマンドプロンプトを起動して make を呼び出す。
  • やってみたこと、その結果、考察したこと、などを報告ください。

以下は来週扱います

(ここをクリックすると表示が切り替わります)