correspondendo a uma lista de arquivos com o GNU make

0

Esta é a primeira vez que uso o GNU make para tentar fazer algo um pouco menos básico. Eu gostaria que o alvo padrão de um Makefile fosse procurar por qualquer um dos vários nomes de arquivos correspondentes, um esquema de nomenclatura para o que eu considero serem arquivos de raiz do tex, expressos assim:

#!/usr/bin/env bash
# this is just a sketch, I know this is inaccurate
# and simplified by make's standard...

# mainfiles := main letter report course
mainfiles=(main letter report course)

_readable(){
  if ([ -f "$1" ] && [ -r "$1" ]); then
    return 0
  fi
  return 1
}

# how to make all of these existing targets using GNU make?
# all: $(patsubst %, %.tex, $$(mainfiles))
all() {
  for base in $mainfiles[@]; do
    if _readable "${base}.tex"; then
      latexmk -pdfxe "${base}.tex"
    fi
  done
}

# clean:
#   latexmk -c
clean(){
  latexmk -c
}

Não sei como transformar isso em um makefile.

edit:

@ G-Man apontou que minha pergunta não era clara na melhor das hipóteses. De fato, eu estava com pressa e não sei exatamente o que quero. Eu acho que quero ser preguiçoso, e usar :make em vez dos plugins autocompile fantasia do vim.

O ponto é que eu costumava editar uma variável JOBNAME em um Makefile genérico que depende do latexmk para todos os meus projetos tex (la | xe | lua). Quando eu abro um dos arquivos não existentes main.tex letter.tex course.tex etc no vim, eu faço com que ele ative um autocommand para ler em um arquivo de esqueleto correspondente, copie sobre meu Makefile genérico e execute git init se não houver .git pasta. Normalmente eu tenho apenas um desses arquivos .tex em uma pasta, mas pode haver mais deles.

Eu quero um makefile por causa de uma etapa de pré-compilação (usando mylatexformat ), alguns comandos de limpeza mais granulares e algo parecido com um FILTER = 2>&1 | sed -n '/^\(Running\|Package\|Beginning\|Underfull\)/p;/^! /,$$p' que eu posso acrescentar aos comandos do compilador. A etapa de pré-compilação, por exemplo, verifica @if (( grep -c endofdump $ (TMP) / $ (JOBNAME) .tex == 1 )); then ... .

Minha pergunta deve ser entendida em uma tentativa preguiçosa de evitar ter que especificar JOBNAME , de modo que qualquer um dos arquivos main.tex letter.tex course.tex etc sejam tratados com as mesmas dependências, possivelmente um rsync e um etapa de pré-compilação que executa verificações e uma etapa de compilação que requer que $JOBNAME.pdf seja feita.

Eu uso chaves em ${mainfiles[@]} para o que eu acho que é uma boa prática. Eu incluí o teste -f e -r porque eu suponho que faça verificações também.

De qualquer forma, a resposta do @hom foi útil, mas eu revisitei meu uso do make, pois acho que continua sendo uma escolha melhor apenas editar JOBNAME por causa da flexibilidade e uso futuro. Agora mudo-o com o poder do vim (consulte meu repositório do vim no github )

    
por Bart 20.09.2018 / 20:39

2 respostas

1

Este não é um uso particularmente bom de make, já que não há dependências, mas talvez você as adicione mais tarde, então aqui está um possível começo:

MAINFILES = main letter report course
T = $(addsuffix .tex,$(MAINFILES))

default: ${T}
${T}:
        @if [ -f "$@" -a -r "$@" ]; then latexmk -pdfxe "$@"; else :;fi
clean:
        latexmk -c
.PHONY: ${T} clean

O alvo padrão é main.tex etc. Para construir esse arquivo ou os outros não há dependências, então o script de shell de uma linha é executado para fazer o teste de existência e legibilidade do arquivo, então o comando desejado é executado. A parte else é para que make não pare com um erro se o arquivo não existir.

Há uma complicação que precisa de um .PHONY target, caso contrário, quando os arquivos existirem, o make verá que não há dependência e não fará nada. Isso também se aplica ao alvo limpo, caso você tenha um arquivo chamado clean no diretório.

    
por 20.09.2018 / 21:17
0

Parece que você só precisa de um Makefile simples que saiba como fazer PDF a partir do TeX:

all: $(patsubst %.tex,%.pdf,$(wildcard *.tex))

%.pdf: %.tex
        latexmk -pdfxe $<

.PHONY: all
.DELETE_ON_ERROR:
    
por 27.09.2018 / 12:33

Tags