How to use synchronization in makefile?

蹲街弑〆低调 提交于 2020-01-07 03:25:08

问题


From the docs:

To avoid this you can use the --output-sync (-O) option. This option instructs make to save the output from the commands it invokes and print it all once the commands are completed. Additionally, if there are multiple recursive make invocations running in parallel, they will communicate so that only one of them is generating output at a time.



So, given a makefile:

# A "recipe" that will always fail.
all::
    @foo bar baz



And running, we get:

# A "non-synchronized" run
$ make
make: foo: Command not found
makefile:3: recipe for target 'all' failed
make: *** [all] Error 127

# Synchronize!
$ make --output-sync
makefile:3: recipe for target 'all' failed
make: *** [all] Error 127



Can you see a difference between the 2 runs?

Well, they both fail!

But, in the first run, Make let's us know why it failed, as it "let-through" the failing error(s) from the recipe:

make: foo: Command not found

But, for the second run, all we get, is:

makefile:3: recipe for target 'all' failed
make: *** [all] Error 127

But why? Why did it fail..Were there any debugging errors - from the recipe - that it failed? Sure there were! As evident by the 1st run! So, Why is Make so quick to hide them?

Now - that Make is hiding the error message - all we can do here, is: to guess!

We are very lucky here, because we know that "foo..." is an invalid command, so probably, somewhere, behind the curtains, this command was not acceptable, for this very reason.

But, consider this:

  • Imagine, when you have some typo in a command?

  • Now, imagine a typo in complex makefile!

  • Now, imagine the typo in a complex makefile run recursively!

  • Now, imagine all that in a makefile that runs for long period of times, outputting considerable amount of output!

How, then, could it be still justified for Make to "hide" some debugging errors, and show others?


(Versions note: All versions supporting synchronization, hence: 4.0 and up).


回答1:


I had opened a bug report on this the other day here https://savannah.gnu.org/bugs/index.php?47365

It should be fixed now http://git.savannah.gnu.org/cgit/make.git/commit/?id=14b2d7effb0afd75dfd1ed2534e331784f7d2977

I guess you can build the latest version from source or wait until they make another official release. I'll be building from source as I need this fix ASAP :)



来源:https://stackoverflow.com/questions/32164266/how-to-use-synchronization-in-makefile

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!