RFR: JDK-8244844 javac command line is not re-executable
Magnus Ihse Bursie
magnus.ihse.bursie at oracle.com
Tue May 12 17:32:30 UTC 2020
On 2020-05-12 19:17, Erik Joelsson wrote:
>
> On 2020-05-12 10:08, Magnus Ihse Bursie wrote:
>> On 2020-05-12 17:38, Erik Joelsson wrote:
>>> On 2020-05-12 08:29, Magnus Ihse Bursie wrote:
>>>> We've broken our golden rule in SetupJavaCompilation, that all
>>>> command lines should be copy/paste:able to re-execute them from the
>>>> command line. The reason is that the file containing the source
>>>> code file names has a temporary name, which is renamed after the
>>>> compilation. This is just a messy way to use the file both as input
>>>> to javac and as a marker that the compilation has succeeded. By
>>>> splitting up these two roles, we get more readable code and a
>>>> re-executable command line.
>>>>
>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8244844
>>>> WebRev:
>>>> http://cr.openjdk.java.net/~ihse/JDK-8244844-make-javac-re-executable/webrev.01
>>>>
>>> I really like seeing this fixed, but not sure about this patch. By
>>> moving the filelist to a separate rule and only having the source
>>> files as prereq, there will be cases where the source files
>>> timestamps have not changed, but the list of files may have. I think
>>> this would be safely covered if you moved VARDEPS_FILE as prereq to
>>> FILELIST.
>> I see your point. Will do that.
>>
>> I was also a bit divided about whether the actual javac invocation
>> rule should keep $$($1_SRCS) as a dependency. Technically, it's not
>> needed, since changes in the sources will result in the filelist
>> being updated, but maybe the intention will be better expressed. And
>> if the set of files has not changed, then we will write the same
>> files back to the filelist, which effectively just updates the
>> timestamp in a roundabout way. If we keep the list of source files as
>> dependency, we are free to implement a future optimization where the
>> filelist is not updated if the set of files has not changed.
>>
>> Otoh, I don't know if a huge list of dependencies (the number of
>> sources files for e.g. java.base is non-trivial!) affects make
>> performance, so listing it twice just to make it "look good" maybe
>> isn't a good idea.
>>
>> Do you have any opinion?
>>
> In general I like to list prereqs if they logically are direct
> prereqs. The sources are used as input in the compilation recipe, so
> that would be a direct prereq. If a prereq is really only transitive,
> then I don't want to list it. I don't know what the performance impact
> would be, I'm guessing it's not even measurable, but if it is, then
> maybe save some processing by not adding the sources to both rules. No
> strong opinion in this case.
Ok, I'll do it that way. I think we have generally the same preference here.
New webrev:
http://cr.openjdk.java.net/~ihse/JDK-8244844-make-javac-re-executable/webrev.02
/Magnus
>
> /Erik
>
>> /Magnus
>>>
>>> /Erik
>>>
>>>
>>
More information about the build-dev
mailing list