繁体   English   中英

如何从 Makefile 的 shell 脚本中调用 function

[英]How to invoke a function in a shell script from a Makefile

我有一个Makefile ,其中包含打印给定变量的目标:

print-%:
    @echo $*=$($*)

例如要打印变量CURDIR的值,我只需发出以下命令:

make print-CURDIR

结果如下:

CURDIR=/Users/j3d/Projects/myproject

现在我想创建一个 shell 脚本,其中包含一组要从任何Makefile调用的常用函数......这是上面目标的修改版本:

print-%:
    . ./make-util printvar $@

这是make-util

#!/bin/sh

printvar()
{
    @echo $*=$(*)
}

最后,运行上面的脚本......

j3d@j3ds-macbook-pro myproject % make print-CURDIR

...不会产生预期的结果:

. ./make-utils CURDIR

我应该如何调用脚本 function 以便正确打印给定的变量?

您可以创建一套 make recipes(如果您使用 GNU make),您可以在多个 makefile 中包含和使用它,但您必须使用make语法,而不是shell语法,因为它们是 make recipes 即使配方展开后变成 shell 脚本。

您可以研究 GNU make define语句以及evalcall函数,以了解在 GNU make 中创建用户定义函数的方法。 例如,您可以像这样编写 makefile:

$ cat macros.mk
print-%:
        @echo $*=$($*)

然后在你的其他makefile中你可以使用:

include macros.mk

并且您会自动获得该规则。

这里有很多很多的可能性,但细节取决于你想做什么。

你快到了:

由于您将 function 的名称作为第一个参数传递,因此您可以执行

#!/bin/sh
printvar()
{
  @echo $*=$(*)
}
"$1"

执行 function。 如果您想要更多安全性(以捕获错误传递一些危险命令而不是 function 名称的情况),您可以执行

[ "$1" = printvar ] && printvar
[ "$1" = other_function ] && other_function

反而。

如果要处理脚本 Make-variables,可以将它们作为附加参数传递:

func=$1
shift
[ "$func" = printvar ] && printvar "$@"
[ "$func" = other_function ] && other_function "$@"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM