簡體   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