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
.