设置变量时,Makefile不调用shell脚本

设置变量时,Makefile不调用shell脚本,makefile,Makefile,我正试着跟着这条路走。Makefile未运行任何shell脚本。我已将每个文件的所有权限设置为可执行 在lib/Makefile中,我设置了以下几行: $(info DEFAULT_HOST!=../default-host.sh) $(info HOST?=DEFAULT_HOST) $(info HOSTARCH!=../target-triplet-to-arch.sh $(HOST)) 执行这些行后,将不会设置默认的\u主机或HOSTARCH default-host.sh: #!/b

我正试着跟着这条路走。Makefile未运行任何shell脚本。我已将每个文件的所有权限设置为可执行

在lib/Makefile中,我设置了以下几行:

$(info DEFAULT_HOST!=../default-host.sh)
$(info HOST?=DEFAULT_HOST)
$(info HOSTARCH!=../target-triplet-to-arch.sh $(HOST))
执行这些行后,将不会设置默认的\u主机或HOSTARCH

default-host.sh:

#!/bin/sh
echo i686-elf
arget-triplet-to-arch.sh:

#!/bin/sh
if echo "$1" | grep -Eq 'i[[:digit:]]86-'; then
  touch here.txt
  echo i386
else
  touch there.txt
  echo "$1" | grep -Eo '^[[:alnum:]_]*'
fi

注意,我将
arget三元组中的touch语句添加到arch.sh
。从shell运行时,将创建其中一个或另一个文件,但在运行Makefile时不会创建。这意味着make似乎没有运行shell命令。如何让make运行shell命令?

正如Beta所说,
info
不“允许您查看正在计算的行的值”
info
展开其参数,然后将其打印到stdout。“扩展”意味着它解析任何变量引用,但并不意味着将其解释为makefile命令。因此,如果运行
$(info hi)
它会打印“hi”。如果运行
$(info foo=bar)
If打印
foo=bar
,但未将变量
foo
的值设置为
bar

用于使用
=,请注意,此功能已添加到GNU make 4.0中。如果您的版本早于此,则此作业不会达到您预期的效果。特别是像
FOO=回音条
将被解释为是
FOO!=回音条
。。。换句话说,它设置名为
FOO


就我个人而言,我总是在makefile中的赋值语句周围加上空格。。。这表明它们是makeassignment,而不是shell变量赋值(并不是说对于任何了解makefile语法的人来说都不应该很清楚,但是…)。在较新版本的GNU make中,变量名不能包含空格。

不会像您认为的那样为变量赋值。我认为它不会这样做,先生;我想它可以让我看到被评估行的值。我将它放在执行赋值的行上,以查看该行至少正在被makefile读取。我意识到它不会向我显示值。(我们可能有语言问题。)请发布您希望执行脚本的makefile部分。这些是带有
info
语句的行。即使没有
info
语句,也不会发生任何事情。如果我更改使用
的行=
要使用
:=$(shell)
,脚本将运行。但是,变量的后续扩展不会发生,例如,
$HOSTARCH
将计算为空字符串。