Some serious issues with the new -O option

Some serious issues with the new -O option

classicClassiclistListthreadedThreaded
45 messages Options Options
123
Reply | Threaded | More  

Some serious issues with the new -O option

Stefano Lattarini
64 posts
I'm sorry to say that the new -O option can interact *badly*
with Automake-generated parallel testsuites (at least when they
are being run "interactively", that is, with the output of make
connected to a tty).

Let me elaborate a little (if you still have doubts or objections
after reading the considerations below, please do not hesitate to
ask for clarifications).

For long-running testsuite with lots of tests, the use of the '-O'
option prevents the results from the tests already run to be displayed
on the screen until the *whole* testsuite has run.  IMO, this destroys
feedback and readability of the output.  Try building GNU coreutils and
running its testsuite with "make -j2 -O" on a slowish system to see how
this can be annoying in practice.

Moreover, since the output of the recipes is no longer connected to
a terminal, automatic colorization of output no longer work: no more
good results in green and failures in red (unless the user forces
them by exporting AM_COLOR_TESTS to "always").

In defense of the '-O' option, I must say that I see how such an option
can be actually useful to produce more readable logs when the output is
being redirected to a file (so that one doesn't care about real-time
feedback on the console); but for most "interactive" usages, I believe
its downsides definitely overweight its advantages.

So please don't ever make that option the default; if you really really
want to, at least put in place some smart checks that only enable '-O'
when the output is *not* a tty, so that we can have the best of both
worlds (useful feedback for interactive runs, more readable logs for
batch runs).

Thanks,
  Stefano

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Tim Murphy-4
105 posts
I'm guessing here but I imagine the main problem comes with delaying the results of submakes?

I haven't tested to see if this is how the new feature works or not. I don't think it's completely necessary to keep all output from one submake together. so turning that off might make things more interactive,  Per-target syncing is a valid compromise.

Regards,

Tim


On 30 April 2013 10:48, Stefano Lattarini <[hidden email]> wrote:
I'm sorry to say that the new -O option can interact *badly*
with Automake-generated parallel testsuites (at least when they
are being run "interactively", that is, with the output of make
connected to a tty).

Let me elaborate a little (if you still have doubts or objections
after reading the considerations below, please do not hesitate to
ask for clarifications).

For long-running testsuite with lots of tests, the use of the '-O'
option prevents the results from the tests already run to be displayed
on the screen until the *whole* testsuite has run.  IMO, this destroys
feedback and readability of the output.  Try building GNU coreutils and
running its testsuite with "make -j2 -O" on a slowish system to see how
this can be annoying in practice.

Moreover, since the output of the recipes is no longer connected to
a terminal, automatic colorization of output no longer work: no more
good results in green and failures in red (unless the user forces
them by exporting AM_COLOR_TESTS to "always").

In defense of the '-O' option, I must say that I see how such an option
can be actually useful to produce more readable logs when the output is
being redirected to a file (so that one doesn't care about real-time
feedback on the console); but for most "interactive" usages, I believe
its downsides definitely overweight its advantages.

So please don't ever make that option the default; if you really really
want to, at least put in place some smart checks that only enable '-O'
when the output is *not* a tty, so that we can have the best of both
worlds (useful feedback for interactive runs, more readable logs for
batch runs).

Thanks,
  Stefano

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make



--
You could help some brave and decent people to have access to uncensored news by making a donation at:

http://www.thezimbabwean.co.uk/friends/

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Tim Murphy-4
105 posts
What I mean is that:

./make -Otarget

might be a good interactive default rather than -Omake.

Colouring is another issue which I would imagine could be done another way to let us have the best of both worlds.

Regards,

Tim


On 30 April 2013 10:55, Tim Murphy <[hidden email]> wrote:
I'm guessing here but I imagine the main problem comes with delaying the results of submakes?

I haven't tested to see if this is how the new feature works or not. I don't think it's completely necessary to keep all output from one submake together. so turning that off might make things more interactive,  Per-target syncing is a valid compromise.

Regards,

Tim


On 30 April 2013 10:48, Stefano Lattarini <[hidden email]> wrote:
I'm sorry to say that the new -O option can interact *badly*
with Automake-generated parallel testsuites (at least when they
are being run "interactively", that is, with the output of make
connected to a tty).

Let me elaborate a little (if you still have doubts or objections
after reading the considerations below, please do not hesitate to
ask for clarifications).

For long-running testsuite with lots of tests, the use of the '-O'
option prevents the results from the tests already run to be displayed
on the screen until the *whole* testsuite has run.  IMO, this destroys
feedback and readability of the output.  Try building GNU coreutils and
running its testsuite with "make -j2 -O" on a slowish system to see how
this can be annoying in practice.

Moreover, since the output of the recipes is no longer connected to
a terminal, automatic colorization of output no longer work: no more
good results in green and failures in red (unless the user forces
them by exporting AM_COLOR_TESTS to "always").

In defense of the '-O' option, I must say that I see how such an option
can be actually useful to produce more readable logs when the output is
being redirected to a file (so that one doesn't care about real-time
feedback on the console); but for most "interactive" usages, I believe
its downsides definitely overweight its advantages.

So please don't ever make that option the default; if you really really
want to, at least put in place some smart checks that only enable '-O'
when the output is *not* a tty, so that we can have the best of both
worlds (useful feedback for interactive runs, more readable logs for
batch runs).

Thanks,
  Stefano

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make



--
You could help some brave and decent people to have access to uncensored news by making a donation at:

http://www.thezimbabwean.co.uk/friends/



--
You could help some brave and decent people to have access to uncensored news by making a donation at:

http://www.thezimbabwean.co.uk/friends/

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Stefano Lattarini
64 posts
In reply to this post by Tim Murphy-4
On 04/30/2013 11:55 AM, Tim Murphy wrote:
> I'm guessing here but I imagine the main problem comes with delaying the
> results of submakes?
>
I think so, yes.  The Distributed Make from Sun implements a similar
output synchronization feature, and doesn't have the output delay problems
I have experienced with GNU make (while it shares the issues with automatic
output colorization).

> I haven't tested to see if this is how the new feature works or not. I
> don't think it's completely necessary to keep all output from one submake
> together. so turning that off might make things more interactive,
> Per-target syncing is a valid compromise.
>
Indeed.

> Regards,
>
> Tim

I leave my original message quoted here in tis entirety, for reference:

>
> On 30 April 2013 10:48, Stefano Lattarini < [hidden email]>wrote:
>
>> I'm sorry to say that the new -O option can interact *badly*
>> with Automake-generated parallel testsuites (at least when they
>> are being run "interactively", that is, with the output of make
>> connected to a tty).
>>
>> Let me elaborate a little (if you still have doubts or objections
>> after reading the considerations below, please do not hesitate to
>> ask for clarifications).
>>
>> For long-running testsuite with lots of tests, the use of the '-O'
>> option prevents the results from the tests already run to be displayed
>> on the screen until the *whole* testsuite has run.  IMO, this destroys
>> feedback and readability of the output.  Try building GNU coreutils and
>> running its testsuite with "make -j2 -O" on a slowish system to see how
>> this can be annoying in practice.
>>
>> Moreover, since the output of the recipes is no longer connected to
>> a terminal, automatic colorization of output no longer work: no more
>> good results in green and failures in red (unless the user forces
>> them by exporting AM_COLOR_TESTS to "always").
>>
>> In defense of the '-O' option, I must say that I see how such an option
>> can be actually useful to produce more readable logs when the output is
>> being redirected to a file (so that one doesn't care about real-time
>> feedback on the console); but for most "interactive" usages, I believe
>> its downsides definitely overweight its advantages.
>>
>> So please don't ever make that option the default; if you really really
>> want to, at least put in place some smart checks that only enable '-O'
>> when the output is *not* a tty, so that we can have the best of both
>> worlds (useful feedback for interactive runs, more readable logs for
>> batch runs).
>>
>> Thanks,
>>   Stefano


_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Stefano Lattarini
64 posts
In reply to this post by Tim Murphy-4
On 04/30/2013 12:01 PM, Tim Murphy wrote:
> What I mean is that:
>
> ./make -Otarget
>
> might be a good interactive default rather than -Omake.
>
I wasn't even aware of those differences; as of latest Git commit
'moved-to-git-46-g19a69ba', I don't see them documented in either
the help screen, the manpage, the texinfo manual, nor the NEWS file.

> Colouring is another issue which I would imagine could be done another way
> to let us have the best of both worlds.
>
That is not trivial to do I think.  For example, Automake-generated
testsuites check whether the stdout is a tty to decide whether or not
to automatically enable output colorization.  And testsuites produced by
Autotest do the same, AFAIK.  If the make connects the stdout of those
processes to non-tty files behind the scene, those checks are doomed to
fail.

Regards,
  Stefano

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Tim Murphy-4
105 posts
I know this isn't going to go down all that well, but I really think the output should be annotated in such a way that colourisation could be applied to the log file after a build has already finished.

e..g you load a makefile into VIM - it can colourise it. Or a bit of C source code. Why not the log of a build you did yesteday? It's still very nice to be able to distinguish things by colour later on.

Regards,

Tim


On 30 April 2013 11:16, Stefano Lattarini <[hidden email]> wrote:
On 04/30/2013 12:01 PM, Tim Murphy wrote:
> What I mean is that:
>
> ./make -Otarget
>
> might be a good interactive default rather than -Omake.
>
I wasn't even aware of those differences; as of latest Git commit
'moved-to-git-46-g19a69ba', I don't see them documented in either
the help screen, the manpage, the texinfo manual, nor the NEWS file.

> Colouring is another issue which I would imagine could be done another way
> to let us have the best of both worlds.
>
That is not trivial to do I think.  For example, Automake-generated
testsuites check whether the stdout is a tty to decide whether or not
to automatically enable output colorization.  And testsuites produced by
Autotest do the same, AFAIK.  If the make connects the stdout of those
processes to non-tty files behind the scene, those checks are doomed to
fail.

Regards,
  Stefano



--
You could help some brave and decent people to have access to uncensored news by making a donation at:

http://www.thezimbabwean.co.uk/friends/

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Stefano Lattarini
64 posts
On 04/30/2013 01:22 PM, Tim Murphy wrote:
> I know this isn't going to go down all that well, but I really think the
> output should be annotated in such a way that colourisation could be
> applied to the log file after a build has already finished.
>
While this might (underline "might" ;-) be an interesting feature, it
is orthogonal to the issue under question -- that is, the need to retain
the ability to automatically determine whether the output is going to a
tty or a "log file" (that is, any file that is not a tty).

> e..g you load a makefile into VIM - it can colourise it. Or a bit of C
> source code. Why not the log of a build you did yesteday? It's still very
> nice to be able to distinguish things by colour later on.
>
And notice that, currently, such a post-run colorization is easy to obtain,
if you are only interested in having it working 99% of the time: just color
a leading "PASS:" string in green, a leading "FAIL:" in red, e leading
"SKIP:" in blue, etc.

Regards,
  Stefano

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Paul Smith-20
2247 posts
In reply to this post by Stefano Lattarini
Just to be clear, you're saying that the testsuite runs as one long
operation, updating one target, and the recipe invokes one test script,
right?  I can see how that environment might be problematic for this new
feature.  It works much better for lots of smaller targets.

However, you could avoid this issue if you specify that the target to be
built is a sub-make, by prefixing it with a "+" operator for example.
If this is true and you use -Otarget or -Ojob then make will not capture
the output from that job.

Of course this also has the unfortunate side-effect that running "make
-n" will still try to run the test scripts.  Hm.

On Tue, 2013-04-30 at 11:48 +0200, Stefano Lattarini wrote:
> So please don't ever make that option the default; if you really
> really want to, at least put in place some smart checks that only
> enable '-O' when the output is *not* a tty, so that we can have the
> best of both worlds (useful feedback for interactive runs, more
> readable logs for batch runs).

This is a possibility for sure.

I have to say that my experience with parallel builds hasn't been as
wonderful as others here.  I often get output which is corrupted, and
not just by intermixing whole lines but also by having individual lines
intermixed (that is the beginning of the line is one job's output, then
the end of the line is another job's output, etc.)

This kind of corruption is often completely unrecoverable and I simply
re-run the build without parallelism enabled.

I think it depends on how much output jobs emit and how many you are
running at the same time.  It could also be that Windows is better about
avoiding interrupted writes to the same device.


Tim Murphy < [hidden email]> writes:
> What I mean is that:
>     ./make -Otarget
> might be a good interactive default rather than -Omake.

I always intended that and never suggested -Omake would be the default.
I think -Omake is only really useful for completely automated,
background builds.  It wouldn't ever be something someone would use if
they wanted to watch the build interactively.

> I haven't tested to see if this is how the new feature works or not. I
> don't think it's completely necessary to keep all output from one
> submake together. so turning that off might make things more
> interactive,  Per-target syncing is a valid compromise.

This is the default.  If you use -Otarget or (-Ojob) then what is
supposed to happen is that make uses the same sub-make detection
algorithms used for jobserver, etc. and if it determines that a job it's
going to run is a submake it does NOT collect its output.

However, I have suspicions that this is not working properly.  I have a
make-based cross-compilation environment (building gcc + tools) I've
been using for years, and I tried it with the latest make and -O and saw
similar problems (sub-make output collected into one large log instead
of per-target).

Thinking about it right now I think I might know what the problem is,
actually.  I'll look at this later.


Stefano Lattarini < [hidden email]> writes:
> I wasn't even aware of those differences; as of latest Git commit
> 'moved-to-git-46-g19a69ba', I don't see them documented in either
> the help screen, the manpage, the texinfo manual, nor the NEWS file.

I don't see where that code comes from?  There is no Git commit in the
standard GNU make archive with a SHA g19a69ba.  The current HEAD on
master is:

  19a69ba Support dynamic object loading on MS-Windows.

At any rate, the new option and option arguments are documented in the
manual and there is an overview including the option arguments in the
man page.  The NEWS file doesn't discuss the individual option
arguments, only the option.  Ditto the --help output.


_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Stefano Lattarini
64 posts
Hi Paul.

On 04/30/2013 03:37 PM, Paul Smith wrote:
> Just to be clear, you're saying that the testsuite runs as one long
> operation, updating one target, and the recipe invokes one test script,
> right?
>
No; the testsuite runs as a recursive make invocation (yes, this is sadly
truly needed in order to support all the features offered by the
Automake parallel testsuite harness --- sorry), but each test script (and
there can be hundreds of them, as is the case for GNU coreutils or GNU
automake itself) is run as a separate target, explicit for tests
which have no extension and pattern-based for tests that have an extension.

> I can see how that environment might be problematic for this new
> feature.  It works much better for lots of smaller targets.
>
See above: we are speaking of hundreds of little targets here ...

> However, you could avoid this issue if you specify that the target to be
> built is a sub-make,
>
The problem here is exactly the fact that the output of the sub-make is
not displayed until its execution has ended.

> by prefixing it with a "+" operator for example.
>
BTW, the "+" operator is not portable soem other make implementations
still targeted by Automake (e.g., Solaris make).

> If this is true and you use -Otarget or -Ojob then make will not capture
> the output from that job.
>
> Of course this also has the unfortunate side-effect that running "make
> -n" will still try to run the test scripts.
>
This would be horrific of course ;-)

> Hm.
>
> On Tue, 2013-04-30 at 11:48 +0200, Stefano Lattarini wrote:
>> So please don't ever make that option the default; if you really
>> really want to, at least put in place some smart checks that only
>> enable '-O' when the output is *not* a tty, so that we can have the
>> best of both worlds (useful feedback for interactive runs, more
>> readable logs for batch runs).
>
> This is a possibility for sure.
>
> I have to say that my experience with parallel builds hasn't been as
> wonderful as others here.
>
OTOH, mine has been very good, and I almost alway use "make -j8" or higher
when building GNU software (or other good software the relies on GNU make,
like Git).  The only real issues I've experienced so far have been when
I used the '-O' option ...

> I often get output which is corrupted, and
> not just by intermixing whole lines but also by having individual lines
> intermixed (that is the beginning of the line is one job's output, then
> the end of the line is another job's output, etc.)
>
Most of these issues are solved using silent-rules, as offered by Automake
or implemented ad-hoc by build systems of other software (Git, Linux).
I think the best ways to use parallel GNU make are:

  - with silent rules when the output goes to a tty (it makes the output
    visually scannable, and makes warnings and error messages form compilers
    and most other tools stand out much more clearly).

  - with verbose rules and possibly the -O option enabled when the output
    goes to a log, to simplify post-build debugging and analysis (especially
    useful with CI systems and the like).

> This kind of corruption is often completely unrecoverable and I simply
> re-run the build without parallelism enabled.
>
> I think it depends on how much output jobs emit and how many you are
> running at the same time.
>
Indeed; this corresponds to my experiences so far.

> It could also be that Windows is better about
> avoiding interrupted writes to the same device.
>
Not using windows, I cannot say anything here, sorry.

> Tim Murphy < [hidden email]> writes:
>> What I mean is that:
>>     ./make -Otarget
>> might be a good interactive default rather than -Omake.
>
> I always intended that and never suggested -Omake would be the default.
> I think -Omake is only really useful for completely automated,
> background builds.  It wouldn't ever be something someone would use if
> they wanted to watch the build interactively.
>
>> I haven't tested to see if this is how the new feature works or not. I
>> don't think it's completely necessary to keep all output from one
>> submake together. so turning that off might make things more
>> interactive,  Per-target syncing is a valid compromise.
>
> This is the default.  If you use -Otarget or (-Ojob) then what is
> supposed to happen is that make uses the same sub-make detection
> algorithms used for jobserver, etc. and if it determines that a job it's
> going to run is a submake it does NOT collect its output.
>
This appears not to be the case, actually ...

> However, I have suspicions that this is not working properly.  I have a
> make-based cross-compilation environment (building gcc + tools) I've
> been using for years, and I tried it with the latest make and -O and saw
> similar problems (sub-make output collected into one large log instead
> of per-target).
>
Glad to know you can reproduce this.

> Thinking about it right now I think I might know what the problem is,
> actually.  I'll look at this later.
>
Thanks!

> Stefano Lattarini < [hidden email]> writes:
>> I wasn't even aware of those differences; as of latest Git commit
>> 'moved-to-git-46-g19a69ba', I don't see them documented in either
>> the help screen, the manpage, the texinfo manual, nor the NEWS file.
>
> I don't see where that code comes from?  There is no Git commit in the
> standard GNU make archive with a SHA g19a69ba.
>
The SHA is 19a69ba; the leading 'g' is added by the "git describe" command.
Sorry for not saying that explicitly.

> The current HEAD on master is:
>
>   19a69ba Support dynamic object loading on MS-Windows.
>
We are referring to the same commit then.

> At any rate, the new option and option arguments are documented in the
> manual
>
Then I must be messing something up locally.  I'll see if I can solve this.

> and there is an overview including the option arguments in the
> man page.  The NEWS file doesn't discuss the individual option
> arguments, only the option.  Ditto the --help output.
>

Best regards,
  Stefano

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Paul Smith-20
2247 posts
On Tue, 2013-04-30 at 16:04 +0200, Stefano Lattarini wrote:

> On 04/30/2013 03:37 PM, Paul Smith wrote:
> > Just to be clear, you're saying that the testsuite runs as one long
> > operation, updating one target, and the recipe invokes one test script,
> > right?
> >
> No; the testsuite runs as a recursive make invocation (yes, this is
> sadly truly needed in order to support all the features offered by the
> Automake parallel testsuite harness --- sorry), but each test script
> (and there can be hundreds of them, as is the case for GNU coreutils
> or GNU automake itself) is run as a separate target, explicit for
> tests which have no extension and pattern-based for tests that have an
> extension.

This should work very well with -Otarget then, except for the
colorization/highlighting issue... once it works as expected.  I'll look
into this issue later and I would be interested to see your experience
with it once it's resolved.


_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Paul Smith-20
2247 posts
On Tue, 2013-04-30 at 10:39 -0400, Paul Smith wrote:

> On Tue, 2013-04-30 at 16:04 +0200, Stefano Lattarini wrote:
> > On 04/30/2013 03:37 PM, Paul Smith wrote:
> > > Just to be clear, you're saying that the testsuite runs as one long
> > > operation, updating one target, and the recipe invokes one test script,
> > > right?
> > >
> > No; the testsuite runs as a recursive make invocation (yes, this is
> > sadly truly needed in order to support all the features offered by the
> > Automake parallel testsuite harness --- sorry), but each test script
> > (and there can be hundreds of them, as is the case for GNU coreutils
> > or GNU automake itself) is run as a separate target, explicit for
> > tests which have no extension and pattern-based for tests that have an
> > extension.
>
> This should work very well with -Otarget then, except for the
> colorization/highlighting issue... once it works as expected.  I'll look
> into this issue later and I would be interested to see your experience
> with it once it's resolved.

OK, I found this bug.  Definitely make recursion was not being handled
properly with -Otarget and -Ojob in some situations; this broke as a
side effect of my cleanup to reuse the same temporary file for the
entire target, regardless of the output mode.

This should be fixed now.  Those who use recursive makefiles and were
seeing annoying delays in output with -O, please try again with the
latest commit and see if it works any better for you now.


_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Stefano Lattarini
64 posts
Hi Paul.

On 05/01/2013 02:04 PM, Paul Smith wrote:

> On Tue, 2013-04-30 at 10:39 -0400, Paul Smith wrote:
>> On Tue, 2013-04-30 at 16:04 +0200, Stefano Lattarini wrote:
>>> On 04/30/2013 03:37 PM, Paul Smith wrote:
>>>> Just to be clear, you're saying that the testsuite runs as one long
>>>> operation, updating one target, and the recipe invokes one test script,
>>>> right?
>>>>
>>> No; the testsuite runs as a recursive make invocation (yes, this is
>>> sadly truly needed in order to support all the features offered by the
>>> Automake parallel testsuite harness --- sorry), but each test script
>>> (and there can be hundreds of them, as is the case for GNU coreutils
>>> or GNU automake itself) is run as a separate target, explicit for
>>> tests which have no extension and pattern-based for tests that have an
>>> extension.
>>
>> This should work very well with -Otarget then, except for the
>> colorization/highlighting issue... once it works as expected.  I'll look
>> into this issue later and I would be interested to see your experience
>> with it once it's resolved.
>
> OK, I found this bug.  Definitely make recursion was not being handled
> properly with -Otarget and -Ojob in some situations; this broke as a
> side effect of my cleanup to reuse the same temporary file for the
> entire target, regardless of the output mode.
>
> This should be fixed now.  Those who use recursive makefiles and were
> seeing annoying delays in output with -O, please try again with the
> latest commit and see if it works any better for you now.
>
I can confirm the problem has disappeared for me.  Thanks!
(The issue with extra "Entering/Leaving directory" messages is still
present though; I hope it can be fixed before the release ...).

Best regards,
  Stefano

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Eli Zaretskii
1236 posts
In reply to this post by Paul Smith-20
> From: Paul Smith < [hidden email]>
> Date: Wed, 01 May 2013 08:04:08 -0400
> Cc: [hidden email]
>
> > This should work very well with -Otarget then, except for the
> > colorization/highlighting issue... once it works as expected.  I'll look
> > into this issue later and I would be interested to see your experience
> > with it once it's resolved.
>
> OK, I found this bug.  Definitely make recursion was not being handled
> properly with -Otarget and -Ojob in some situations; this broke as a
> side effect of my cleanup to reuse the same temporary file for the
> entire target, regardless of the output mode.

You forgot to make the same change in the WINDOWS32 branch.  I did
that in commit a87ff20.

> This should be fixed now.  Those who use recursive makefiles and were
> seeing annoying delays in output with -O, please try again with the
> latest commit and see if it works any better for you now.

Unfortunately, the delays are still here.  Moreover, it looks like
this change introduced some kind of regression.  With the following
Makefile:

all: simple recursive

simple: one two

one two:
        @echo start $@
        @sleep 1
        @echo stop $@
        @-false

recursive: rec1 rec2

rec1 rec2:
        @echo start $@
        $(MAKE) -f mkfsync simple
        @echo stop $@

I see this output with the previous version:

  D:\gnu\make-3.82.90_GIT_2013-04-20>gnumake -f mkfsync -j -O
  gnumake -f mkfsync simple
  gnumake -f mkfsync simple
  mkfsync:6: recipe for target 'one' failed
  gnumake: [one] Error 1 (ignored)
  start one
  stop one
  mkfsync:6: recipe for target 'two' failed
  gnumake: [two] Error 1 (ignored)
  start two
  stop two
  start rec2
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  mkfsync:6: recipe for target 'one' failed
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: [one] Error 1 (ignored)
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  start one
  stop one
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  mkfsync:6: recipe for target 'two' failed
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: [two] Error 1 (ignored)
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  start two
  stop two
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  stop rec2
  start rec1
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  mkfsync:6: recipe for target 'one' failed
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: [one] Error 1 (ignored)
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  start one
  stop one
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  mkfsync:6: recipe for target 'two' failed
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: [two] Error 1 (ignored)
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  start two
  stop two
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-04-20'
  stop rec1

Notice in particular how start rec1..stop rec1 occludes its
sub-targets, and the same for rec2.

After the change I see this:

  D:\gnu\make-3.82.90_GIT_2013-05-01>gnumake -f mkfsync -j -O
  gnumake -f mkfsync simple
  gnumake -f mkfsync simple
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-05-01'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-05-01'
  start one
  stop one
  mkfsync:6: recipe for target 'one' failed
  gnumake: [one] Error 1 (ignored)
  start two
  stop two
  mkfsync:6: recipe for target 'two' failed
  gnumake: [two] Error 1 (ignored)
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-05-01'
  start one
  stop one
  mkfsync:6: recipe for target 'one' failed
  gnumake[1]: [one] Error 1 (ignored)
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-05-01'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-05-01'
  start two
  stop two
  mkfsync:6: recipe for target 'two' failed
  gnumake[1]: [two] Error 1 (ignored)
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-05-01'
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-05-01'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-05-01'
  start one
  stop one
  mkfsync:6: recipe for target 'one' failed
  gnumake[1]: [one] Error 1 (ignored)
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-05-01'
  gnumake[1]: Entering directory 'D:/gnu/make-3.82.90_GIT_2013-05-01'
  start two
  stop two
  mkfsync:6: recipe for target 'two' failed
  gnumake[1]: [two] Error 1 (ignored)
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-05-01'
  gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-05-01'
  start rec1
  stop rec1
  start rec2
  stop rec2

And now rec1 and rec2 are announced only at the end.

I see the same result on GNU/Linux, so this isn't a Windows specific
problem.

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Stefano Lattarini
64 posts
On 05/01/2013 05:26 PM, Eli Zaretskii wrote:
>
> Unfortunately, the delays are still here.
>
I can say they're no longer there *in my use case*; I haven't tested
other use cases though.  Hope this is sorted out soon...

Thanks,
  Stefano

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Paul Smith-20
2247 posts
In reply to this post by Eli Zaretskii
On Wed, 2013-05-01 at 18:26 +0300, Eli Zaretskii wrote:
> You forgot to make the same change in the WINDOWS32 branch.  I did
> that in commit a87ff20.

Sorry, I missed that.

> > This should be fixed now.  Those who use recursive makefiles and were
> > seeing annoying delays in output with -O, please try again with the
> > latest commit and see if it works any better for you now.
>
> Unfortunately, the delays are still here.

Very odd.  This is the test program I used; can you verify:

  recurse: ; $(MAKE) -f $(firstword $(MAKEFILE_LIST)) all
  all: 2 4 6
  .RECIPEPREFIX := |
  2 4 6 :
  |@ echo start $@
  |@ sleep $@
  |@ echo end $@

Now running:

  $ make -Omake --no-print-directory -j -f ...

should wait for 6 seconds, then print everything at the end.  Running
this on the other hand:

  $ make -O --no-print-directory -j -f ...

should show "start 2"/"end 2" after 2 seconds, "start 4"/"end 4" after 2
more seconds (4 total), etc.

And, just for completeness, running this:

  $ make -Ojob --no-print-directory -j -f ...

should show all the "start 2", "start 4", "start 6" right away (possibly
out of order), then after 2 seconds "end 2", then 2 seconds later "end
4", etc.

Is that what you see?  If so then the feature is working as expected.
I'd be interested to know more details of the makefiles where you're
still seeing stuttering behavior.  Are the targets in this environment
printing a lot of output per recipe?

> Moreover, it looks like
> this change introduced some kind of regression.  With the following
> Makefile:

I don't think this is a regression.  It's unfortunate but I don't see
any alternative.

BTW, you might find it simpler to use --no-print-directory as above to
get rid of the enter/leave stuff until I work out how to do it better.

> Notice in particular how start rec1..stop rec1 occludes its
> sub-targets, and the same for rec2.

"Occludes"?  I don't sense anything occluded here.  Maybe a terminology
error... did you mean something like "brackets"?

Yes, that's the behavior we'd expect to see if make was not treating the
sub-make properly: it saves up the sub-make output and prints it once
the sub-make is completed.  The goal of this fix is to change that...

> After the change I see this:

>   gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-05-01'
>   gnumake[1]: Leaving directory 'D:/gnu/make-3.82.90_GIT_2013-05-01'
>   start rec1
>   stop rec1
>   start rec2
>   stop rec2
>
> And now rec1 and rec2 are announced only at the end.

This isn't a bug, this is expected behavior.  It's slightly unfortunate,
I agree.  Consider your rule:

> rec1 rec2:
>         @echo start $@
>         $(MAKE) -f mkfsync simple
>         @echo stop $@

Here we have a 3-line recipe: the first and third are not considered by
make to be recursive, while the second one is (due to the presence of
$(MAKE))

When we run with -O (-Otarget), make will save up the output from the
entire recipe and print it at the end, EXCEPT that output from a
recursive line is not saved: that's the entire point of this feature, to
allow sub-makes to show their output as they go.

So, the results of lines one and three (the echo's) are saved until the
"rec1" target is completely built, and printed at the end, while the
results of the make invocation in between are not saved, which is just
what you see.

If you want different behavior you can change your rule to use "+" on
the two echo lines, so that they're also considered recursive and not
saved up.  Now this recipe is basically run in -Ojob mode, BTW.  "+" has
other side-effects though (running even in -n mode) which might be
unpleasant.

The only alternative to this would be for make to try to figure out if
ANY of the lines in the recipe will be recursive, and if so treat ALL
the lines as if -Ojob was enabled (show output as soon as the line is
complete), while not treating them as recursive.  However since today we
don't parse lines completely until we're about to execute them, this
would be a not-insignificant change I think.


_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Eli Zaretskii
1236 posts
> From: Paul Smith < [hidden email]>
> Cc: [hidden email], [hidden email]
> Date: Wed, 01 May 2013 14:41:25 -0400
>
> > Unfortunately, the delays are still here.
>
> Very odd.  This is the test program I used; can you verify:
>
>   recurse: ; $(MAKE) -f $(firstword $(MAKEFILE_LIST)) all
>   all: 2 4 6
>   .RECIPEPREFIX := |
>   2 4 6 :
>   |@ echo start $@
>   |@ sleep $@
>   |@ echo end $@
>
> Now running:
>
>   $ make -Omake --no-print-directory -j -f ...
>
> should wait for 6 seconds, then print everything at the end.  Running
> this on the other hand:
>
>   $ make -O --no-print-directory -j -f ...
>
> should show "start 2"/"end 2" after 2 seconds, "start 4"/"end 4" after 2
> more seconds (4 total), etc.
>
> And, just for completeness, running this:
>
>   $ make -Ojob --no-print-directory -j -f ...
>
> should show all the "start 2", "start 4", "start 6" right away (possibly
> out of order), then after 2 seconds "end 2", then 2 seconds later "end
> 4", etc.
>
> Is that what you see?

Yes.  But I thought the change was about -Otarget, not -Ojob.  Stefano
was complaining about a plain -O, so -Ojob is not what was his
problem.

> I don't think this is a regression.  It's unfortunate but I don't see
> any alternative.

Too bad.

> > rec1 rec2:
> >         @echo start $@
> >         $(MAKE) -f mkfsync simple
> >         @echo stop $@
>
> Here we have a 3-line recipe: the first and third are not considered by
> make to be recursive, while the second one is (due to the presence of
> $(MAKE))
>
> When we run with -O (-Otarget), make will save up the output from the
> entire recipe and print it at the end, EXCEPT that output from a
> recursive line is not saved: that's the entire point of this feature, to
> allow sub-makes to show their output as they go.
>
> So, the results of lines one and three (the echo's) are saved until the
> "rec1" target is completely built, and printed at the end, while the
> results of the make invocation in between are not saved, which is just
> what you see.
>
> If you want different behavior you can change your rule to use "+" on
> the two echo lines, so that they're also considered recursive and not
> saved up.  Now this recipe is basically run in -Ojob mode, BTW.  "+" has
> other side-effects though (running even in -n mode) which might be
> unpleasant.

That is completely unexpected for me: I thought that -Otarget meant
that all the output from making a target, e.g. rec1, will be output as
a single unit.  If that's not the intent, then why is it called
"target"?

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Eli Zaretskii
1236 posts
In reply to this post by Paul Smith-20
> From: Paul Smith < [hidden email]>
> Cc: [hidden email], [hidden email]
> Date: Wed, 01 May 2013 14:41:25 -0400
>
> If you want different behavior you can change your rule to use "+" on
> the two echo lines, so that they're also considered recursive and not
> saved up.

If I do that, the echo from rec1 and rec2 mix up:

  D:\gnu\make-3.82.90_GIT_2013-05-01>gnumake -f mkfsync3 -j -O
  start rec2start <<<<<<<<<<<<<<<<<<<<
   rec1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  gnumake -f mkfsync simple
  gnumake -f mkfsync simple

Is this also expected?

Anyway, my mental model of what's going on under -O is now completely
shattered.  I cannot understand what good is this behavior:

> entire recipe and print it at the end, EXCEPT that output from a
> recursive line is not saved: that's the entire point of this feature, to
> allow sub-makes to show their output as they go.

Why is it important to make that exception?  And shouldn't we have an
option _not_ to make such an exception, but without -Omake,
i.e. without waiting for the whole session to end?  Whenever any
top-level recipe finishes, it is flushed to the screen as a single
unit.  Does this make sense?

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Paul Smith-20
2247 posts
In reply to this post by Eli Zaretskii
On Wed, 2013-05-01 at 22:08 +0300, Eli Zaretskii wrote:
> Yes.  But I thought the change was about -Otarget, not -Ojob.  Stefano
> was complaining about a plain -O, so -Ojob is not what was his
> problem.

Yes, it is about -Otarget.  As I said, I added -Ojob output "just for
completeness".  The important distinctions (for this thread) are between
-Otarget and -Omake.  If you see the behavior I describe for those two
flags then things are working as expected.

If you still see choppiness in the output with -Otarget and you see the
behavior I describe, I'd be interested to know more about the targets
you're building.  I'd also be interested to know if using -Otarget vs.
-Ojob makes any difference in the choppiness.

If your recipe normally runs for 5 seconds (say) and it continually
generates output during that time, then yes, certainly the -O feature
will result in choppiness because instead of a sequence of continuous
output over 5 seconds you get 5 seconds of silence, followed by all the
output.  That is the nature of the beast... if this bothers you (more
than having interleaved parallel output) best to not use -O.

I suggest that for MOST makefile targets, this is not the normal
behavior.  Most makefile targets (building a .o for example) are built
relatively quickly and, more importantly, they don't expect to see much
output except on failure.

I would also point out that the more output your targets generate the
more likely you are to get output corruption when running with high -j,
and the more you'd be likely to benefit from -O.

> That is completely unexpected for me: I thought that -Otarget meant
> that all the output from making a target, e.g. rec1, will be output as
> a single unit.  If that's not the intent, then why is it called
> "target"?

That IS the intent.

However, in the presence of makefile recursion this model fails.
Consider if you have a makefile, like every single automake makefile for
example!, where the "top-level" target is nothing more than a recursive
invocation of a sub-make with some extra arguments, and the sub-make
actually does all the work:

   all: config.h
           $(MAKE) $(AM_MAKEFLAGS) all-recursive

Now, if you do nothing special for recursive make, you'll get no output
from the entire build until it is completely done, because all the
output from the recursive make command is going to the temporary file
for that target, then it all gets dumped at the same time.

I think this makes the output sync feature much less useful: it's only
appropriate for building in the background where no one looks at the
output until it's done.  If you want that behavior, though, that's
exactly what the -Omake option selects so it's available.

For -Otarget we introduce an exception to deal with this problem: if we
detect we're about to invoke a recursive make, we do NOT redirect the
output to the temp file.  We let each target of that make print its
output immediately.  This way you don't have to wait for an entire
recursive make to finish before you see any of its output.

> Why is it important to make that exception?  And shouldn't we have an
> option _not_ to make such an exception, but without -Omake,
> i.e. without waiting for the whole session to end?  Whenever any
> top-level recipe finishes, it is flushed to the screen as a single
> unit.  Does this make sense?

I don't understand the change that you're suggesting.  That's exactly
what -Omake does today: whenever any recipe finishes it is flushed to
the screen as a single unit, and no special handling is given to
recursive makes.

If we can improve on this I'm very interested to hear the details.


_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Eli Zaretskii
1236 posts
> From: Paul Smith < [hidden email]>
> Cc: [hidden email], [hidden email]
> Date: Wed, 01 May 2013 16:27:58 -0400
>
> If your recipe normally runs for 5 seconds (say) and it continually
> generates output during that time, then yes, certainly the -O feature
> will result in choppiness because instead of a sequence of continuous
> output over 5 seconds you get 5 seconds of silence, followed by all the
> output.

I think that's the reason, yes.

> Consider if you have a makefile, like every single automake makefile for
> example!, where the "top-level" target is nothing more than a recursive
> invocation of a sub-make with some extra arguments, and the sub-make
> actually does all the work:
>
>    all: config.h
>            $(MAKE) $(AM_MAKEFLAGS) all-recursive
>
> Now, if you do nothing special for recursive make, you'll get no output
> from the entire build until it is completely done, because all the
> output from the recursive make command is going to the temporary file
> for that target, then it all gets dumped at the same time.

Not every Makefile looks like that on its top level.  I agree that we
should cater to the above, but perhaps we could do that without
"punishing" the other use cases.  For example, perhaps we should have
a -Osub-make option that will _not_ activate sync-output on the top
level, only in the sub-make's.  This should produce the desired
results, I think.

> > shouldn't we have an option _not_ to make such an exception, but
> > without -Omake, i.e. without waiting for the whole session to end?
> > Whenever any top-level recipe finishes, it is flushed to the
> > screen as a single unit.  Does this make sense?
>
> I don't understand the change that you're suggesting.  That's exactly
> what -Omake does today: whenever any recipe finishes it is flushed to
> the screen as a single unit, and no special handling is given to
> recursive makes.

In my case, I see all the output at once.  Maybe I misunderstand what
-Omake is supposed to do, too.

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
Reply | Threaded | More  

Re: Some serious issues with the new -O option

Tim Murphy-4
105 posts
One optimisation I have thought of in the past for this situation would be to allow a single "job"  to hold onto the lock when it obtained it.

This way it could output directly to the console while all other jobs would have to buffer. When it released, the next job lucky enough to grab the lock might have a full buffer already.

It might appear to be less choppy.  Not sure how it would perform.

Regards,

Tim


On 2 May 2013 03:53, Eli Zaretskii <[hidden email]> wrote:
> From: Paul Smith < [hidden email]>
> Cc: [hidden email], [hidden email]
> Date: Wed, 01 May 2013 16:27:58 -0400
>
> If your recipe normally runs for 5 seconds (say) and it continually
> generates output during that time, then yes, certainly the -O feature
> will result in choppiness because instead of a sequence of continuous
> output over 5 seconds you get 5 seconds of silence, followed by all the
> output.

I think that's the reason, yes.

> Consider if you have a makefile, like every single automake makefile for
> example!, where the "top-level" target is nothing more than a recursive
> invocation of a sub-make with some extra arguments, and the sub-make
> actually does all the work:
>
>    all: config.h
>            $(MAKE) $(AM_MAKEFLAGS) all-recursive
>
> Now, if you do nothing special for recursive make, you'll get no output
> from the entire build until it is completely done, because all the
> output from the recursive make command is going to the temporary file
> for that target, then it all gets dumped at the same time.

Not every Makefile looks like that on its top level.  I agree that we
should cater to the above, but perhaps we could do that without
"punishing" the other use cases.  For example, perhaps we should have
a -Osub-make option that will _not_ activate sync-output on the top
level, only in the sub-make's.  This should produce the desired
results, I think.

> > shouldn't we have an option _not_ to make such an exception, but
> > without -Omake, i.e. without waiting for the whole session to end?
> > Whenever any top-level recipe finishes, it is flushed to the
> > screen as a single unit.  Does this make sense?
>
> I don't understand the change that you're suggesting.  That's exactly
> what -Omake does today: whenever any recipe finishes it is flushed to
> the screen as a single unit, and no special handling is given to
> recursive makes.

In my case, I see all the output at once.  Maybe I misunderstand what
-Omake is supposed to do, too.

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make



--
You could help some brave and decent people to have access to uncensored news by making a donation at:

http://www.thezimbabwean.co.uk/friends/

_______________________________________________
Bug-make mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/bug-make
123

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值