在定义配方的先决条件中添加额外的换行符

Make extra newline in prerequisite in define recipe

我正在尝试创建一个 Makefile,它使用使用 define 语法创建的配方。但是,我 运行 遇到一个问题,Make 认为最后一个先决条件附加了换行符,导致 "no rule found" 错误。下面给出了一个最小的工作示例,问题是通过尝试制作 foo/bar 目标触发的。

foo:
    mkdir foo

define FIZZ
foo/bar: foo
    touch foo/bar
endef

$(call FIZZ)

确切的错误信息是

make: *** No rule to make target 'foo
', needed by 'foo/bar'. Stop.

我试过 GNU Make 的 4.1 和 4.2.1 版本。 谁能告诉我我做错了什么(或者这是一个错误)?

您在这里要做的是扩展变量 FIZZ 以注入 将目标foo/bar(其先决条件和配方)定义到 扩展的生成文件。 $(call FIZZ) 不是该工具:

$(call variable,param,param,...)

如果参数包含嵌入的空格,可能会表现出令人惊讶的行为。你要 8.9 The eval Function, 如:

生成文件

foo:
    mkdir foo

define FIZZ
foo/bar: foo
    touch foo/bar
endef

$(eval $(FIZZ))

那么你会得到:

$ make foo/bar
mkdir foo
touch foo/bar