Makefile 模式背后的逻辑是什么?
what is the logic behind Makefile patterns?
我曾经认为 Makefiles 中的 '%' 等同于 bash 中的 '*',因此这样的事情是有道理的:
%.o: %.c
gcc $< -o $@
但是,当尝试检索以某内容开头的文件时它不起作用,这在 bash 中可以像 ls test*
那样完成,例如:
#retrieve all files starting with test
test%: %.c
gcc $< -o $@
谁能解释一下这是如何做到的?
它的工作方式与 shell globbing 中的 *
完全一样,只是 %
必须至少匹配一个字符,而 *
可以匹配零个字符。
如果遇到问题请务必使用真实示例,并显示您键入的命令和得到的输出,并解释为什么输出不是您想要的,否则我们只能猜测。
首先,您没有在模式规则的末尾添加冒号;因为这是语法错误,所以我假设您的真实 makefile 只有一个冒号:
test%: %.c
...
你没有给我们一个实际的例子所以我们不能肯定地说,但很可能你遇到的问题是忘记了 %
的值在目标和先决条件中必须相同使规则匹配。
所以如果你有一个带 test% : %.c
的模式规则并且你想构建一个目标 testfoo
,模式匹配 foo
,这意味着你必须有一个文件 foo.c
.
如果你的源文件是testfoo.c
,你必须写test% : test%.c
您可以使用 make -d
来理解为什么 make 没有使用您的模式规则。
我曾经认为 Makefiles 中的 '%' 等同于 bash 中的 '*',因此这样的事情是有道理的:
%.o: %.c
gcc $< -o $@
但是,当尝试检索以某内容开头的文件时它不起作用,这在 bash 中可以像 ls test*
那样完成,例如:
#retrieve all files starting with test
test%: %.c
gcc $< -o $@
谁能解释一下这是如何做到的?
它的工作方式与 shell globbing 中的 *
完全一样,只是 %
必须至少匹配一个字符,而 *
可以匹配零个字符。
如果遇到问题请务必使用真实示例,并显示您键入的命令和得到的输出,并解释为什么输出不是您想要的,否则我们只能猜测。
首先,您没有在模式规则的末尾添加冒号;因为这是语法错误,所以我假设您的真实 makefile 只有一个冒号:
test%: %.c
...
你没有给我们一个实际的例子所以我们不能肯定地说,但很可能你遇到的问题是忘记了 %
的值在目标和先决条件中必须相同使规则匹配。
所以如果你有一个带 test% : %.c
的模式规则并且你想构建一个目标 testfoo
,模式匹配 foo
,这意味着你必须有一个文件 foo.c
.
如果你的源文件是testfoo.c
,你必须写test% : test%.c
您可以使用 make -d
来理解为什么 make 没有使用您的模式规则。