簡體   English   中英

如何制作將相同命令應用於子目錄的單個makefile?

[英]How to make a single makefile that applies the same command to sub-directories?

為了清楚起見,我在Windows上使用GnuWin32 make運行它。

我有一組目錄,其中的markdown文件位於幾個不同的級別上-理論上它們可以在分支節點中,但是我認為當前它們僅在葉節點中。 我有一組pandoc / LaTeX命令可以運行,以將markdown文件轉換為PDF-顯然,僅當markdown文件已更新時才想重新創建PDF,因此makefile似乎合適。

我想要的是根目錄中的單個makefile ,它遍歷所有子目錄(至任何深度)並應用我將為運行pandoc指定的make規則。

根據我的發現, recursive makefiles要求您在每個子目錄中都有一個makefile (這似乎是我要避免的管理開銷)和/或要求您列出所有子目錄在makefile的開頭(再次,寧願避免這種情況)。

理論文件夾結構:

root
|-make
|-Folder AB
|   |-File1.md
|   \-File2.md
|-Folder C
| \-File3.md
\-Folder D
  |-Folder E
  | \-File4.md
  |-Folder F
    \-File5.md

如何編寫一個makefile來處理這種情況?

這是一小套Makefile規則,希望它們能助您一臂之力

%.pdf : %.md
        pandoc -o $@ --pdf-engine=xelatex $^

PDF_FILES=FolderA/File1.pdf FolderA/File2.pdf \
   FolderC/File3.pdf FolderD/FolderE/File4.pdf FolderD/FolderF/File5.pdf

all: ${PDF_FILES}

讓我解釋一下這是怎么回事。 首先,我們有一個模式規則,該規則告訴make如何將Markdown文件轉換為PDF文件。 --pdf-engine=xelatex選項僅在此處用於說明目的。

然后,我們需要告訴Make要考慮哪些文件。 我們將名稱放到單個變量PDF_FILES 可以通過掃描所有子目錄中的.md文件的單獨腳本來構建此變量的此值。

請注意 ,如果文件名或目錄名稱包含空格,則必須格外小心。

然后,我們要求Make檢查是否應更新任何PDF_FILES

如果您的makefile中還有其他目標,請確保all是第一個非模式目標,或將make稱為make all

更新Makefile

如果shell函數對您有用,並且sed和find等基本實用程序可用,則可以使一行的makefile動態化。

%.pdf : %.md
        pandoc -o $@ --pdf-engine=xelatex $^

PDF_FILES:=$(shell find -name "*.md" | xargs echo | sed 's/\.md/\.pdf/g' )
all: ${PDF_FILES}

MadScientist在評論中建議

否則,您可以使用操作系統上可用的工具來實現腳本,並添加其他目標update:它將計算文件列表,並將以PDF_FILES開頭的行替換為更新的文件列表。

基於@DmitiChubarov和@MadScientist的建議,適用於Windows的代碼的最終版本如下:

%.pdf: %.md
    pandoc $^ -o $@

PDF_FILES:=$(shell dir /s /b *.md | sed "s/\.md/\.pdf/g")

all: ${PDF_FILES}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM