[External] : Re: Case-insensitive file systems and output file clashes - survey
Jonathan Gibbons
jonathan.gibbons at oracle.com
Thu Feb 23 19:33:04 UTC 2023
On 2/22/23 10:59 AM, Archie Cobbs wrote:
> On Wed, Feb 22, 2023 at 12:12 PM Jonathan Gibbons
> <jonathan.gibbons at oracle.com> wrote:
>
> On 2/22/23 8:06 AM, Archie Cobbs wrote:
>>
>> Add a new option -Xlint:fileclash that enables checking for
>> clashes (e.g., at the JavacFileSystemManager layer).
>>
> That would likely either be a partial solution, or an expensive
> one for a complete solution when taking separate compilation into
> account.
>
> I was thinking separate compilation would definitely not be supported
> (too complicated).
>
> Given that assumption, would it necessarily be only a partial fix?
Yes, it would be a partial fix, because by your own assumption, it would
not cover some important cases.
Also, the problem of file system issues is more than just case-clash
class names; on Windows, you cannot (or used not to be able) to write
files like CON, NUL, etc. (I haven't checked Windows to see if there are
still issues there.)
>
> Admittedly I haven't really checked to see whether this would work but
> a simple idea would be for the compiler to maintain e.g. a
> Map<JavaFileObject, ClassSymbol> , then after writing out a classfile,
> it adds the corresponding entry, OR finds that one already exists and
> emits an error that the two ClassSymbol's have clashing output files.
>
> You would maintain separate mappings for classfiles, header files, and
> source files.
>>
>> 1. Add new compiler flags -dzip, -szip, -hzip (corresponding to
>> -d, -s, -h) that specify ZIP files for output instead of
>> directories
>>
> I would recommend using the existing options, and just allow those
> options to specify a zip file, and then open the file with
> `zipfs`. That being said, updating zip files by "overwriting"
> existing entries comes with its own set of problems.
>
> Yep.. for efficiency you'd probably need to do some gymnastics, e.g.,
> have a staging directory, and then at the very end of the compilation
> write out a new ZIP file using merge sort with the original (if any).
>
If anyone were to pursue this, I would recommend that it be done at
least 99.99% in a separate implementation of `java.nio.file.FileSystem`,
and not directly in javac itself. Such a FileSystem could be used
without changing javac at all when invoking javac through its API (i.e.
`javax.tools.JavaCompiler.getTask`), or with minimal change to
command-line javac to specify the use of that file system.
-- Jon
> -Archie
>
> --
> Archie L. Cobbs
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/compiler-dev/attachments/20230223/9109e53c/attachment-0001.htm>
More information about the compiler-dev
mailing list