【问题标题】:In GNU make is it possible to invoke the same program with different command line parameters?在 GNU make 中是否可以使用不同的命令行参数调用相同的程序?
【发布时间】:2021-08-05 19:30:11
【问题描述】:

玩具示例:

prog.sh:

#!/usr/bin/bash
echo $*

制作文件:

%.sh_log:   %.sh
    sh $< $(OPTARGS) > $@ 2>&1

targ1:      OPTARGS=hello world
targ1:      prog.sh_log

targ2:      OPTARGS=goodbye
targ2:      targ1 prog.sh_log

当我创建targ2 时,targ1 会按预期执行,但由于其结果是prog.sh_log,因此满足了targ2 的依赖关系并且它不会触发。由于 make 基于时间戳,如何在 makefile 的不同部分使用具有不同参数的相同程序。我的真实世界程序是一个多步程序,它将步数作为命令行参数。由于源系统的变化,我在步骤之间添加了其他程序。

【问题讨论】:

  • 你需要确保你依赖于一个不同的规则。可能需要使用 define 或其他东西来动态生成规则,但您可能可以使用 variable 来包含命令和参数,甚至只是将 $% 拆分为第一名。
  • 我很困惑(很容易做到)。你是说targ1 的配方使用prog.sh_log,而targ2 的配方使用不同 prog.sh_log?然后 make 依赖项不会帮助你。听起来有点可疑。你至少应该产生一个prog.sh_log_targ1 和一个单独的prog.sh_log_targ2 methinks。

标签: unix gnu-make


【解决方案1】:

如果您不希望命令只运行一次,请不要将其作为 makefile 中的目标:

targ1:      OPTARGS=hello world
targ1:
        sh prog.sh $(OPTARGS) > prog.sh.log 2>&1
        echo > $@

targ2:      OPTARGS=goodbye
targ2:      targ1
        sh prog.sh $(OPTARGS) > prog.sh.log 2>&1
        echo > $@

【讨论】:

  • 这种方法的问题是重新运行 targ2,比如说由于错误,会自动运行 targ1。在现实世界中,targ1 已经完成了它的工作,例如,它可能已经将行插入到数据库中。在这里可以通过运行 targ2 并触摸 prog.sh 来模拟。
  • 不,如果文件 targ1 存在,则在第二次尝试创建 targ2 时不会重新制作该目标。因此,如果不重新运行以前成功的 targ1 对您很重要,您将需要确保保存了一个名为 targ1 的文件。我将编辑我的答案以将 targ1 和 targ2 保存为文件。
猜你喜欢
  • 1970-01-01
  • 2013-11-22
  • 2016-10-14
  • 2022-01-22
  • 1970-01-01
  • 2021-03-03
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多