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 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
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-oboes.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 ../definitions.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
# Determinazione del numero dei processori
CPU_CORES=`cat /proc/cpuinfo | grep -m1 "cpu cores" | sed s/".*: "//`
# Il comando per eseguire lilypond
LILY_CMD = lilypond -ddelete-intermediate-files \
-dno-point-and-click -djob-count=$(CPU_CORES)
# I suffissi usati in questo Makefile.
.SUFFIXES: .ly .ily .pdf .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)/PDF \
$(CURDIR)/Parts \
$(CURDIR)/Notes
# 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
$(LILY_CMD) $<; \ # questa linea inizia con una tabulazione
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
# Le dipendenze dei movimenti.
$(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)
# Le dipendenze della partitura completa.
$(piece).pdf: $(piece).ly $(notes)
# Le dipendenze delle parti.
$(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
# 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 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)-oboes.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
archive:
tar -cvvf stamitz.tar \ # questa linea inizia con una tabulazione
--exclude=*pdf --exclude=*~ \
--exclude=*midi --exclude=*.tar \
../Stamitz/*
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. Il target archive target viene tolto perché Windows
non ha il comando tar; inoltre 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 \
-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) $< # questa linea inizia con una tabulazione
if exist "$*.pdf" move /Y "$*.pdf" PDF/
if exist "$*.mid" move /Y "$*.mid" MIDI/
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
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
Other languages: English, deutsch, español, français, magyar, 日本語.