5.5 Make と Makefile

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

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

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

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


GNU LilyPond – アプリケーション使用方法 v2.25.21 (開発版).