GNU make를 사용하여 파일 목록 일치

GNU make를 사용하여 파일 목록 일치

GNU make를 사용하여 덜 기본적인 작업을 시도한 것은 이번이 처음입니다. 저는 Makefile의 기본 대상이 일치하는 여러 파일 이름 중 하나를 찾도록 하고 싶습니다. 이는 루트 tex 파일의 명명 체계라고 생각되며 다음과 같이 표현됩니다.

#!/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
}

이것을 makefile로 바꾸는 방법을 잘 모르겠습니다.

편집하다:

@G-Man은 내 질문이 기껏해야 불분명하다고 지적합니다. 바쁘고 내가 원하는 것이 무엇인지 모르는 것이 사실입니다. :makevim의 아름다운 자동 컴파일 플러그인을 사용하는 대신 게으른 시간을 보내고 싶습니다 .

요점은 JOBNAME내가 모든 (la|xe|lua)tex 프로젝트에 대해 Latexmk에 의존하는 공통 Makefile의 변수를 편집한 적이 있다는 것입니다. vim에서 존재하지 않는 파일인 main.tex letter.texcourse.tex 등을 열면 해당 스켈레톤 파일을 읽고 일반 Makefile을 복사하여 폴더 작동 조건 git init없이 파일을 생성하는 자동 명령이 실행됩니다. .git일반적으로 내 폴더에는 이러한 파일 중 하나만 있지만 .tex더 있을 수도 있습니다.

사전 컴파일 단계 때문에 makefile을 원합니다(사용mylatex 형식), 좀 더 세분화된 정리 명령 및 FILTER = 2>&1 | sed -n '/^\(Running\|Package\|Beginning\|Underfull\)/p;/^! /,$$p'컴파일러 명령 앞에 추가할 수 있는 것과 같은 것들이 있습니다. 예를 들어 사전 컴파일 단계에서는 @if ((grep -c endofdump $(TMP)/$(JOBNAME).tex 를 확인합니다 == 1 )); then ....

JOBNAME내 질문은 main.tex letter.texcourse.tex 등의 모든 파일이 동일한 종속성, 아마도 rsync 및 검사를 수행하는 사전 컴파일 단계 및 필요한 $JOBNAME.pdf컴파일 단계를 사용하여 처리 되도록 지정을 피하려는 게으른 시도를 통해 이해하는 것입니다. 수행.

${mainfiles[@]}나는 좋은 습관이라고 생각하는 것을 위해 중괄호를 사용합니다 . 나는 make가 이것을 확인할 것이라고 생각했기 때문에 포함 -f하고 테스트했습니다.-r

JOBNAME어쨌든 @meuh의 답변은 도움이 되었지만 유연성과 향후 사용으로 인해 편집이 여전히 더 나은 옵션이라고 생각하기 때문에 make 사용을 다시 검토하고 있습니다. 이제 vim의 강력한 기능을 사용하여 이를 변경합니다(참조github의 내 vim 저장소)

답변1

종속성이 없기 때문에 make를 특별히 잘 사용하는 것은 아니지만 나중에 추가할 수도 있으므로 다음과 같이 시작할 수 있습니다.

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

기본 대상은 main.tex등 입니다. 이 파일이나 다른 파일을 빌드하려면 종속성이 없으므로 파일의 존재 여부와 가독성을 테스트하는 한 줄 셸 스크립트를 실행한 다음 필요한 명령을 실행합니다. 이 else섹션의 목적은 파일이 존재하지 않는 경우 make가 오류와 함께 중지되지 않도록 하는 것입니다.

대상을 요구하는 것은 복잡합니다 .PHONY. 그렇지 않으면 파일이 존재할 때 make는 종속성이 존재하지 않는다는 것을 확인하고 아무 것도 하지 않을 것입니다. 이는 디렉터리에 있는 파일을 호출 한 경우 clean깨끗한 대상에도 적용됩니다 .

답변2

TeX에서 PDF를 만드는 방법을 알려면 간단한 Makefile이 필요한 것 같습니다.

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

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

.PHONY: all
.DELETE_ON_ERROR:

관련 정보