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

时间:2018-04-29 22:28:57

标签: makefile

我正在尝试关注meaty skeleton tutorial on osdev。 Makefile没有运行其中一个shell脚本。我已将每个文件的所有权限设置为可执行。

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

$(info DEFAULT_HOST!=../default-host.sh)
$(info HOST?=DEFAULT_HOST)
$(info HOSTARCH!=../target-triplet-to-arch.sh $(HOST))

执行这些行后,DEFAULT_HOST和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-triplet-to-arch.sh中添加了触摸语句。从shell运行时,会创建其中一个或另一个文件,但不会在运行Makefile时创建。这意味着make似乎没有运行shell命令。如何运行shell命令?

1 个答案:

答案 0 :(得分:1)

正如Beta所说,info不会“让你看到被评估的那条线的价值”。 info扩展其参数然后将其打印到stdout。 “扩展”意味着它解析任何变量引用,并不意味着将其解释为makefile命令。因此,如果您运行$(info hi),则会打印“hi”。如果您运行$(info foo = bar),则打印foo = bar将变量foo的值设置为bar

要使用!=,请注意此功能已添加到GNU make 4.0中。如果您的版本早于此版本,则此分配不会达到预期效果。特别是,像FOO!=echo bar这样的行将被解释为FOO! = echo bar ...换句话说,它设置名为FOO!的make变量。

我个人总是总是在我的makefile中的赋值语句周围添加空格...这清楚地表明它们是make assignments,而不是shell变量赋值(并不是说它不应该是明确的任何知道makefile语法的人,但......)。在较新版本的GNU make中,变量名称不能包含空格。