我想定义一个 shell 函数

#!/bin/sh

test ()
{
  do_some_complicated_tests $1 $2;
  if something; then
    build_thisway $1 $2;
  else
    build_otherway $1 $2;
  fi
}

以某种方式可以在我的Makefile的每个规则中使用它,例如:
foo: bar
  test foo baz

需要明确的是,我希望shell函数成为Makefile的一部分。最优雅的方法是什么?如果您可以做到而无需递归调用make,则可以获得加分。

背景:
我的实际问题是make -n产生了很长且不可读的输出。每个规则使用几乎相同的顺序的不可读Shell命令,并且有很多规则。上面的解决方案将使make -n的输出更加有用。

最佳答案

此解决方案不依赖于外部临时文件,也不强制您修改SHELL变量。

TESTTOOL=sh -c '\
  do_some_complicated_tests $$1 $$2; \
  if something; then
    build_thisway $$1 $$2;
  else
    build_otherway $$1 $$2;
  fi' TESTTOOL

ifneq (,$(findstring n,$(MAKEFLAGS)))
TESTTOOL=: TESTTOOL
endif

foo: bar
    ${TESTTOOL} foo baz
ifneq…endif块在命令行上检查-n标志,并将TESTTOOL的扩展名设置为: TESTTOOL,这易于阅读并且可以安全执行。

最好的解决方案是将Shell函数转换为实际程序(如果您可以选择这样做)。

10-06 01:06