我可以使用 .在 GNU-Make 中选择"bashrc"文件?



是否可以告诉SHELL,例如bash,使用.SHELLFLAGS使用特定的(bash(rc文件?

下面您将看到两个示例。第一个显示了我想做什么,第二个说明了实现预期结果的一种方法。

问的原因是我有一个bashrc文件(来自OpenFOAM(,定义了一堆我想在各种配方中使用的变量和函数。

谢谢你的时间。


示例(不工作(

  • 文件:bashrc

    export HELLOWORLD="Hello World"
    
  • 文件:Makefile

    SHELL=/bin/bash
    .SHELLFLAGS=--rcfile bashrc --
    test:
    @
    echo "$${HELLOWORLD}"
    

示例(工作(

  • 文件:bashrc

    export HELLOWORLD="Hello World"
    
  • 文件:Makefile

    .ONESHELL:
    SHELL=/bin/bash
    test: ; source bashrc
    @
    echo "$${HELLOWORLD}"
    

如果您阅读与--rcfile选项相关的 bash 手册页,您会发现:

--rcfile file
Execute  commands  from file instead of the system wide initial‐
ization file /etc/bash.bashrc and the standard personal initial‐
ization  file ~/.bashrc if the shell is interactive (see INVOCA‐
TION below).

特别要注意的是,shell 必须是交互式的才能产生任何效果,但进行调用的 shell 当然不是交互式的。

其次,如果你阅读了 GNU make 手册.SHELLFLAGS你会发现默认值是-c(或在 POSIX 模式下-ec(;-c选项允许 shell 从命令行读取脚本以运行,这就是make调用 shell 的方式。 这意味着当您将.SHELLFLAGS替换为自己的值时,您必须包含它。

因此,当您的makefile运行时make它将使用以下命令行:

/bin/bash --rcfile bashrc -- 'echo "${HELLOWORLD}"'

这显然是行不通的。 您需要像这样设置.SHELLFLAGS

.SHELLFLAGS = --rcfile bashrc -ic --

-i选项强制使用交互式 shell,您需要-c选项来告诉 make 将第一个非选项参数作为命令运行。

最新更新