$(info) 命令 io 重定向

$(info) command io redirection

我可以将标准错误从 make info 命令重定向到文件吗?例如。如果我想打印编译命令并将 2> 重定向到一个文件,该文件只会得到一个空字符串,但会打印 info 括号内的命令,如下所示:

ifdef VERBOSE
  verbose := @cat /tmp/compilation.out
endif

development: $(source)
    # Pipe to cat is just to redirect signals from make to don't exit on error
    @$(info $(CC) -o $(target) $^ $(DEBUG)) 2> /tmp/compilation.out | cat
    $(verbose)
    @cat /tmp/compilation.out >> $(log)

在调用 shell 到 运行 配方之前,make 会扩展变量和函数。扩展的结果传递给shell.

2> 是一个 shell 构造,它不被 make 解释。

info make 函数被定义为将其参数写入标准输出,并扩展为空字符串。因此,当 make 扩展此配方行时:

$(info $(CC) -o $(target) $^ $(DEBUG)) 2> /tmp/compilation.out | cat

首先它将参数扩展为 info 并将结果写入标准输出,然后用空字符串替换 info 函数,然后用结果调用 shell ;所以 shell 看到:

 2> /tmp/compilation.out | cat

简短的回答是否定的,没有办法让 make 的 info 函数将输出写入文件。你必须使用 shell 知道的东西,比如 echo:

@echo '$(CC) -o $(target) $^ $(DEBUG)' 2> /tmp/compilation.out | cat