如何在Makefile中调用for循环体中的函数

时间:2014-05-30 19:18:45

标签: makefile

我在Makefile中定义了一个文件列表。

我需要将这些文件及其目录结构复制到新位置。

我无法使用cp --parent,因为源文件位于../(所以..将成为dest路径的一部分)。

然后,我决定做一个用于创建dirs的循环,然后是第二个用于复制文件的for循环。然而,问题是我似乎无法在for循环的主体中调用$(dir $$file)。我总是得到“./”作为结果,而不是实际的目录名称。如果我执行类似echo $(dir foo/bar)的操作,那可以正常工作,但echo $(dir $$file)(当$$file为'foo / bar'时)始终返回'./'。

我尝试了其他选项,例如$(shell basename $$file),但这也不起作用。

我已经尝试定义一个函数并在for的主体中调用它,但是,它也不起作用。

这是一个简单的Makefile示例:

FILES := foo/faz \
         bar/baz \
         gah/gaz

all:
    @for f in $(FILES); do \
      echo $(dir $$f); \
    done

我希望这个输出为:

foo
bar
gah

但相反,我得到了:

./
./
./

如果我的方法不是最好的,我会接受其他解决方案。在一天结束时,我需要能够将../(例如../foo/bar)中存在的所有$(FILES)复制到名为$(NEWDIR)的新目录(所以newdir / foo / bar,例如)。

这只需要在Linux下工作。

1 个答案:

答案 0 :(得分:3)

f是一个shell变量。在函数dir上调用make函数$f(然后shell将其解释为变量扩展)。

如果使用shell循环,则需要使用shell的构造来提取目录部分:

@set -e; for f in $(FILES); do \
      echo $$(dirname $$f); \
    done

不要忘记set -e,这样如果在复制过程中出现错误,make规则就会失败。

您还可以在make中使用foreach函数来生成一堆cp命令。它使makefile更难调试。