使用 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 指出我的问题充其量是不清楚的。确实我很着急,我也不知道自己想要什么。我想想偷懒,而:make不是使用 vim 中精美的自动编译插件。

关键是我曾经JOBNAME在一个通用 Makefile 中编辑一个变量,该 Makefile 依赖于我的所有 (la|xe|lua)tex 项目的 Latexmk。当我在 vim 中打开任何一个不存在的文件 main.tex letter.tex course.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.tex course.tex 等都使用相同的依赖项进行处理,可能是 rsync 和执行检查的预编译步骤,以及需要$JOBNAME.pdf进行的编译步骤。

我使用花括号是${mainfiles[@]}为了我认为很好的做法。我包含了-f-r测试,因为我认为 make 也会检查这一点。

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.texetc。要构建该文件或其他文件,没有依赖性,因此运行一行shell脚本来测试文件的存在性和可读性,然后运行所需的命令。该else部分的作用是,如果文件不存在,make 不会因错误而停止。

有一个需要.PHONY目标的复杂情况,否则当文件存在时 make 将看到不存在依赖关系并且不会执行任何操作。如果您clean在目录中调用了一个文件,这也适用于干净的目标。

答案2

听起来你只需要一个简单的 Makefile 来知道如何从 TeX 制作 PDF:

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

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

.PHONY: all
.DELETE_ON_ERROR:

相关内容