如何多次调用Makefile配方/规则?

如何多次调用Makefile配方/规则?,makefile,latex,pdflatex,biblatex,Makefile,Latex,Pdflatex,Biblatex,以下面的例子: .PHONY: hook1 hook2 # Default target all: hook1 hook2 hook1 echo "Calling all" hook1: echo "Calling hook1" hook2: echo "Calling hook2" 我得到了输出: $ make echo "Calling hook1" Calling hook1 echo "Calling hook2" Calling hook2 echo "

以下面的例子:

.PHONY: hook1 hook2

# Default target
all: hook1 hook2 hook1
    echo "Calling all"

hook1:
    echo "Calling hook1"

hook2:
    echo "Calling hook2"
我得到了输出:

$ make
echo "Calling hook1"
Calling hook1
echo "Calling hook2"
Calling hook2
echo "Calling all"
Calling all
$ make biber
This is pdfTeX, Version 3.14159265-2.6-1.40.18 (MiKTeX 2.9.6400)
entering extended mode
gross execution time: 62751 ms

user mode: 58406 ms, kernel mode: 1359 ms, total: 59765
INFO - This is Biber 2.7
INFO - Logfile is 'setup/cache/thesis.blg'
INFO - Reading 'setup/cache/thesis.bcf'
INFO - Found 14 citekeys in bib section 0
INFO - Processing section 0
INFO - Looking for bibtex format file 'modeloreferences.bib' for section 0
INFO - Decoding LaTeX character macros into UTF-8
INFO - Found BibTeX data source 'modeloreferences.bib'
INFO - Overriding locale 'pt-BR' defaults 'normalization = NFD' with 'normalization = prenormalized'
INFO - Overriding locale 'pt-BR' defaults 'variable = shifted' with 'variable = non-ignorable'
INFO - Sorting list 'nty/global/' of type 'entry' with scheme 'nty' and locale 'pt-BR'
INFO - No sort tailoring available for locale 'pt-BR'
INFO - Writing 'setup/cache/thesis.bbl' with encoding 'UTF-8'
INFO - Output to setup/cache/thesis.bbl
Could not calculate the seconds to run
但我希望它调用规则
hook1
两次。这是因为在Latex上,我需要使用相同的命令行多次调用相同的程序。然后我想重复使用make规则。例如,我希望上面的最小代码以如下方式运行:

$ make
echo "Calling hook1"
Calling hook1
echo "Calling hook2"
Calling hook2
echo "Calling hook1"
Calling hook1
echo "Calling all"
Calling all
两次调用相同的规则。这是我完整的主Makefile代码下面的代码,如果有人感兴趣的话。我试图创建虚拟规则
pdflatex\u hook1
pdflatex\u hook2
,这样我就可以执行调用层次结构
pdflatex\u hook biber\u hook pdflatex\u hook
,但这并没有愚弄
make
,它仍然忽略我上次对
pdflatex\u hook2
的调用:

#!/usr/bin/make -f
# https://stackoverflow.com/questions/7123241/makefile-as-an-executable-script-with-shebang
ECHOCMD:=/bin/echo -e

# The main latex file
THESIS_MAIN_FILE = modelomain.tex

# This will be the pdf generated
THESIS_OUTPUT_NAME = thesis

# This is the folder where the temporary files are going to be
CACHE_FOLDER = setup/cache

# Find all files ending with `main.tex`
LATEX_SOURCE_FILES := $(wildcard *main.tex)

# Create a new variable within all `LATEX_SOURCE_FILES` file names ending with `.pdf`
LATEX_PDF_FILES := $(LATEX_SOURCE_FILES:.tex=.pdf)


# GNU Make silent by default
# https://stackoverflow.com/questions/24005166/gnu-make-silent-by-default
MAKEFLAGS += --silent
.PHONY: clean pdflatex_hook1 pdflatex_hook2 %.pdf %.tex

# How do I write the 'cd' command in a makefile?
# http://stackoverflow.com/questions/1789594/how-do-i-write-the-cd-command-in-a-makefile
.ONESHELL:

# Default target
all: biber


##
## Usage:
##   make <target>
##
## Targets:
##   biber             build the main file with bibliography pass
##   pdflatex          build the main file with no bibliography pass
##

# Print the usage instructions
# https://gist.github.com/prwhite/8168133
help:
    @fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##//'


# Where to find official (!) and extended documentation for tex/latex's commandline options (especially -interaction modes)?
# https://tex.stackexchange.com/questions/91592/where-to-find-official-and-extended-documentation-for-tex-latexs-commandlin
PDF_LATEX_COMMAND = pdflatex --time-statistics --synctex=1 -halt-on-error -file-line-error
LATEX = $(PDF_LATEX_COMMAND)\
--interaction=batchmode\
-jobname="$(THESIS_OUTPUT_NAME)"\
-output-directory="$(CACHE_FOLDER)"\
-aux-directory="$(CACHE_FOLDER)"


# Run pdflatex, biber, pdflatex
biber: biber_hook pdflatex_hook2

    # Calculate the elapsed seconds and print them to the screen
    . ./setup/scripts/timer_calculator.sh
    showTheElapsedSeconds "$(current_dir)"

# Internally called rule which does not attempt to show the elapsed time
biber_hook: pdflatex_hook1

    # Creates the shell variable `current_dir` within the current folder path
    $(eval current_dir := $(shell pwd)) echo $(current_dir) > /dev/null

    biber "$(CACHE_FOLDER)/$(THESIS_OUTPUT_NAME)"


# This rule will be called for every latex file and pdf associated
pdflatex: $(LATEX_PDF_FILES)

    # Calculate the elapsed seconds and print them to the screen
    . ./setup/scripts/timer_calculator.sh
    showTheElapsedSeconds "$(current_dir)"

# Not show the elapsed time when called internally
pdflatex_hook1: $(LATEX_PDF_FILES)
pdflatex_hook2: $(LATEX_PDF_FILES)


%.pdf: %.tex

    # Start counting the compilation time and import its shell functions
    . ./setup/scripts/timer_calculator.sh

    # Creates the shell variable `current_dir` within the current folder path
    $(eval current_dir := $(shell pwd)) echo $(current_dir) > /dev/null

    @$(LATEX) $<
    cp $(CACHE_FOLDER)/$(THESIS_OUTPUT_NAME).pdf $(current_dir)/$(THESIS_OUTPUT_NAME).pdf
缺少对规则
pdflatex_hook2
的第二次调用,仅执行对
pdflatex_hook1
的第一次调用`

我已经知道并使用了
latexmk
,但是对于上面的
biber
,我想按原样做这些调用。对于
latexmk
我使用以下配方/规则:

thesis: $(THESIS_MAIN_FILE)

    # Start counting the compilation time and import its shell functions
    . ./setup/scripts/timer_calculator.sh

    # Creates the shell variable `current_dir` within the current folder path
    $(eval current_dir := $(shell pwd)) echo $(current_dir) > /dev/null

    # What is the difference between “-interaction=nonstopmode” and “-halt-on-error”?
    # https://tex.stackexchange.com/questions/258814/what-is-the-difference-between-interaction-nonstopmode-and-halt-on-error
    #
    # What reasons (if any) are there for compiling in interactive mode?
    # https://tex.stackexchange.com/questions/25267/what-reasons-if-any-are-there-for-compiling-in-interactive-mode
    latexmk \
    -pdf \
    -silent \
    -jobname="$(THESIS_OUTPUT_NAME)" \
    -output-directory="$(CACHE_FOLDER)" \
    -aux-directory="$(CACHE_FOLDER)" \
    -pdflatex="$(PDF_LATEX_COMMAND) --interaction=batchmode" \
    -use-make $(THESIS_MAIN_FILE)

    # Copy the generated PDF file from the cache folder
    cp $(CACHE_FOLDER)/$(THESIS_OUTPUT_NAME).pdf $(current_dir)/$(THESIS_OUTPUT_NAME).pdf

    # Calculate the elapsed seconds and print them to the screen
    showTheElapsedSeconds "$(current_dir)"

相关问题:


  • 要回答您最初的问题:

    .PHONY: hook1 hook2
    
    # Default target
    all: hook1a hook2 hook1b
        echo "Calling all"
    
    hook1a hook1b:
        echo "Calling hook1"
    
    hook2:
        echo "Calling hook2"
    
    生成以下输出:

    echo "Calling hook1"
    Calling hook1
    echo "Calling hook2"
    Calling hook2
    echo "Calling hook1"
    Calling hook1
    echo "Calling all"
    Calling all
    

    所示,基于答案,我用双递归修复了我的主脚本:

    #!/usr/bin/make -f
    # https://stackoverflow.com/questions/7123241/makefile-as-an-executable-script-with-shebang
    ECHOCMD:=/bin/echo -e
    
    # The main latex file
    THESIS_MAIN_FILE = modelomain.tex
    
    # This will be the pdf generated
    THESIS_OUTPUT_NAME = thesis
    
    # This is the folder where the temporary files are going to be
    CACHE_FOLDER = setup/cache
    
    # Find all files ending with `main.tex`
    LATEX_SOURCE_FILES := $(wildcard *main.tex)
    
    # Create a new variable within all `LATEX_SOURCE_FILES` file names ending with `.pdf`
    LATEX_PDF_FILES := $(LATEX_SOURCE_FILES:.tex=.pdf)
    
    
    # GNU Make silent by default
    # https://stackoverflow.com/questions/24005166/gnu-make-silent-by-default
    MAKEFLAGS += --silent
    .PHONY: clean biber pdflatex_hook1 pdflatex_hook2
    
    # How do I write the 'cd' command in a makefile?
    # http://stackoverflow.com/questions/1789594/how-do-i-write-the-cd-command-in-a-makefile
    .ONESHELL:
    
    # Default target
    all: thesis
    
    
    ##
    ## Usage:
    ##   make <target>
    ##
    ## Targets:
    ##   all        call the `thesis` make rule
    ##   biber      build the main file with bibliography pass
    ##   latex      build the main file with no bibliography pass
    ##   thesis     completely build the main file with minimum output logs
    ##   verbose    completely build the main file with maximum output logs
    ##
    
    # Print the usage instructions
    # https://gist.github.com/prwhite/8168133
    help:
        @fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##//'
    
    
    # Where to find official (!) and extended documentation for tex/latex's commandline options (especially -interaction modes)?
    # https://tex.stackexchange.com/questions/91592/where-to-find-official-and-extended-documentation-for-tex-latexs-commandlin
    PDF_LATEX_COMMAND = pdflatex --time-statistics --synctex=1 -halt-on-error -file-line-error
    LATEX = $(PDF_LATEX_COMMAND)\
    --interaction=batchmode\
    -jobname="$(THESIS_OUTPUT_NAME)"\
    -output-directory="$(CACHE_FOLDER)"\
    -aux-directory="$(CACHE_FOLDER)"
    
    
    # Run pdflatex, biber, pdflatex
    biber: start_timer pdflatex_hook1 biber_hook pdflatex_hook2
    
        # Creates the shell variable `current_dir` within the current folder path
        $(eval current_dir := $(shell pwd)) echo $(current_dir) > /dev/null
    
        # Copies the PDF to the current folder
        cp $(CACHE_FOLDER)/$(THESIS_OUTPUT_NAME).pdf $(current_dir)/$(THESIS_OUTPUT_NAME).pdf
    
        # Calculate the elapsed seconds and print them to the screen
        . ./setup/scripts/timer_calculator.sh
        showTheElapsedSeconds "$(current_dir)"
    
    
    start_timer:
    
        # Start counting the elapsed seconds to print them to the screen later
        . ./setup/scripts/timer_calculator.sh
    
    
    # Internally called rule which does not attempt to show the elapsed time
    biber_hook:
    
        # Creates the shell variable `current_dir` within the current folder path
        $(eval current_dir := $(shell pwd)) echo $(current_dir) > /dev/null
    
        # Call biber to process the bibliography
        biber "$(CACHE_FOLDER)/$(THESIS_OUTPUT_NAME)"
    
    
    # How to call Makefile recipe/rule multiple times?
    # https://stackoverflow.com/questions/46135614/how-to-call-makefile-recipe-rule-multiple-times
    pdflatex_hook1 pdflatex_hook2:
    
        @$(LATEX) $(LATEX_SOURCE_FILES)
    
    
    # This rule will be called for every latex file and pdf associated
    latex: $(LATEX_PDF_FILES)
    
        # Calculate the elapsed seconds and print them to the screen
        . ./setup/scripts/timer_calculator.sh
        showTheElapsedSeconds "$(current_dir)"
    
    
    # Dynamically generated recipes for all PDF and latex files
    %.pdf: %.tex
    
        # Start counting the compilation time and import its shell functions
        . ./setup/scripts/timer_calculator.sh
    
        # Creates the shell variable `current_dir` within the current folder path
        $(eval current_dir := $(shell pwd)) echo $(current_dir) > /dev/null
    
        @$(LATEX) $<
        cp $(CACHE_FOLDER)/$(THESIS_OUTPUT_NAME).pdf $(current_dir)/$(THESIS_OUTPUT_NAME).pdf
    
    
    thesis: $(THESIS_MAIN_FILE)
    
        # Start counting the compilation time and import its shell functions
        . ./setup/scripts/timer_calculator.sh
    
        # Creates the shell variable `current_dir` within the current folder path
        $(eval current_dir := $(shell pwd)) echo $(current_dir) > /dev/null
    
        # What is the difference between “-interaction=nonstopmode” and “-halt-on-error”?
        # https://tex.stackexchange.com/questions/258814/what-is-the-difference-between-interaction-nonstopmode-and-halt-on-error
        #
        # What reasons (if any) are there for compiling in interactive mode?
        # https://tex.stackexchange.com/questions/25267/what-reasons-if-any-are-there-for-compiling-in-interactive-mode
        latexmk \
        -pdf \
        -silent \
        -jobname="$(THESIS_OUTPUT_NAME)" \
        -output-directory="$(CACHE_FOLDER)" \
        -aux-directory="$(CACHE_FOLDER)" \
        -pdflatex="$(PDF_LATEX_COMMAND) --interaction=batchmode" \
        -use-make $(THESIS_MAIN_FILE)
    
        # Copy the generated PDF file from the cache folder
        cp $(CACHE_FOLDER)/$(THESIS_OUTPUT_NAME).pdf $(current_dir)/$(THESIS_OUTPUT_NAME).pdf
    
        # Calculate the elapsed seconds and print them to the screen
        showTheElapsedSeconds "$(current_dir)"
    
    
    verbose: $(THESIS_MAIN_FILE)
    
        # Start counting the compilation time and import its shell functions
        . ./setup/scripts/timer_calculator.sh
    
        # Creates the shell variable `current_dir` within the current folder path
        $(eval current_dir := $(shell pwd)) echo $(current_dir) > /dev/null
    
        # What is the difference between “-interaction=nonstopmode” and “-halt-on-error”?
        # https://tex.stackexchange.com/questions/258814/what-is-the-difference-between-interaction-nonstopmode-and-halt-on-error
        #
        # What reasons (if any) are there for compiling in interactive mode?
        # https://tex.stackexchange.com/questions/25267/what-reasons-if-any-are-there-for-compiling-in-interactive-mode
        latexmk \
        -pdf \
        -jobname="$(THESIS_OUTPUT_NAME)" \
        -output-directory="$(CACHE_FOLDER)" \
        -aux-directory="$(CACHE_FOLDER)" \
        -pdflatex="$(PDF_LATEX_COMMAND) --interaction=nonstopmode" \
        -use-make $(THESIS_MAIN_FILE)
    
        # Copy the generated PDF file from the cache folder
        cp $(CACHE_FOLDER)/$(THESIS_OUTPUT_NAME).pdf $(current_dir)/$(THESIS_OUTPUT_NAME).pdf
    
        # Calculate the elapsed seconds and print them to the screen
        showTheElapsedSeconds "$(current_dir)"
    
    
    # Using Makefile to clean subdirectories
    # https://stackoverflow.com/questions/26007005/using-makefile-to-clean-subdirectories
    #
    # Exclude directory from find . command
    # https://stackoverflow.com/questions/4210042/exclude-directory-from-find-command
    GARBAGE_TYPES := "*.gz(busy)" *.aux *.log *.pdf *.aux *.bbl *.log *.out *.toc *.dvi *.blg\
    *.synctex.gz *.fdb_latexmk *.fls *.lot *.lol *.lof *.idx
    
    DIRECTORIES_TO_CLEAN  := $(shell /bin/find -not -path "./**.git**" -not -path "./pictures**" -type d)
    GARBAGE_TYPED_FOLDERS := $(foreach DIR, $(DIRECTORIES_TO_CLEAN), $(addprefix $(DIR)/,$(GARBAGE_TYPES)))
    
    clean:
        rm -rfv $(GARBAGE_TYPED_FOLDERS)
    
    
    # veryclean:
    #   git clean -dxf
    
    #/usr/bin/make-f
    # https://stackoverflow.com/questions/7123241/makefile-as-an-executable-script-with-shebang
    ECHOCMD:=/bin/echo-e
    #主latex文件
    论文\u MAIN\u文件=modelomain.tex
    #这将是生成的pdf
    论文\输出\名称=论文
    #这是临时文件将存放的文件夹
    CACHE\u FOLDER=设置/缓存
    #查找以“main.tex”结尾的所有文件`
    LATEX_源文件:=$(通配符*main.tex)
    #在所有以“.pdf”结尾的“LATEX\u源文件”文件名中创建一个新变量`
    LATEX_PDF_文件:=$(LATEX_源文件:.tex=.PDF)
    #默认情况下,GNU保持沉默
    # https://stackoverflow.com/questions/24005166/gnu-make-silent-by-default
    MAKEFLAGS+=--静默
    .假冒:清洁biber pdflatex_hook1 pdflatex_hook2
    #如何在makefile中写入'cd'命令?
    # http://stackoverflow.com/questions/1789594/how-do-i-write-the-cd-command-in-a-makefile
    .ONESHELL:
    #默认目标
    全部:论文
    ##
    ##用法:
    ##制造
    ##
    ##目标:
    ##所有人都称“论文”为规则
    ##biber使用书目通行证构建主文件
    ##latex构建主文件时没有参考书目传递
    ##论文以最少的输出日志完整地构建了主文件
    ##详细使用最大输出日志完全构建主文件
    ##
    #打印使用说明
    # https://gist.github.com/prwhite/8168133
    帮助:
    @fgrep-h“##”$(生成文件列表)| fgrep-v fgrep | sed-e的/\\$/'| sed-e的/\\\$/'
    #在哪里可以找到tex/latex命令行选项(特别是交互模式)的官方(!)和扩展文档?
    # https://tex.stackexchange.com/questions/91592/where-to-find-official-and-extended-documentation-for-tex-latexs-commandlin
    PDF_LATEX_COMMAND=pdflatex—时间统计信息—synctex=1—出错时暂停—文件行错误
    LATEX=$(PDF\u LATEX\u命令)\
    --交互=批处理模式\
    -jobname=“$(论文输出名称)”\
    -输出目录=“$(缓存文件夹)”\
    -aux目录=“$(缓存\u文件夹)”
    #运行pdflatex、biber、pdflatex
    biber:start_timer pdflatex_hook1 biber_hook pdflatex_hook2
    #在当前文件夹路径中创建shell变量“current_dir”
    $(eval current_dir:=$(shell pwd))echo$(current_dir)>/dev/null
    #将PDF复制到当前文件夹
    cp$(缓存\文件夹)/$(论文\输出\名称).pdf$(当前\目录)/$(论文\输出\名称).pdf
    #计算经过的秒数并将其打印到屏幕上
    . ./设置/脚本/计时器\u calculator.sh
    显示失效秒“$(当前目录)”
    启动计时器:
    #开始计算经过的秒数,以便稍后将其打印到屏幕上
    . ./设置/脚本/计时器\u calculator.sh
    #内部调用的规则,不尝试显示经过的时间
    biber_钩:
    #在当前文件夹路径中创建shell变量`current\u dir`
    $(eval current_dir:=$(shell pwd))echo$(current_dir)>/dev/null
    #打电话给biber处理参考书目
    biber“$(缓存文件夹)/$(论文输出名称)”
    #如何多次调用Makefile配方/规则?
    # https://stackoverflow.com/questions/46135614/how-to-call-makefile-recipe-rule-multiple-times
    pdflatex_挂钩1 pdflatex_挂钩2:
    @$(LATEX)$(LATEX\u源文件)
    #将为每个latex文件和关联的pdf调用此规则
    latex:$(latex\u PDF\u文件)
    #计算经过的秒数并将其打印到屏幕上
    . ./设置/脚本/计时器\u calculator.sh
    显示失效秒“$(当前目录)”
    #为所有PDF和latex文件动态生成的配方
    %.pdf:%.tex
    #开始计算编译时间并导入其shell函数
    . ./设置/脚本/计时器\u calculator.sh
    #在当前文件夹路径中创建shell变量“current_dir”
    $(eval current_dir:=$(shell pwd))echo$(current_dir)>/dev/null
    @$(乳胶)$<
    cp$(缓存\文件夹)/$(论文\输出\名称).pdf$(当前\目录)/$(论文\输出\名称).pdf
    论文:$(论文主文件)
    #开始计算编译时间并导入其shell函数
    . ./设置/脚本/计时器\u calculator.sh
    #在当前文件夹路径中创建shell变量“current_dir”
    $(eval current_dir:=$(shell pwd))echo$(current_dir)>/dev/null
    #“-interaction=nonstopmode”和“-halt on error”之间有什么区别?
    # https://tex.stackexchange.com/questions/258814/what-is-the-difference-between-interaction-nonstopmode-and-halt-on-error
    #
    #以交互模式编译有什么原因(如果有)?
    # https://tex.stackexchange.com/questions/25267/what-reasons-if-any-are-there-for-compiling-in-interactive-mode
    晚点\
    -pdf\
    -沉默的\
    -jobname=“$(论文输出名称)”\
    -输出目录