【发布时间】:2022-01-13 11:31:40
【问题描述】:
有几种类似的问题,但我无法将任何提议的概念适用于我的案例。
只是提供一点背景信息:我有一组 Julia 文件,它们将绘图创建为 PDF,这是创建科学论文的制作过程的一部分,例如:
plots = $(shell find $(PLOT_PATH)/*.jl | sed 's/\.jl/\.pdf/g')
$(PLOT_PATH)/%.pdf: $(PLOT_PATH)/%.jl $(JULIA_SYSIMAGE)
$(JL) --project $< -o $(PLOT_PATH)
$(DOCUMENT_FILENAME).pdf: FORCE $(plots) $(figures)
latexmk $(DOCUMENT_FILENAME).tex
在当前设置中,每个XYZ.jl 文件都在创建一个XYZ.pdf 文件,并且它工作得非常好。
现在我正在处理从单个 Julia 文件创建多个绘图会容易得多的情况,所以像这样的脚本:
#!/usr/bin/env julia
using PGFPlotsX
...
...
pgfsave("whatever.pdf")
pgfsave("another.pdf")
pgfsave("yetanother.pdf")
这样人们就可以通过grep pgfsave SCRIPT | awk... 找出目标。但是,我不知道如何根据依赖文件(Julia 脚本)的内容生成动态目标(绘图)。
我的问题的 MWE 如下:我有几个文件(依赖项)正在生成一堆目标,这些目标在这些文件中定义(并且可以通过 awk/grep/sed/whatever 访问)。现在,假设这些只是*.txt 文件,每一行都是一个目标。
文件: a.txt
foo
bar
baz
文件: b.txt
naarf
fjoord
一个非常基本的(非工作)手册Makefile 来演示目标将是这样的(它不起作用,因为它无法弄清楚如何制作foo 等,但它显示了@987654335 的模式@需要重复):
文件: Makefile
all_products := $(shell find *.txt | xargs cat)
final_product: $(all_products)
echo $< > $@
(foo bar baz): a.txt
touch $(shell cat $<)
(narf fjoord): b.txt
touch $(shell cat $<)
所以原则上,我需要一些东西来“处理”依赖项 (*.txt) 以创建目标列表,例如
$(shell cat $%): %.txt
echo $< > $@
但我无法获得对目标端依赖项的引用($% 不起作用)。
有什么想法吗?也许整个方法只是个坏主意;)
【问题讨论】:
-
在您的情况下,尝试动态创建 makefile-fragments 可能是最简单的 (make.mad-scientist.net/constructed-include-files)?
-
嗯,是的,我尝试过这种方法,但很难理解它。我会更加努力,也许有人同时有一个现有的解决方案
;)