10

我如何使用$(MAKEFLAGS)(或将命令行上定义的变量传递给子制作的另一种方式)以支持从 shell 调用的方式使用make VAR=valmake -args

我需要我的子项目可配置,但我讨厌自动工具,所以我为此使用 make 变量,例如从 shell 调用:

$ make USE_SSE3=1

并且USE_SSE3需要应用于所有子 makefile 中的所有构建。

该手册指出:

如果您执行“make -ks”,则 MAKEFLAGS 将获得值“ks”。

因此,我-$(MAKEFLAGS)在 Makefile 中使用(带有破折号前缀)。

但是,当使用没有标志的变量时,这会扩展为无效参数。如果我运行:

$ make FOO=bar

然后 sub-make 变得无效-FOO=bar。OTOH 没有破折号前缀变量定义工作,然后 butmake -s等不工作。

是否有语法/变量/hack 可以使参数的传递单独的变量定义与子生成文件一起使用?

旧版$(MKFLAGS)没有奇怪的破折号前缀问题,但它也不包括变量定义。我试过用 修复变量$(patsubst),但这只会通过修剪空白使事情变得更糟。

我需要该解决方案与 Mac OS X Mavericks 附带的过时的 GNU Make 3.81 兼容。


foo:
    $(MAKE) -C subproject -$(MAKEFLAGS)

$ make foo -s       # MAKEFLAGS = 's'
$ make foo BAR=baz  # MAKEFLAGS = 'BAR=baz'
$ make foo -j8      # MAKEFLAGS = ' --job-server=…'
4

3 回答 3

19

你根本不应该设置MAKEFLAGS。你为什么想要?你没有给出任何理由这样做。

MAKEFLAGS实际上,它旨在成为将参数从父 make 传递给子 make 的内部实现。通常,它不打算由 makefile 修改。你唯一能做的就是添加新的标志。

如果您只是使用$(MAKE)变量而不是硬编码运行递归 make make,它将正常工作:

recurse:
        @$(MAKE) all FOO=bar

管他呢。

于 2013-10-27T19:59:59.713 回答
2

如果我做对了,我得到你的答案已经晚了。您可以$(MAKEARGS)自己手动构建,例如:

MAKEARGS := $(strip \
  $(foreach v,$(.VARIABLES),\
    $(if $(filter command\ line,$(origin $(v))),\
      $(v)=$(value $(v)) ,)))

MAKEARGS :=分配静态

strip清除前导和尾随空格。

foreach v遍历所有变量名。

origin $(v)检查变量来源是否是“命令行”。

$(v)=$(value $(v)) 输出环境分配字符串。

或者,您可以取消选择$(MAKEFLAGS)类似的内容:

MAKEARGS := $(wordlist 2,$(words $(MAKEFLAGS)),$(MAKEFLAGS))
MAKEFLAGS := $(firstword $(MAKEFLAGS))

恕我直言,这可以为您提供更简洁的代码以进行进一步的递归。我这样说是因为在某些情况下我有时需要将参数和标志分开。尤其是当您陷入调试递归 djungle 时。但是对于任何特定情况,都应该查阅有关递归选项处理的手册。

更换罐子$(MAKEFLAGS)会导致不必要的故障。

对于愿意的用户来说,另一个有用的信息可能是$(MAKEFLAGS)变量基本上是传递给 make 的整个参数列表,而不仅仅是标志字符。所以$(info MAKEFLAGS = $(MAKEFLAGS))可以给你类似的东西:

MAKEFLAGS = rRw -- VAR=val

干杯

于 2021-03-06T21:51:22.080 回答
1

要检查 -B 是否存在于制作标志中,我会:

BB_CLOBBER := $(shell echo $(MAKEFLAGS) | grep wB)
ifeq (,$(BB_CLOBBER))
  # also force clobber make if these files are missing
  BB_CLOBBER := $(shell (test -e $(bb_gen)/minimal/.config && test -e $(bb_gen)/full/.config) || echo "B")
endif

bb_prepare:
ifneq (,$(BB_CLOBBER))
    @rm -rf $(bb_gen)/full
    ...
于 2014-07-25T17:47:03.247 回答