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

时间:2010-12-24 13:07:50

标签: multithreading parsing gcc makefile

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

make -j 4

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

make -j 1

所以我可以正确解析make的输出。

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

谢谢!

3 个答案:

答案 0 :(得分:6)

如果你正在使用递归make(顽皮男孩)和-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来破坏源文件名,以便它们成为错误消息中的绝对路径名。

答案 1 :(得分:1)

可以切换到make吗?

PMake设置为以优雅的方式处理多个作业的输出(source

答案 2 :(得分:1)

如果您正在使用某种元构建系统(例如CMake),请尝试使用Ninja来实际运行构建。

它解决了这个问题并且速度要快得多。