Makefile 使用make自动从其他目录复制依赖项

Makefile 使用make自动从其他目录复制依赖项,makefile,rules,cp,Makefile,Rules,Cp,我有一个包含多个目标的makefile,这些目标是通过从工作目录外复制文件生成的 a.tex : $(wildcard /foo/work1/a.tex) cp -p $< $@ b.tex : $(wildcard /foo/work2/b.tex) cp -p $< $@ a.tex:$(通配符/foo/work1/a.tex) cp-p$

我有一个包含多个目标的makefile,这些目标是通过从工作目录外复制文件生成的

a.tex   : $(wildcard /foo/work1/a.tex)
    cp -p $< $@

b.tex   : $(wildcard /foo/work2/b.tex)
    cp -p $< $@
a.tex:$(通配符/foo/work1/a.tex)
cp-p$<$@
b、 tex:$(通配符/foo/work2/b.tex)
cp-p$<$@
我使用
$(通配符)
,因为有时我在无法访问
/foo
的系统上运行Make

避免对每个规则重复
cp-p$<$@
命令的最佳方法是什么?一些选择:


  • 设置
    %.tex:%.tex
    规则。这是可行的,但它也适用于没有明确指示的目标,因此我收到了很多警告,如
    make:Circular a.tex我还没有测试过它,但是您不能只使用一个没有先决条件的模式规则,并在单独的行上为每个目标指定先决条件吗

    a.tex: $(wildcard /foo/work1/a.tex)
    b.tex: $(wildcard /foo/work2/b.tex)
    
    %.tex:
        cp -p $< $@
    
    a.tex:$(通配符/foo/work1/a.tex)
    b、 tex:$(通配符/foo/work2/b.tex)
    %.tex:
    cp-p$<$@
    

    顺便说一句,通配符函数在找不到匹配项时不返回空字符串吗?因此,
    $我还没有对它进行测试,但是您不能只使用一个没有先决条件的模式规则,并在单独的一行上为每个目标指定先决条件吗

    a.tex: $(wildcard /foo/work1/a.tex)
    b.tex: $(wildcard /foo/work2/b.tex)
    
    %.tex:
        cp -p $< $@
    
    a.tex:$(通配符/foo/work1/a.tex)
    b、 tex:$(通配符/foo/work2/b.tex)
    %.tex:
    cp-p$<$@
    
    顺便说一句,当通配符函数没有找到匹配项时,它不会返回空字符串,因此,
    $我最终执行了以下操作:

    COPYFILES = /foo/work1/a.tex /foo/work2/b.tex
    
    define copyrule
    $(notdir $(1)): $$(wildcard $(1))
        cp -p $$< $$@
    endef
    $(foreach file,$(COPYFILES),$(eval $(call copyrule,$(file))))
    
    COPYFILES=/foo/work1/a.tex/foo/work2/b.tex
    定义复制规则
    $(notdir$(1)):$$(通配符$(1))
    cp-p$$<$$@
    恩德夫
    $(foreach文件,$(COPYFILES),$(eval$(调用copyrule,$(文件)))
    
    这种方法的优点是,我可以用最少的样板文本轻松地添加新文件,并且可以轻松地将其中的规则部分复制到新的Makefile中。缺点是,我无法再更改目标文件名,而且对于缺乏makefile经验的人来说,实现相当不透明。

    我最终做了以下工作:

    COPYFILES = /foo/work1/a.tex /foo/work2/b.tex
    
    define copyrule
    $(notdir $(1)): $$(wildcard $(1))
        cp -p $$< $$@
    endef
    $(foreach file,$(COPYFILES),$(eval $(call copyrule,$(file))))
    
    COPYFILES=/foo/work1/a.tex/foo/work2/b.tex
    定义复制规则
    $(notdir$(1)):$$(通配符$(1))
    cp-p$$<$$@
    恩德夫
    $(foreach文件,$(COPYFILES),$(eval$(调用copyrule,$(文件)))
    

    这种方法的优点是,我可以用最少的样板文本轻松地添加新文件,并且可以轻松地将其中的规则部分复制到新的Makefile中。缺点是,我无法再更改目标文件名,而且对于缺乏makefile经验的人来说,实现相当不透明。

    我认为您的
    复制规则
    太过苛刻(而且缺乏灵活性)。如果您对@eriktous解决方案的反对意见是它会将规则应用于您尚未明确定义依赖项的目标,那么使用以下方法很容易解决:

    a.tex:$(通配符/foo/work1/a.tex)
    b、 tex:$(通配符/foo/work2/b.tex)
    blue.tex:$(通配符/some/other/path/green.tex)
    tex=a.tex b.tex
    $(特克斯):%特克斯:
    cp-p$<$@
    

    (如果这解决了你的问题,你应该接受埃里克托斯的答案——这只是它的一个变体。)

    我认为你的
    copyrule
    太过份了(而且不够灵活)。如果您对@eriktous解决方案的反对意见是它会将规则应用于您尚未明确定义依赖项的目标,那么使用以下方法很容易解决:

    a.tex:$(通配符/foo/work1/a.tex)
    b、 tex:$(通配符/foo/work2/b.tex)
    blue.tex:$(通配符/some/other/path/green.tex)
    tex=a.tex b.tex
    $(特克斯):%特克斯:
    cp-p$<$@
    

    (如果这解决了你的问题,你应该接受埃里克托斯的答案——这只是它的一个变体。)

    那不行。模式规则没有在
    $@Michael:这很奇怪;我试过了,它对我有效。你用的是和我不同的牌子吗?我使用GNU make。@MichaelHoffman:你的意思是
    $@eriktous:我的错误:我再试了一次,它似乎确实有效。一定是我上次提出的测试代码有问题。我唯一不喜欢的是,它会为我没有明确定义依赖项的文件生成
    %.tex
    规则,这会导致混乱的结果@测试版:如果依赖项不可用,我不想做任何事情。那不行。模式规则没有在
    $@Michael:这很奇怪;我试过了,它对我有效。你用的是和我不同的牌子吗?我使用GNU make。@MichaelHoffman:你的意思是
    $@eriktous:我的错误:我再试了一次,它似乎确实有效。一定是我上次提出的测试代码有问题。我唯一不喜欢的是,它会为我没有明确定义依赖项的文件生成
    %.tex
    规则,这会导致混乱的结果@Beta:如果依赖项不可用,我不想做任何事情。这个解决方案的一个好处是它不仅限于
    %.tex
    文件。但这仍然导致我必须输入大量的样板文件。@MichaelHoffman:大量的样板文件?您说过您只希望为尚未明确定义依赖项的目标创建规则,因此必须键入依赖项。此解决方案还要求您将新目标的名称添加到
    TEXES
    行。您希望键入的内容减少多少?此解决方案的一个优点是它不仅限于
    %.tex
    文件。但这仍然导致我必须输入大量的样板文件。@MichaelHoffman:大量的样板文件?您说过您只希望为尚未明确定义依赖项的目标创建规则,因此必须键入依赖项。此解决方案还要求您将新目标的名称添加到
    TEXES
    行。你想少打多少?