GNU LilyPond – アプリケーション使用方法: 5.5 Make と Makefile

## 5.5 Make と Makefile

`LilyPond を実行できるほとんどすべてのプラットフォームが `make` というソフトウェアをサポートします。このソフトウェアは `Makefile` という名前の特殊なファイルを読み込みます。ファイル `Makefile` は、ファイルの依存関係と、あるファイルから別のファイルを作り出すためにオペレーティング システムに渡す必要があるコマンドを定義します。例えば、`Makefile` は LilyPond を実行して `ballad.ly` から `ballad.pdf` と `ballad.midi` を作り出す方法を記述します。`

`自身の便利さのためかソース ファイルにアクセスしてくれる他の人のために、自身のプロジェクト用に `Makefile` を作成することが良い場合があります。これが当てはまるのは、多くのインクルード ファイルと複数の出力オプション (例えば、フル スコア、パート スコア、指揮譜、ピアノ譜など) を持つ 非常に大きなプロジェクト、あるいは、ビルドするために複雑なコマンドを必要とするプロジェクト (`lilypond-book` プロジェクトなど) です。`Makefile` の複雑さと自由度は、必要性と作者のスキルに応じて、さまざまです。プログラム GNU Make は GNU/Linux ディストリビューションと MacOS X にインストールされていて、Windows でも利用可能です。`

``make` の使い方についてのすべての詳細は GNU Make マニュアル を参照してください。これから示すのは `make` でできることのほんの一例です。`

``Makefile` の中に規則を定義するためのコマンドは、プラットフォームによって異なります。例えば、さまざまな種類がある Linux と MacOS は `bash` を使いますが、Windows は `cmd` を使います。MacOS X では、コマンド ライン インタプリタを使用するためにシステムをコンフィグレーションする必要があるということに注意してください。ここで、`Makefile` の例をいくつか Linux/MacOS 用と Windows 用の両方のバージョンで示します。`

`最初の例は、4 楽章のオーケストラのためのもので、以下のようなディレクトリ構造を持ちます:`

>     Symphony/
>     |-- MIDI/
>     |-- Makefile
>     |-- Notes/
>     |   |-- cello.ily
>     |   |-- figures.ily
>     |   |-- horn.ily
>     |   |-- oboe.ily
>     |   |-- trioString.ily
>     |   |-- viola.ily
>     |   |-- violinOne.ily
>     |   `-- violinTwo.ily
>     |-- PDF/
>     |-- Parts/
>     |   |-- symphony-cello.ly
>     |   |-- symphony-horn.ly
>     |   |-- symphony-oboes.ly
>     |   |-- symphony-viola.ly
>     |   |-- symphony-violinOne.ly
>     |   `-- symphony-violinTwo.ly
>     |-- Scores/
>     |   |-- symphony.ly
>     |   |-- symphonyI.ly
>     |   |-- symphonyII.ly
>     |   |-- symphonyIII.ly
>     |   `-- symphonyIV.ly
>     `-- symphonyDefs.ily

``Scores` ディレクトリと `Parts` ディレクトリの中にある `.ly` ファイルは音符を `Notes` ディレクトリの中にある `.ily` ファイルから取得します:`

>     %%% top of file "symphony-cello.ly"
>     \include ../definitions.ily
>     \include ../Notes/cello.ily

`この `Makefile` はターゲットとして `score` (フル スコアの楽曲全体)、`movements` (フル スコアの個々の楽章)、それに `parts` (演奏者のための個々のパート) を持ちます。さらに、web や email で配布するのに適したソース ファイルの tarball (訳者: 複数のファイルをコマンド `tar` で 1 つのファイルにまとめたもの) を作成するターゲット `archive` もあります。ここでは GNU/Linux や MacOS X 用の `Makefile` を示します。これをプロジェクトのトップ ディレクトリに `Makefile` という名前で保存する必要があります:`

`Note: ターゲットやパターン ルールが定義されたとき、そのあとの行はスペースではなく Tab で始まる必要があります。`

>     # 出力ファイル名
>     piece = symphony
>     # いくつプロセッサがあるかを決定します
>     CPU_CORES=`cat /proc/cpuinfo | grep -m1 "cpu cores" | sed s/".*: "//`
>     # lilypond を実行するコマンド
>     LILY_CMD = lilypond -ddelete-intermediate-files \
>                         -dno-point-and-click -djob-count=$(CPU_CORES)

>     # この Makefile で使用される拡張子
>     .SUFFIXES: .ly .ily .pdf .midi

>     # 入力ファイルと出力ファイルのサーチは VPATH 変数でリストアップされている
>     # ディレクトリの中で行われます。それらのディレクトリはすべて (GNU make 変数
>     # `CURDIR' によって与えられる) カレント ディレクトリのサブディレクトリです。
>     VPATH = \
>       $(CURDIR)/Scores \
>       $(CURDIR)/PDF \
>       $(CURDIR)/Parts \
>       $(CURDIR)/Notes

>     # LY 入力ファイルから PDF ファイルと MIDI ファイルを作成するための
>     # パターン ルール。.pdf 出力ファイルは `PDF' サブディレクトリの中に
>     # 配置され、.midi ファイルは `MIDI' サブディレクトリの中に配置されます。
>     %.pdf %.midi: %.ly
>             $(LILY_CMD) $<; \           # this line begins with a tab
>             if test -f "$*.pdf"; then \
>                 mv "$*.pdf" PDF/; \
>             fi; \
>             if test -f "$*.midi"; then \
>                 mv "$*.midi" MIDI/; \
>             fi

>     notes = \
>       cello.ily \
>       horn.ily \
>       oboe.ily \
>       viola.ily \
>       violinOne.ily \
>       violinTwo.ily

>     # 楽章の依存関係
>     $(piece)I.pdf: $(piece)I.ly $(notes)
>     $(piece)II.pdf: $(piece)II.ly $(notes)
>     $(piece)III.pdf: $(piece)III.ly $(notes)
>     $(piece)IV.pdf: $(piece)IV.ly $(notes)

>     # 総譜の依存関係
>     $(piece).pdf: $(piece).ly $(notes)

>     # パート譜の依存関係
>     $(piece)-cello.pdf: $(piece)-cello.ly cello.ily
>     $(piece)-horn.pdf: $(piece)-horn.ly horn.ily
>     $(piece)-oboes.pdf: $(piece)-oboes.ly oboe.ily
>     $(piece)-viola.pdf: $(piece)-viola.ly viola.ily
>     $(piece)-violinOne.pdf: $(piece)-violinOne.ly violinOne.ily
>     $(piece)-violinTwo.pdf: $(piece)-violinTwo.ly violinTwo.ily

>     # 4 つすべての楽章のフル スコアを 1 つのファイルとして生成するには
>     # `make score' とタイプします。
>     .PHONY: score
>     score: $(piece).pdf

>     # すべてのパートを生成するには `make parts' とタイプします。
>     # 楽器 `foo' のためのパートを生成するには `make foo.pdf' とタイプします。
>     # 例: `make symphony-cello.pdf'
>     .PHONY: parts
>     parts: $(piece)-cello.pdf \
>            $(piece)-violinOne.pdf \
>            $(piece)-violinTwo.pdf \
>            $(piece)-viola.pdf \
>            $(piece)-oboes.pdf \
>            $(piece)-horn.pdf

>     # 4 つの楽章を別個のファイルとして生成するには `make movements' とタイプします。
>     .PHONY: movements
>     movements: $(piece)I.pdf \
>                $(piece)II.pdf \
>                $(piece)III.pdf \
>                $(piece)IV.pdf

>     all: score parts movements

>     archive:
>             tar -cvvf stamitz.tar \       # this line begins with a tab
>             --exclude=*pdf --exclude=*~ \
>             --exclude=*midi --exclude=*.tar \
>             ../Stamitz/*

`Windows プラットフォームには特別な面倒さがあります。Windows 用の GNU Make をダウンロードしてインストールした後、システム環境変数に正しいパスを設定して、DOS シェルが Make プログラムを見つけられるようにする必要があります。これを行うには、"マイ コンピュータ" を右クリックして、`プロパティ` を選択し、それから `詳細設定` を選択します。それから `環境変数` をクリックして、`システム環境変数` パネルの中にある `Path` をハイライトしてから `編集` をクリックして、GNU Make の実行ファイルへのパスを追加します。そのパスは以下のようになります (訳者: GNU Make のインストールのされ方によって異なります):`

>     C:\Program Files\GnuWin32\bin

`Linux/MacOS X とは異なるシェル コマンドを扱い、いくつかのデフォルト システム ディレクトリの中に存在するファイル空間を扱うために、`Makefile` 自体を変更する必要があります。Windows は `tar` コマンドを持たないため、`archive` ターゲットは除去されます。また、Windows が持つ MIDI ファイルのデフォルト拡張子は異なります。`

>     ## WINDOWS VERSION
>     ##
>     piece = symphony
>     LILY_CMD = lilypond -ddelete-intermediate-files \
>                         -dno-point-and-click \
>                         -djob-count=$(NUMBER_OF_PROCESSORS)

>     #get the 8.3 name of CURDIR (workaround for spaces in PATH)
>     workdir = $(shell for /f "tokens=*" %%b in ("$(CURDIR)") \
>               do @echo %%~sb)

>     .SUFFIXES: .ly .ily .pdf .mid

>     VPATH = \
>       $(workdir)/Scores \
>       $(workdir)/PDF \
>       $(workdir)/Parts \
>       $(workdir)/Notes

>     %.pdf %.mid: %.ly
>             $(LILY_CMD) $<      # this line begins with a tab
>             if exist "$*.pdf"  move /Y "$*.pdf"  PDF/ # begin with tab
>             if exist "$*.mid" move /Y "$*.mid" MIDI/  # begin with tab

>     notes = \
>       cello.ily \
>       figures.ily \
>       horn.ily \
>       oboe.ily \
>       trioString.ily \
>       viola.ily \
>       violinOne.ily \
>       violinTwo.ily

>     $(piece)I.pdf: $(piece)I.ly $(notes)
>     $(piece)II.pdf: $(piece)II.ly $(notes)
>     $(piece)III.pdf: $(piece)III.ly $(notes)
>     $(piece)IV.pdf: $(piece)IV.ly $(notes)

>     $(piece).pdf: $(piece).ly $(notes)

>     $(piece)-cello.pdf: $(piece)-cello.ly cello.ily
>     $(piece)-horn.pdf: $(piece)-horn.ly horn.ily
>     $(piece)-oboes.pdf: $(piece)-oboes.ly oboe.ily
>     $(piece)-viola.pdf: $(piece)-viola.ly viola.ily
>     $(piece)-violinOne.pdf: $(piece)-violinOne.ly violinOne.ily
>     $(piece)-violinTwo.pdf: $(piece)-violinTwo.ly violinTwo.ily

>     .PHONY: score
>     score: $(piece).pdf

>     .PHONY: parts
>     parts: $(piece)-cello.pdf \
>            $(piece)-violinOne.pdf \
>            $(piece)-violinTwo.pdf \
>            $(piece)-viola.pdf \
>            $(piece)-oboes.pdf \
>            $(piece)-horn.pdf

>     .PHONY: movements
>     movements: $(piece)I.pdf \
>                $(piece)II.pdf \
>                $(piece)III.pdf \
>                $(piece)IV.pdf

>     all: score parts movements

`次の `Makefile` は、LaTeX で処理する `lilypond-book` ドキュメント用です。このドキュメントは目次を持ちます。目次を作成するには、リンクを更新するために `latex` コマンドを 2 回実行する必要があります。.pdf 出力ファイルは `out` ディレクトリに保存され、HTML 出力ファイルは `htmlout` ディレクトリに保存されます。`

>     SHELL=/bin/sh
>     FILE=myproject
>     OUTDIR=out
>     WEBDIR=htmlout
>     VIEWER=acroread
>     BROWSER=firefox
>     LILYBOOK_PDF=lilypond-book --output=$(OUTDIR) --pdf $(FILE).lytex
>     LILYBOOK_HTML=lilypond-book --output=$(WEBDIR) $(FILE).lytex
>     PDF=cd $(OUTDIR) && pdflatex $(FILE)
>     HTML=cd $(WEBDIR) && latex2html $(FILE)
>     INDEX=cd $(OUTDIR) && makeindex $(FILE)
>     PREVIEW=$(VIEWER) $(OUTDIR)/$(FILE).pdf &

>     all: pdf web keep

>     pdf:
>             $(LILYBOOK_PDF)  # begin with tab
>             $(PDF)           # begin with tab
>             $(INDEX)         # begin with tab
>             $(PDF)           # begin with tab
>             $(PREVIEW)       # begin with tab

>     web:
>             $(LILYBOOK_HTML) # begin with tab
>             $(HTML)          # begin with tab
>             cp -R $(WEBDIR)/$(FILE)/ ./  # begin with tab
>             $(BROWSER) $(FILE)/$(FILE).html &  # begin with tab

>     keep: pdf
>             cp $(OUTDIR)/$(FILE).pdf $(FILE).pdf  # begin with tab

>     clean:
>             rm -rf $(OUTDIR) # begin with tab

>     web-clean:
>             rm -rf $(WEBDIR) # begin with tab

>     archive:
>             tar -cvvf myproject.tar \ # begin this line with tab
>             --exclude=out/* \
>             --exclude=htmlout/* \
>             --exclude=myproject/* \
>             --exclude=*midi \
>             --exclude=*pdf \
>             --exclude=*~ \
>             ../MyProject/*

`TODO: make this thing work on Windows`

`この `Makefile` は Windows では機能しません。Windows ユーザの代替手段として、ビルド コマンドを保持する簡単なバッチ ファイルを作成する方法があります。これは `Makefile` のように依存関係を保持できませんが、少なくともビルド処理を単一のコマンドに縮小します。以下のコードを `build.bat` あるいは `build.cmd` として保存してください。このバッチ ファイルは DOS プロンプトから実行することができ、単にそのアイコンをダブル クリックすることでも実行することができます。`

>     lilypond-book --output=out --pdf myproject.lytex
>     cd out
>     pdflatex myproject
>     makeindex myproject
>     pdflatex myproject
>     cd ..
>     copy out\myproject.pdf MyProject.pdf

#### 参照

`アプリケーションの使用方法: コマンド ラインの使用方法, lilypond-book`

他の言語: English, deutsch, español, français, magyar, italiano

#### LilyPond — 使用方法