LilyPond: manuale d'uso del programma: 5.5 Make e Makefile

## 5.5 Make e Makefile

Tutte le piattaforme su cui LilyPond può essere installato supportano un software chiamato `make`. Questo software legge un file speciale chiamato `Makefile` che definisce quali file dipendono da quali altri e quali comandi occorra dare al sistema operativo per produrre un file da un altro. Ad esempio Makefile può spiegare come generare ‘`ballad.pdf`’ e ‘`ballad.midi`’ da ‘`ballad.ly`’ eseguendo LilyPond.

In alcune situazioni, è una buona idea creare un `Makefile` per il proprio progetto, per proprio comodo o come cortesia per quanti altri possano avere accesso ai file sorgente. Questo vale per i progetti molto ampi con tanti file inclusi e diverse opzioni di output (ad esempio, partitura completa, parti, partitura del direttore, riduzione per pianoforte, etc.) o per progetti che richiedono comandi difficili per la compilazione (come i progetti che usano `lilypond-book`). I Makefile variano molto in complessità e flessibilità, in base alle necessità e alle abilità degli autori. Il programma GNU Make è installato nelle distribuzioni GNU/Linux e su MacOS X ed è disponibile anche per Windows.

Si veda il Manuale di GNU Make per conoscere in dettaglio l’uso di `make`, dato che quel che segue dà solo un’idea delle sue potenzialità.

I comandi per definire delle regole in un Makefile cambiano in base alla piattaforma; ad esempio le varie distribuzioni di GNU/Linux e MacOS usano `bash`, mentre Windows usa `cmd`. Nota che su MacOS X è necessario configurare il sistema per usare l’interprete da linea di comando. Di seguito alcuni Makefile di esempio, con versioni sia per GNU/Linux/MacOS sia per Windows.

Il primo esempio è per una composizione per orchestra in quattro movimenti e presenta una directory strutturata come segue:

>     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-oboe.ly
>     |   |-- symphony-viola.ly
>     |   |-- symphony-violinOne.ly
>     |   `-- symphony-violinTwo.ly
>     |-- Scores/
>     |   |-- symphony.ly
>     |   |-- symphonyI.ly
>     |   |-- symphonyII.ly
>     |   |-- symphonyIII.ly
>     |   `-- symphonyIV.ly
>     `-- symphonyDefs.ily

I file ‘`.ly`’ nelle directory ‘`Scores`’ e ‘`Parts`’ prendono le note dai file ‘`.ily`’ nella directory ‘`Notes`’:

>     %%% inizio del file "symphony-cello.ly"
>     \include "../symphonyDefs.ily"
>     \include "../Notes/cello.ily"

Il Makefile avrà i target di `score` (l’intero brano in partitura completa), `movements` (singoli movimenti in partitura completa), e `parts` (singole parti per i musicisti). C’è anche un target `archive` che creerà un archivio compresso dei file sorgenti, utile per la condivisione via web o email. Ecco un esempio di Makefile per GNU/Linux e MacOS X. Dovrebbe essere salvato col nome `Makefile` nella directory principale del progetto:

Nota: Quando si definisce un target o una regola di pattern, le linee successive devono iniziare con i tabulatori, non con gli spazi.

>     # Il prefisso al nome dei file di output
>     piece := symphony
>     # Il comando per eseguire lilypond
>     LILY_CMD := lilypond -ddelete-intermediate-files \
>                         -dno-point-and-click

>     # I suffissi usati in questo Makefile.
>     .SUFFIXES: .ly .ily .pdf .midi

>     .DEFAULT_GOAL := score

>     PDFDIR := PDF
>     MIDIDIR := MIDI

>     # I file di input e di output vengono cercati nelle directory elencate
>     # nella variabile VPATH.  Tutte queste sono sottodirectory della directory
>     # corrente (assegnata dalla variabile `CURDIR' di GNU make).
>     VPATH := \
>       $(CURDIR)/Scores \
>       $(CURDIR)/Parts \
>       $(CURDIR)/Notes \
>       $(CURDIR)/$(PDFDIR) \
>       $(CURDIR)/$(MIDIDIR)

>     # La regola di pattern per creare i file PDF e MIDI da un file di input LY.
>     # I file di output .pdf vengono messi nella sottodirectory `PDF', mentre i file
>     # .midi vanno nella sottodirectory `MIDI'.
>     %.pdf %.midi: %.ly | $(PDFDIR) $(MIDIDIR)
>             $(LILY_CMD) $<            # questa linea inizia con una tabulazione
>             mv "$*.pdf" $(PDFDIR)/    # questa linea inizia con una tabulazione
>             mv "$*.midi" $(MIDIDIR)/  # questa linea inizia con una tabulazione

>     $(PDFDIR):
>             mkdir $(PDFDIR)

>     $(MIDIDIR):
>             mkdir $(MIDIDIR)

>     common := symphonyDefs.ily

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

>     # Le dipendenze dei movimenti.
>     $(piece)I.pdf: $(piece)I.ly $(notes) $(common)
>     $(piece)II.pdf: $(piece)II.ly $(notes) $(common)
>     $(piece)III.pdf: $(piece)III.ly $(notes) $(common)
>     $(piece)IV.pdf: $(piece)IV.ly $(notes) $(common)

>     # Le dipendenze della partitura completa.
>     $(piece).pdf: $(piece).ly $(notes) $(common)

>     # Le dipendenze delle parti.
>     $(piece)-cello.pdf: $(piece)-cello.ly cello.ily $(common)
>     $(piece)-horn.pdf: $(piece)-horn.ly horn.ily $(common)
>     $(piece)-oboe.pdf: $(piece)-oboe.ly oboe.ily $(common)
>     $(piece)-viola.pdf: $(piece)-viola.ly viola.ily $(common)
>     $(piece)-violinOne.pdf: $(piece)-violinOne.ly violinOne.ily $(common)
>     $(piece)-violinTwo.pdf: $(piece)-violinTwo.ly violinTwo.ily $(common)

>     # Lanciare `make score' per generare la partitura completa di tutti i quattro
>     # movimenti in un unico file.
>     .PHONY: score
>     score: $(piece).pdf

>     # Lanciare `make parts' per generare tutte le parti.
>     # Lanciare `make symphony-foo.pdf' per generare la parte per lo strumento `foo'.
>     # Esempio: `make symphony-cello.pdf'.
>     .PHONY: parts
>     parts: $(piece)-cello.pdf \
>            $(piece)-violinOne.pdf \
>            $(piece)-violinTwo.pdf \
>            $(piece)-viola.pdf \
>            $(piece)-oboe.pdf \
>            $(piece)-horn.pdf

>     # Lanciare `make movements' per generare i file per i
>     # quattro movimenti separatamente.
>     .PHONY: movements
>     movements: $(piece)I.pdf \
>                $(piece)II.pdf \
>                $(piece)III.pdf \
>                $(piece)IV.pdf

>     all: score parts movements

Ci sono alcune complicazioni specifiche della piattaforma Windows. Dopo aver scaricato e installato GNU Make per Windows, bisogna impostare il percorso corretto nelle variabili d’ambiente di sistema perché la shell DOS possa trovare il programma Make. Per farlo, clicca col tasto destro del mouse su "My Computer," poi scegli `Proprietà` e `Avanzate`. Clicca su `Variabili di ambiente`, e poi nel pannello `Variabili di Sistema`, nella sezione `Percorso`, clicca su `modifica` e aggiungi il percorso al file eseguibile GNU Make, che avrà un aspetto simile:

>     C:\Program Files\GnuWin32\bin

Lo stesso Makefile deve essere modificato per gestire diversi comandi shell e gli spazi che sono presenti in alcune directory predefinite di sistema. Windows ha una diversa estensione predefinita per i file midi.

>     ## VERSIONE DI WINDOWS
>     ##
>     piece := symphony
>     LILY_CMD := lilypond -ddelete-intermediate-files \
>                         -dno-point-and-click

>     #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

>     .DEFAULT_GOAL := score

>     PDFDIR := PDF
>     MIDIDIR := MIDI

>     VPATH := \
>       $(workdir)/Scores \
>       $(workdir)/Parts \
>       $(workdir)/Notes \
>       $(workdir)/$(PDFDIR) \
>       $(workdir)/$(MIDIDIR)

>     %.pdf %.mid: %.ly | $(PDFDIR) $(MIDIDIR)
>             $(LILY_CMD) $<                # questa linea inizia con una tabulazione
>             move /Y "$*.pdf" $(PDFDIR)/   # questa linea inizia con una tabulazione
>             move /Y "$*.mid" $(MIDIDIR)/  # questa linea inizia con una tabulazione

>     $(PDFDIR):
>         mkdir $(PDFDIR)/

>     $(MIDIDIR):
>         mkdir $(MIDIDIR)/

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

>     common := symphonyDefs.ily

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

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

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

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

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

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

>     all: score parts movements

Il Makefile seguente è per un documento `lilypond-book` fatto con LaTeX. Questo progetto ha un indice, dunque il comando `latex` deve essere eseguito due volte per aggiornare i collegamenti. I file di output sono tutti salvati nella directory `out` per i file .pdf e nella directory `htmlout` per i file html.

>     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)  # inizia con una tabulazione
>             $(PDF)           # inizia con una tabulazione
>             $(INDEX)         # inizia con una tabulazione
>             $(PDF)           # inizia con una tabulazione
>             $(PREVIEW)       # inizia con una tabulazione

>     web:
>             $(LILYBOOK_HTML) # inizia con una tabulazione
>             $(HTML)          # inizia con una tabulazione
>             cp -R $(WEBDIR)/$(FILE)/ ./  # inizia con una tabulazione
>             $(BROWSER) $(FILE)/$(FILE).html &  # inizia con una tabulazione

>     keep: pdf
>             cp $(OUTDIR)/$(FILE).pdf $(FILE).pdf  # inizia con una tabulazione

>     clean:
>             rm -rf $(OUTDIR) # inizia con una tabulazione

>     web-clean:
>             rm -rf $(WEBDIR) # inizia con una tabulazione

>     archive:
>             tar -cvvf myproject.tar \ # inizia questa linea con una tabulazione
>             --exclude=out/* \
>             --exclude=htmlout/* \
>             --exclude=myproject/* \
>             --exclude=*midi \
>             --exclude=*pdf \
>             --exclude=*~ \
>             ../MyProject/*

Il Makefile precedente non funziona su Windows. Un’alternativa per gli utenti Windows consiste nel creare un semplice file batch contenente i comandi per la compilazione. Questo file non terrà traccia delle dipendenze come fa invece un Makefile, ma almeno riduce il processo di compilazione a un solo comando. Salva il codice seguente come `build.bat` o `build.cmd`. Il file batch può essere eseguito nel prompt DOS o semplicemente con un doppio clic sulla sua icona.

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

#### Vedi anche

Questo manuale: Uso da linea di comando, Eseguire `lilypond-book`.

#### LilyPond — Utilizzo v2.24.4 (ramo stabile).