如何将--debug=参数传递给嵌套的Makefile?
传递Make调试参数到嵌套Makefile
我有一个从主Makefile(关联automake的Makefile.am)调用的自定义嵌套Makefile。调试主Makefile的依赖或规则问题时,只要在make命令后加--debug=b(偶尔用--debug=a)就能排查,但这个调试设置不会自动传给嵌套的自定义Makefile,偏偏问题经常出在这(懂的都懂,automake本身没毛病...)。我能不能在Makefile里获取当前的--debug=设置,或者把这个值传递给嵌套Makefile的调用?直接单独调用嵌套Makefile不太现实,因为它依赖主Makefile的大量环境变量,这些环境还可能和要调试的问题相关。我目前是基于“这类参数应该通过make引擎传递”的思路,用下面的规则传递参数:
all-local: @echo Make custom with $(MY_PRODUCT_CLOUD_ENABLEMENT) $(MY_PRODUCT_PROTECT_ENABLEMENT) $(ACL_ENABLEMENT) CPPEXTRA="$(CPPEXTRA)" $(FIPS_ENABLEMENT) CPPMORE="$(CPPMORE)" $(MY_PRODUCT_PROTECT_CPPEXTRA_ENABLEMENT) $(ACL_CPPEXTRA_ENABLEMENT) $(MAKE) $(AM_MAKEFLAGS) $(MY_PRODUCT_CLOUD_ENABLEMENT) $(MY_PRODUCT_PROTECT_ENABLEMENT) $(ACL_ENABLEMENT) $(FIPS_ENABLEMENT) $(MY_PRODUCT_ENABLEMENT) -f Makefile.product CPPEXTRA="$(CPPEXTRA)" CPPMORE="$(CPPMORE)" $(MY_PRODUCT_PROTECT_CPPEXTRA_ENABLEMENT) $(ACL_CPPEXTRA_ENABLEMENT)
解决方法
直接复用
MAKEFLAGS自动传递
Make会把大部分命令行参数(包括--debug系列选项)存入MAKEFLAGS变量。你可以直接在嵌套调用的$(MAKE)命令后加上$(MAKEFLAGS),这样所有命令行里的调试参数都会被自动传递过去。修改后的规则如下:all-local: @echo Make custom with $(MY_PRODUCT_CLOUD_ENABLEMENT) $(MY_PRODUCT_PROTECT_ENABLEMENT) $(ACL_ENABLEMENT) CPPEXTRA="$(CPPEXTRA)" $(FIPS_ENABLEMENT) CPPMORE="$(CPPMORE)" $(MY_PRODUCT_PROTECT_CPPEXTRA_ENABLEMENT) $(ACL_CPPEXTRA_ENABLEMENT) $(MAKE) $(AM_MAKEFLAGS) $(MAKEFLAGS) $(MY_PRODUCT_CLOUD_ENABLEMENT) $(MY_PRODUCT_PROTECT_ENABLEMENT) $(ACL_ENABLEMENT) $(FIPS_ENABLEMENT) $(MY_PRODUCT_ENABLEMENT) -f Makefile.product CPPEXTRA="$(CPPEXTRA)" CPPMORE="$(CPPMORE)" $(MY_PRODUCT_PROTECT_CPPEXTRA_ENABLEMENT) $(ACL_CPPEXTRA_ENABLEMENT)注意:
MAKEFLAGS可能会包含-j这类并行构建参数,不过调试场景下通常不会有影响。精准提取调试参数传递
如果只想传递--debug相关的参数,避免其他冗余选项,可以用Make的filter函数提取:# 从MAKEFLAGS中筛选出所有--debug开头的参数 DEBUG_ARGS := $(filter --debug%,$(MAKEFLAGS)) all-local: @echo Make custom with $(MY_PRODUCT_CLOUD_ENABLEMENT) $(MY_PRODUCT_PROTECT_ENABLEMENT) $(ACL_ENABLEMENT) CPPEXTRA="$(CPPEXTRA)" $(FIPS_ENABLEMENT) CPPMORE="$(CPPMORE)" $(MY_PRODUCT_PROTECT_CPPEXTRA_ENABLEMENT) $(ACL_CPPEXTRA_ENABLEMENT) $(MAKE) $(AM_MAKEFLAGS) $(DEBUG_ARGS) $(MY_PRODUCT_CLOUD_ENABLEMENT) $(MY_PRODUCT_PROTECT_ENABLEMENT) $(ACL_ENABLEMENT) $(FIPS_ENABLEMENT) $(MY_PRODUCT_ENABLEMENT) -f Makefile.product CPPEXTRA="$(CPPEXTRA)" CPPMORE="$(CPPMORE)" $(MY_PRODUCT_PROTECT_CPPEXTRA_ENABLEMENT) $(ACL_CPPEXTRA_ENABLEMENT)这样就只会把调试参数传给嵌套的Makefile,更精准。
验证参数是否传递成功
可以在Makefile.product里加一行输出,确认调试参数是否到位:# 在Makefile.product中添加 $(info Received debug flags: $(DEBUG_ARGS))
内容的提问来源于stack exchange,提问作者Gem Taylor
相关产品推荐
相关产品推荐

