我可以使用.SHELLFLAGS变量在GNU-Make中选择“bashrc”文件吗?

时间:2017-08-11 12:04:40

标签: gnu-make

是否可以告诉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}"
    

1 个答案:

答案 0 :(得分:4)

如果您阅读了与--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当然不是交互式的。

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

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

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

显然不会起作用。您需要像这样设置.SHELLFLAGS

.SHELLFLAGS = --rcfile bashrc -ic --

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