【问题标题】:Choosing Arguments with GNU Make使用 GNU Make 选择参数
【发布时间】:2017-10-29 09:27:00
【问题描述】:

考虑一下这个简短的 Makefile:

ARGS       := -foo
my_ARGS    := -bar
their_ARGS :=

all: your.foo my.foo their.foo

%.foo:
    @echo $*: $(call _choose_,ARGS,$*)

_isndef_ = $(findstring undefined,$(origin $1))
_choose_ = $(value $(if $(call _isndef_,$2_$1),$1,$2_$1))

正确输出:

your: -foo
my: -bar
their:

我的问题:

  • 这是automake 的方式吗? (LDADDrmt_LDADD
  • 有更短或更好的方法吗?

【问题讨论】:

标签: makefile automake


【解决方案1】:

为什么不使用变量名构造?很简单:

ARGS       := -foo
my_ARGS    := -bar
their_ARGS :=

all: your.foo my.foo their.foo

%.foo:
        @echo $*: $(or $($*_ARGS),$(ARGS))

这里有更多信息,例如:http://make.mad-scientist.net/constructed-macro-names/

如果你想“用空覆盖”你可以使用target-specific variables:

ARGS := -foo

my.foo:    ARGS := -bar
their.foo: ARGS :=

all: your.foo my.foo their.foo

%.foo:
        @echo $*: $(ARGS)

【讨论】:

  • 如果我是对的,您的版本将在最后一行生成their: -foo,因为它的 args 将扩展为空字符串 - 因此定义检查
  • 非常好,我没想过在模式规则的具体实例上使用目标特定变量 - 引出为什么 LDADD 变量不能那样工作的问题?
  • 你的意思是在 automake 中?因为 automake 会生成符合 POSIX 的 makefile,可以与任何 make 一起使用,但目标特定的变量,至少使用这种语法,是特定于 GNU make 的。
  • 我做到了,是的 - 这就是我试图模仿的。我得读一读你的博客,看起来里面有一些好东西。再次感谢。
  • 您的解决方案和我的解决方案都不是可移植的:您没有建议您想要一个非 GNU make 可移植选项,并且由于您的解决方案是 GNU make 特定的,所以我没有尝试移植。我相当有信心 automake makefile 按照您的建议工作,<prog>_LDADD 替换 LDADD。相反,我认为 automake 只使用:$($@_LDADD) $(LDADD),其中使用了 both 值。 LDADD 保留给用户在命令行上设置,因此它始终为空(默认情况下)。这可以移植到 POSIX make。
猜你喜欢
  • 1970-01-01
  • 2010-12-06
  • 2021-12-24
  • 2023-02-06
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多