GNU makeを使用したファイルリストの一致

GNU makeを使用したファイルリストの一致

GNU makeを使ってあまり基本的な操作をしようとしたのは今回が初めてです。私はMakefileのデフォルトのターゲットが一致するいくつかのファイル名の1つを見つけるようにしたいと思います。これはルート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通常、私のフォルダにはこれらのファイルのうちの1つだけがありますが、さらに存在する可能性.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背中です。このファイルや他のファイルをビルドするには依存関係がないため、ファイルの存在と可読性をテストする1行のシェルスクリプトを実行してから、必要なコマンドを実行します。このelseセクションの目的は、ファイルが存在しない場合にmakeがエラーで停止しないようにすることです。

ターゲットを要求するのは複雑です.PHONY。そうでなければ、ファイルが存在するとき、makeは依存関係が存在しないことを確認し、何もしません。これは、ディレクトリ内のファイルを呼び出すとクリーンなcleanターゲットにも当てはまります。

答え2

TeXでPDFを作成する方法を知るには、単純なMakefileが必要なようです。

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

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

.PHONY: all
.DELETE_ON_ERROR:

関連情報