繁体   English   中英

GNU递归make - 如何捕获make变量来执行嵌套的makefile

[英]GNU recursive make - how to capture make variables to execute nested makefile

我有一堆qmake生成的makefile,每个makefile都以链式方式调用make (recursive make )。

在我的构建结束后, qmake生成的makefile都在磁盘上,所以如果我想“重放”一个特定的makefile,你可以认为我可以在其中一个上调用make 错误。

当我尝试make -ing one时,它失败了,可能是因为在正常构建期间它通常从调用makefile继承了一堆(环境)变量。

除了变量之外,每个qmake生成的makefile都是独立的。

如何模拟给定递归make的“正常”环境,以便我可以单独调用它?

我想我必须对--print-data-base输出做一些事情:解析它然后make与正常构建期间相同的变量和值调用make

为什么

我这样做是因为我需要修改ONE makefile的编译命令,但它都是由顶级.conf控制的,而且我的方式太深了。

我假设问题是您需要在有机会对生成的makefile进行任何更改之前找到此信息。 因此,这个解决方案专注于shell命令(我假设你在Linux上,因为你没有说)。

在开始构建之后,第一次使用类似的东西:

ps -ef | head -1
ps -ef | grep make

找到构建中涉及的make进程。 PID列列出了make进程的进程ID,而PPID列列出了其父进程的进程ID。 使用此信息查找顶级制作过程。 然后,运行:

strings /proc/<pid>/environ | sort > /tmp/make_env
env | sort > /tmp/normal_env
diff /tmp/normal_env /tmp/make_env

这将向您展示make进程的环境与当前shell的环境有何不同。

现在,这可能无法解决您的问题,因为GNU Make允许将变量指定为命令行参数。 所以,你还应该检查它是如何运行的:

strings /proc/<pid>/cmdline

这将在单独的行上打印<pid>的每个命令行参数。

顺便说一下,当变量通过命令行参数传递给GNU Make时,它们是通过覆盖同一变量的任何实例来处理的,这些实例可能包含在makefile中。


在makefile中,您可以使用以下命令查看其环境:

$(info My environment is $(shell env))

您可以使用以下命令查看其命令行选项:

$(info MAKEFLAGS = $(MAKEFLAGS))

如果你希望看到的替换,使用MAKEOVERRIDES:

$(info MAKEOVERRIDES = $(MAKEOVERRIDES))

最后,可以使用以下方式查看目标:

$(info MAKECMDGOALS = $(MAKECMDGOALS))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM