Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 解析多线程make';s输出(-j N)_Multithreading_Parsing_Gcc_Makefile - Fatal编程技术网

Multithreading 解析多线程make';s输出(-j N)

Multithreading 解析多线程make';s输出(-j N),multithreading,parsing,gcc,makefile,Multithreading,Parsing,Gcc,Makefile,我在公共目录中有很多源目录。当我通过发出命令开始make时: make -j 4 我从make的线程以及调用的gcc编译器实例接收到很多字符串。 对于解析错误,我必须运行make两次,第二次运行一个线程: make -j 1 所以我可以正确解析make的输出 是否有一种方法可以一次性运行多线程make并正确决定与哪个项目(源目录)相关的错误 谢谢大家! 如果将递归make(顽皮男孩)与-j一起使用,则可以使用shell脚本包装make,该脚本在输出的每一行前面加上一个唯一的per make调

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

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

make -j 1
所以我可以正确解析make的输出

是否有一种方法可以一次性运行多线程make并正确决定与哪个项目(源目录)相关的错误


谢谢大家!

如果将递归make(顽皮男孩)与
-j
一起使用,则可以使用shell脚本包装make,该脚本在输出的每一行前面加上一个唯一的per make调用字符串

$ 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
来更改源文件名,以便它们成为错误消息中的绝对路径名。

是否可以切换到pmake

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


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


它不仅解决了这个问题,而且速度也快了很多。

我明天再查看!管道至
sed
隐藏
make
的出口代码。您可能希望在脚本中使用
set-o pipefail
打开pipefail选项。我将您的答案传递给我的同事,他使用了所有*make-zoo,谢谢!