我正在尝试关注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命令?
答案 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中,变量名称不能包含空格。