【问题标题】:using makefile variables in shell script without running make在 shell 脚本中使用 makefile 变量而不运行 make
【发布时间】:2015-02-18 23:29:45
【问题描述】:

我们有一个很大的 make 文件,它定义了很多有用的变量,比如 TEST_ENV。我想制作一个位于同一目录中的 shell 脚本,并且想知道是否有任何方法可以使用 shell 脚本中 Makefile 中定义的变量。我感兴趣的变量都是这样定义的

TEST_ENV := PATH=/path/to/thing \
            CONFDIR=/another/path

host_installdir = /still/a/path

我希望脚本使用 Makefile 的原因是,如果需要在 Makefile 中更改变量,shell 脚本不会过时。

我发现了 this 相关问题,但希望有一种方法可以做到这一点,而不必先运行 make。

我考虑过在 Makefile 上以某种方式使用 grep 的可能性,但是一些变量是跨多行定义的,这使得它变得棘手且容易损坏(例如,如果我对跨 3 行定义的变量执行 grep -A 3 ,如果稍后添加第 4 行怎么办?)。

【问题讨论】:

    标签: linux bash shell makefile


    【解决方案1】:

    您可以在您的 makefile 中使用来自 Makefile hacks: print the value of any variableprint-% 目标(的修改版本)来查询它的值。

    print-%:
            @echo '$(subst ','\'',$($*))'
    

    【讨论】:

      【解决方案2】:
      TEST_ENV=$(make -qp | awk -F' = ' '$1=="TEST_ENV" {print $2}')
      

      我确信有一些边缘情况无法处理,但这是一个不错的开始。初步测试表明这可以处理多行变量。

      【讨论】:

      • 我无法使用您的 awk-only 示例,$1==VARNAME 从来没有任何匹配项。不过,我确实得到了这个相关的想法:TEST_ENV=$(make -qp | grep "TEST_ENV :=" | awk -F ' := ''{print $2}')。感谢您的建议!
      • 在您的示例中,awk 行需要-F' := '
      • 我最初确实将 '=' 更改为 ':=' 和 ' := ',但它仍然没有给出任何结果。
      • 你写的是$1==VARNAME还是$1=="VARNAME"?引号是必需的。
      • 这取决于变量是用=(延迟)还是:=(立即)定义的,所以正确的-F参数是-F ' :?= '(虽然可以想象分隔符字符串将出现在变量定义中)。请注意,make -p 打印的是定义,而不是值,因此使用= 定义的变量可能在打印的值中有未扩展的变量引用。
      猜你喜欢
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多