【问题标题】:Makefile to Shell ConversionMakefile 到 Shell 的转换
【发布时间】:2021-10-14 23:56:38
【问题描述】:
  1. 正在尝试将基本 Makefile 转换为等效的 shell,但在一些基础知识方面迷失了方向。

  2. 下面是Makefile中的一段代码

    WHAT1_UC           := ALOHA 
    WHAT1_NUM          := 1 
    WHAT1_WHERELOG_VAR = $(WHAT1_UC)_WHERE_FILENAME
    ifeq ($(strip $(WHAT1_NUM)), 1)
      $(WHAT1_WHERELOG_VAR) = mac.@PATH@.log
    else
      $(WHAT1_WHERELOG_VAR) = $(RLDIR)/mac.@PATH@.t%.log
    endif
    export $(WHAT1_WHERELOG_VAR)
    

    查询: 一种。在这@PATH@.log 代表什么?是否选择默认的环境变量 PATH ? 湾。那么 WHAT1_WHERELOG_VAR 的最终值是多少,是 export ALOHA_WHERE_FILENAME = mac.@PATH@.log 吗??

  3. 以下是基于上述 Make 代码尝试的一段 shell 代码,但在复制它的等价物时迷路了。

WHAT1_UC="ALOHA"
WHAT1_NUM=1 
WHAT1_WHERELOG_VAR=${WHAT1_UC}_WHERE_FILENAME
if [ $WHAT1_NUM == 1 ]; then
  export ${WHAT1_WHERELOG_VAR}=mac@$PATH@.log
else
  export ${WHAT1_WHERELOG_VAR}=${RLDIR}/mac.@PATH@.t%.log
fi

要使用的 @PATH@ 的 shell 等效项是什么??

请澄清上述问题。让我知道错过了什么?谢谢。

【问题讨论】:

  • 为什么?尝试实现所有依赖检查将变得非常复杂。
  • 您使用的是哪个版本的make?如果那是某种变量引用,那么它绝对不是 POSIX 指定的东西,也不是我在 GNU make 文档中可以找到的任何东西。
  • @Barmar 所以留下@PATH@.log 变量,一般来说如何添加一个变量导出设置,就像在 Make into shell 中所做的那样?
  • @chepner 不确定 make 版本。只是一个想要尝试/转换为 shell 的现有代码及其需要。
  • @Vimo 我认为您对export 命令的翻译是正确的。

标签: bash shell makefile


【解决方案1】:

查询:a.其中@PATH@.log 代表什么?

在 POSIX 或 GNU make 中,@PATH@.log 代表 @PATH@.log。但是@PATH@ 部分可能不是故意的——它看起来像是一个占位符,本来打算由一个单独的程序填充,例如autoconf,作为生成您正在查看的 makefile 的一部分.

或者,它可能是打算在构建期间替换掉。

是不是在挑选 默认环境变量 PATH ?

不,它在我所知道的任何makefile方言中都没有特殊含义。

b.那么最终的价值是多少 WHAT1_WHERELOG_VAR,

它是 ALOHA_WHERE_FILENAME。

是导出 ALOHA_WHERE_FILENAME = mac.@PATH@.log ??

没有。 $(WHAT1_WHERELOG_VAR)${WHAT1_WHERELOG_VAR} 扩展为变量 WHAT1_WHERELOG_VAR 的值。它们与设置该变量的值无关。

要使用的 @PATH@ 的 shell 等效项是什么??

它是@PATH@,它对shell 的意义不亚于make

【讨论】:

  • 感谢您的回复。但是很少有查询: 1. WHAT1_WHERELOG_VAR 的值是 ALOHA_WHERE_FILENAME 很好。 2. 但是在执行导出的最后,为什么 WHAT1_WHERELOG_VAR 没有被替换为 ALOHA_WHERE_FILENAME ?我期待最终命令是 export ALOHA_WHERE_FILENAME=mac.@PATH@.log 但我没有看到任何变量设置为 ALOHA_WHERE_FILENAME。
  • @Vimo,我猜你是在问为什么你的 Bash 代码没有像 makefile 那样做?那是因为 shell 没有使用与make 相同的评估规则。特别是,shell 识别变量分配之前 变量展开。您也许可以通过使用eval 命令来解决这个问题,该命令的参数被扩展为一个命令,然后执行:eval "${WHAT1_WHERELOG_VAR}='${RLDIR}/mac.@PATH@.t%.log'"
  • 非常感谢您的 cmets。如何导出 eval 的输出?试过 eval ABC="${WHAT1_WHERELOG_VAR}='${RLDIR}/mac.@PATH@.t%.log'"。当我尝试 echo $ABC 时,能够看到值为 ALOHA_WHERE_FILENAME=mac@$PATH@.log,但是如何将其重定向到导出?试过 eval export ${WHAT1_WHERELOG_VAR}='${RLDIR}/mac.@PATH@.t%.log'",但没有用。
  • @Vimo,您不导出eval输出eval 将其(扩展的)参数作为 shell 命令执行。这种情况下的效果是为变量ALOHA_WHERE_FILENAME 设置一个值。如果要导出该变量,请执行此操作。我建议通过单独的 export 语句来完成,就像你原来的 makefile 一样。
  • 再次感谢您的输入...但是我是否需要将 eval 的输出重定向到另一个变量以便可以导出它?或者有没有直接导出的选项?我尝试了上述方法,即 eval ABC = "" 或 export $(ALOHA_WHERE_FILENAME),但无法获得。想知道如何导出 eval 的输出。
猜你喜欢
  • 1970-01-01
  • 2023-01-11
  • 2012-01-19
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多