递归make:插入`$(MAKEFLAGS)`的正确方法

Kor*_*nel 8 makefile

我如何使用$(MAKEFLAGS)(或以其他方式将在命令行上定义的变量传递给sub-make)以支持从shell调用的方式使用make VAR=valmake -args

我需要我的子项目可配置,但我讨厌autotools,所以我正在使用make变量,例如从shell调用:

$ make USE_SSE3=1
Run Code Online (Sandbox Code Playgroud)

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

手册指出:

如果你做'make -ks'那么MAKEFLAGS获得值'ks'.

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

但是,当使用没有标志的变量时,它会扩展为无效参数.如果我跑:

$ make FOO=bar
Run Code Online (Sandbox Code Playgroud)

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

是否有语法/变量/ hack使得传递参数单独的变量定义与子makefile一起使用?

遗产$(MKFLAGS)没有奇怪的短划线前缀问题,但它也不包括变量定义.我已经尝试修复变量$(patsubst),但这只会通过修剪空白使事情变得更糟.

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


foo:
    $(MAKE) -C subproject -$(MAKEFLAGS)
Run Code Online (Sandbox Code Playgroud)
$ make foo -s       # MAKEFLAGS = 's'
$ make foo BAR=baz  # MAKEFLAGS = 'BAR=baz'
$ make foo -j8      # MAKEFLAGS = ' --job-server=…'
Run Code Online (Sandbox Code Playgroud)

Mad*_*ist 12

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

MAKEFLAGS实际上,它是一个内部实现,它将参数从父make传递给child make.通常,它不是由makefile修改的.关于你可以有用的唯一事情就是添加新的标志.

如果你只使用$(MAKE)变量而不是硬编码来运行递归make make,那么Just Work:

recurse:
        @$(MAKE) all FOO=bar
Run Code Online (Sandbox Code Playgroud)

管他呢.

  • 我赞成这个答案,因为它是正确的,但我会添加评论,因为我最初并不清楚答案.简短版本是:不要在规则中使用$(MAKEFLAGS); 如果你在一个规则中使用$(MAKE),那么make将确保$(MAKEFLAGS)被sub-make ......神奇......以及一切正常工作. (4认同)
  • 不,不.传递给顶级的所有变量都作为命令行变量传递给子变量 - 只要你不搞乱MAKEFLAGS.请显示一个不起作用的示例,因为人们已经成功使用了20多年. (2认同)