gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:12:41 24 4
gpt4 key购买 nike

我有一堆 qmake 生成的 makefile,每个文件都以链式方式在其中调用 make(递归 make)。

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

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

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

问题

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

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

为什么

我这样做是因为我需要修改一个 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

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

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


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

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

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

$(info MAKEFLAGS = $(MAKEFLAGS))

如果您想看到覆盖,使用 MAKEOVERRIDES:

$(info MAKEOVERRIDES = $(MAKEOVERRIDES))

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

$(info MAKECMDGOALS = $(MAKECMDGOALS))

关于c++ - GNU 递归 make - 如何捕获 make 变量以执行嵌套的 makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39000279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com