[RISOLTO] Problema makefile

  • Questo topic ha 8 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 13 anni fa da Elrond.
  • Creatore
    Topic
  • #88330
    Up
    0
    Down
    ::


    Salve a tutti. Ho un problema nella creazione di un makefile. Vorrei appunto un make file per compilare in un colpo solo tutte le immagini fatte con tikz salvate in un apposita cartella. Il problema è che sono riuscito a scrivere un file che me li compila solo una per volta (cioé ogni volta devo ridare il comando all’esterno) e non capisco perché, ma non controlla neanche se sono già compilati, quindi ricompila anche i file che non ho modificato. Ho risolto parzialmente sfruttando un ciclo for in cui mettevo poi il comando make, ma in tal modo specificare io quanti file deve compilare, mentre vorrei che leggesse da solo i nomi dei file dalla cartella (cosa che sono riuscito a fare) e che poi li compilasse solo se non c’è il corrispondente pdf o se il file è stato modificato. Di seguito vi posto il makefile da me creato. Grazie in anticipo per la vostra attenzione.

    `
    MAIN = zzz
    MAIN_TEX = $(MAIN).tex
    CAP_TEX = $(wildcard Capitoli/*.tex)
    MAIN_PDF = $(MAIN).PDF
    IMG_DIR = tikz
    IMG_PDF = $(wildcard $(IMG_DIR)/*.pdf)
    IMG_TIKZ = $(patsubst tikz/%.tikz, %.tikz , $(IMG_DIR)/*.tikz)
    IMG_TEX = $(patsubst tikz/%.tikz, %.tex , $(IMG_TIKZ))
    FILE_CLEAN = *.aux *.log *.bbl *.blg *.dvi *.gz *.out *.toc *.auxlock

    .PHONY: pdf clean

    pdf: $(MAIN_PDF)

    $(MAIN_PDF): $(MAIN_TEX) $(CAP_TEX)
    pdflatex -interaction=nonstopmode $(MAIN_TEX); pdflatex -interaction=nonstopmode $(MAIN_TEX); pdflatex -interaction=nonstopmode -synctex=1 $(MAIN_TEX)

    %.pdf: $(IMG_DIR)/%.tikz $(IMG_DIR)/Pacchetti.tex
    cd $(IMG_DIR); pdflatex $(shell basename $<); rm -f $(FILE_CLEAN) clean: rm -f $(FILE_CLEAN) `

Visualizzazione 7 filoni di risposte
  • Autore
    Risposte
    • #88331
      Up
      0
      Down
      ::


      Sicuramente c’è il problema che i PDF prodotti dai file TikZ non sono dipendenze dell’obiettivo [tt]MAIN_PDF[/tt], quindi la regola
      `$(MAIN_PDF): $(MAIN_TEX) $(CAP_TEX) $(IMG_PDF)`
      al posto di
      `$(MAIN_PDF): $(MAIN_TEX) $(CAP_TEX)`
      dovrebbe risolvere il problema (nota: non l’ho provato). Inoltre credo che gli obiettivi della seconda regola dovrebbero essere [tt]$(IMG_DIR)/%.pdf[/tt], non [tt]%.pdf[/tt], perché i file si troveranno nella cartella [tt]$(IMG_DIR)[/tt], è corretto?

      Un consiglio: i file di partenza nella cartella IMG_DIR sono i file [tt]*.tikz[/tt], non i PDF, quindi nell’elenco delle variabili scriverei
      `IMG_TIKZ = $(wildcard $(IMG_DIR)/*.tikz)
      IMG_PDF = $(patsubst tikz/%.tikz, %.pdf , $(IMG_DIR)/*.tikz)`

    • #88332
      Up
      0
      Down
      ::


      Anzitutto grazie per la tua tempestiva risposta. Ora, io ho modificato il file come hai detto tu, ma, dopo una compilazione, in cui mi ha saltato alcuni file (gli unici due di cui non ho ancora prodotto un pdf), mi restituisce il messaggio
      `
      make: *** Nessuna regola per generare l'obiettivo “10.pdf”, necessario per “zzz.PDF”. Arresto.
      `
      se tento ulteriormente di compilare.
      Non capisco perché si arresta. Non dovrebbe ignorare il file se questo soddisfa le condizioni? Grazie per la tua pazienza. Di seguito riporto il codice corretto con i tuoi consigli.
      `
      MAIN = zzz
      MAIN_TEX = $(MAIN).tex
      CAP_TEX = $(wildcard Capitoli/*.tex)
      MAIN_PDF = $(MAIN).PDF
      IMG_DIR = tikz
      IMG_TIKZ = $(wildcard $(IMG_DIR)/*.tikz)
      IMG_PDF = $(patsubst tikz/%.tikz, %.pdf , $(IMG_TIKZ))
      FILE_CLEAN = *.aux *.log *.bbl *.blg *.dvi *.gz *.out *.toc *.auxlock

      .PHONY: pdf clean

      pdf: $(MAIN_PDF)

      $(MAIN_PDF): $(MAIN_TEX) $(CAP_TEX) $(IMG_PDF)
      pdflatex -interaction=nonstopmode $(MAIN_TEX); pdflatex -interaction=nonstopmode $(MAIN_TEX); pdflatex -interaction=nonstopmode -synctex=1 $(MAIN_TEX)

      $(IMG_DIR)/%.pdf: $(IMG_DIR)/%.tikz $(IMG_DIR)/Pacchetti.tex
      cd $(IMG_DIR); pdflatex $(shell basename $<); rm -f $(FILE_CLEAN) clean: rm -f $(FILE_CLEAN) `

    • #88333
      Up
      0
      Down
      ::


      Scusa, è un errore mio, non mi ero accorto:
      `IMG_PDF = $(patsubst %.tikz, %.pdf , $(IMG_TIKZ))`
      La sostituzione è solo dell’estensione, com’era prima veniva eliminato anche il percorso.

    • #88334
      Up
      0
      Down
      ::


      Ora lo script è perfetto, grazie mille :D. Posso solo chiederti perché make compila anche l’obbiettivo $(IMG_DIR)/%.pdf =….? Perché se io non specifico niente dando solo make (o make pdf) il programma prende il primo obbiettivo di default. Grazie per l’eventuale risposta.

    • #88335
      Up
      0
      Down
      ::

      skevin93″ post=87775Ora lo script è perfetto, grazie mille :D. Posso solo chiederti perché make compila anche l’obbiettivo $(IMG_DIR)/%.pdf =….? Perché se io non specifico niente dando solo make (o make pdf) il programma prende il primo obbiettivo di default. Grazie per l’eventuale risposta.

      Non sono sicuro di aver compreso la domanda: vuoi sapere perché venga eseguita la seconda regola ([tt]$(IMG_DIR)/%.pdf[/tt]) anche quando esegui solo [tt]make[/tt] senza specificare l’obiettivo? In questo caso la risposta è: «è così che funziona make ed è per questo che è utile». [tt]$(MAIN_PDF)[/tt] dipende dai file [tt]$(IMG_DIR)/%.pdf[/tt], se questi non sono aggiornati (cioè sono più vecchi dei loro prerequisiti) allora make prima di eseguire la regola associata a [tt]$(MAIN_PDF)[/tt] aggiornerà i file [tt]$(IMG_DIR)/%.pdf[/tt]. L’utilità è che queste regole ([tt]$(IMG_DIR)/%.pdf[/tt]) saranno eseguite, senza bisogno di invocarle manualmente, solo quando necessario, con un bel risparmio di tempo. Se hai un Makefile ben organizzato ti basta sempre eseguire solo [tt]make[/tt] senza preoccuparti di specificare tutte le regole, per aggiornare il tuo progetto.

      Noto che per gestire le immagini TikZ hai adottato lo stesso approccio che ultimamente sto usando io, cioè quello di realizzarle in un file separati dal sorgente del documento principale. Per velocizzare leggermente la compilazione delle immagini, però, invece di includere il preambolo, come immagino stia facendo tu usando il file [tt]$(IMG_DIR)/Pacchetti.tex[/tt], creo un file di formato a partire dal preambolo comune delle figure. Così risparmio circa 2-3 secondi per immagine 🙂

      Visto che sei interessato ai Makefile, se non l’avessi vista qui c’è una semplice guida introduttiva proprio orientata ai documenti LaTeX: /wp-content/uploads/joomla-images/doc/GuideGuIT/guidamake.pdf Se c’è qualcosa di poco chiaro chiedi pure 😉

    • #88336
      Up
      0
      Down
      ::


      La guida è proprio quella che ho seguito per “creare” questo file (ho praticamente scopiazzato una sezione che trattava proprio questo argomento :D). Comunque grazie per la tua disponibilità, sei stato chiaro. Mi sono confuso perché partivo da un’ottica sbagliata, più da programmi come pascal e simili.

      Effettivamente ho inserito un richiamo in ogni file al preambolo comune “Pacchetto.tex”. Proverò a cercare come creare un file di formato. In questo modo evito che il programma pdflatex ricarichi tutte le volte i pacchetti? (Scusa se ti assillo, ma voglio avere ben chiaro cosa posso fare e sopratutto capire cosa fanno i vari comandi per usarli al meglio) 8)

    • #88337
      Up
      0
      Down
      ::


      Niente ho trovato questa discussione sul forum che spiega bene cosa sono e come si ottengono. Grazie comunque del tuo aiuto e dei consigli, sono ottimi spunti per cominciare a studiare questo ambito che mi interessa.

    • #88338
      Up
      0
      Down
      ::

      skevin93″ post=87777Effettivamente ho inserito un richiamo in ogni file al preambolo comune “Pacchetto.tex”. Proverò a cercare come creare un file di formato. In questo modo evito che il programma pdflatex ricarichi tutte le volte i pacchetti? (Scusa se ti assillo, ma voglio avere ben chiaro cosa posso fare e sopratutto capire cosa fanno i vari comandi per usarli al meglio) 8)

      Sì, esatto. Le due regole che uso nel mio Makefile sono (adattalo al tuo caso)
      `%.pdf: %.tikz preambolo.fmt
      pdflatex $< preambolo.fmt: preambolo.tex pdflatex -ini -jobname="preambolo" "&pdflatex preambolo.tex\dump"` La prima è essenzialmente uguale alla tua, solo che al posto di [tt]Pacchetti.tex[/tt] c'è il file di formato, la seconda regola serve per creare il file di formato.

Visualizzazione 7 filoni di risposte
  • Devi essere connesso per rispondere a questo topic.

Go to top