用 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
在一個文件夾中只有一個文件,但可能還有更多。由於預編譯步驟(使用mylatexformat)、一些更細粒度的清理命令以及類似的東西,我想要一個 makefile
FILTER = 2>&1 | sed -n '/^\(Running\|Package\|Beginning\|Underfull\)/p;/^! /,$$p'
,我可以在編譯器命令之前添加。例如,預編譯步驟檢查@if ((
grep -c endofdump $ (TMP)/ $ (工作名稱).tex== 1 )); then ...
。我的問題是在一個懶惰的嘗試中理解,以避免必須指定
JOBNAME
,以便任何文件 main.tex letter.tex course.tex 等都被處理相同的依賴關係,可能是一個 rsync 和一個執行檢查的預編譯步驟,以及需要進行的編譯步驟$JOBNAME.pdf
。我使用花括號
${mainfiles[@]}
作為我認為的好習慣。我包括了-f
and-r
測試,因為我假設 make 也會檢查這一點。無論如何,@meuh 的回答很有幫助,但我重新審視了我對 make 的使用,因為我認為
JOBNAME
由於靈活性和未來使用,它仍然是一個更好的選擇。我現在用 vim 的力量改變它(見我在 github 上的 vim repo)
這不是 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
etc。要建構該文件或其他文件,沒有依賴關係,因此執行單行 shell 腳本來測試文件的存在性和可讀性,然後執行所需的命令。這else
部分是為了在文件不存在時 make 不會因錯誤而停止。需要一個
.PHONY
目標是複雜的,否則當文件存在時,make 將看到沒有依賴關係並且什麼也不做。這也適用於乾淨的目標,以防您clean
在目錄中呼叫了一個文件。