multithreading - 解析多线程make的输出(-j N)

标签 multithreading parsing gcc makefile

我在公共(public)目录中有很多源目录。当我通过发出命令开始制作时:

make -j 4

我从 make 的线程中收到很多字符串以及调用的 gcc 编译器实例。 对于解析错误,我必须运行两次 make,第二次使用一个线程:

make -j 1

这样我就可以正确解析 make 的输出了。

有没有办法一次运行多线程 make 并正确确定哪个错误与哪个项目(源目录)相关?

谢谢!

最佳答案

如果您将递归 make (naughty boy) 与 -j 一起使用,那么您可以使用 shell 脚本包装 Make,该脚本在每行输出前加上一个唯一的 per-make-invocation 字符串。

$ cat M
#!/bin/bash
PREFIX=$$:
exec -a $0 make "$@" 2>&1 | sed "s/^/$PREFIX/"

现在,假设您的 makefile 正确使用 ${MAKE} 来指示递归,我们可以使用 ./M 代替 make

$ ./M -j --no-print-directory target
28720:/home/user/M -fa.mak
28720:/home/user/M -fb.mak
28720:/home/user/M -fc.mak
28720:/home/user/M -fd.mak
28720:/home/user/M -fe.mak
28720:32484:gcc blah...
28720:31936:/home/user/M -fanother.mak
28720:32484:gcc blah...
28720:31936:gcc blah...
28720:31936:gcc blah...
28720:31936:56781:echo blah...
∶

在这种情况下,每一行都以进程 ID 列表为前缀(有利于调试递归 make)。对于您的用例,您可能更喜欢 M 来修改源文件名,以便它们成为错误消息中的绝对路径名。

关于multithreading - 解析多线程make的输出(-j N),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4526524/

相关文章:

c - 错误 "Conversion to non-scalar type requested"

java - Android - "Faking"触摸事件不起作用

c++ - Eclipse CDT (C++ IDE) 与 Visual Studio 2013 编译器

linux - 在自定义工具中使用 traceroute 时出现编译问题

c++ - 在程序终止前加入线程

c - 创建另一个线程后Main()线程id不同

c - 在C中将四个字节解析为 float

java - 如何拆分句子?

java - 在 Android Studio 中将嵌套 JSON 反序列化为 Java

gcc - 退出系统调用的正确常量是什么?