Dollar ($) expansion still needs attention
Erik Joelsson
erik.joelsson at oracle.com
Mon Mar 4 12:42:27 UTC 2013
This certainly needs to be looked at. Thanks for bringing it up. Your
assessment of the situation looks correct to me.
/Erik
On 2013-03-04 05:59, David Holmes wrote:
> On 27/02/2013 10:14 PM, Jim Laskey (Oracle) wrote:
>> I wanted to double check and trace the origins of the MakeBase.gmk
>> patch before I responded. It was part of the original set Erik sent
>> me, but looking thru the other parts of the patch it's not clear why
>> it was necessary.
>>
>> http://cr.openjdk.java.net/~erikj/nashorn-build/webrev.01/
>
> So I got to the bottom of this. Basically if a make variable expands
> to contain a filename for a nested class (ie one with $ in it) then
> you need to escape the $ so that make doesn't treat it as a
> meta-character. And because $ is also the shell meta-character you end
> up needing a double escape of the form \$$$$, depending on how that
> variables gets used in targets/pre-reqs/recipes.
>
> Prior to the nashorn change ListPathsSafely didn't do any $ escaping
> and any explicit reference to a nested class file, such as:
>
> sun/awt/motif/X11GB2312\$$$$Decoder.class
>
> in the makefile, had to use the \$$$$. And everything worked fine.
>
> What nashorn introduced was .java files with $ in their name:
>
> > dir ../nashorn/src/jdk/nashorn/internal/scripts/
> total 16
> drwxr-xr-x 2 daholme uucp 4096 Feb 26 01:26 .
> drwxr-xr-x 8 daholme uucp 4096 Feb 26 01:26 ..
> -rw-r--r-- 1 daholme uucp 2027 Feb 26 01:26 JO$.java
> -rw-r--r-- 1 daholme uucp 1322 Feb 26 01:26 JS$.java
>
> so when ListPathsSafely was used together with a src directory to
> expand into a set of source files, there was no $ escaping and so the
> $ got dropped from the name, and so the nashorn build failed.
>
> So the escaping was added to ListPathsSafely. But not the full \$$$$
> as the need for that depends upon exactly how the make variable is
> used. For Java compilation commands ListPathSafely only had to do a
> simpler $ -> $$ escape sequence.
>
> But this means that anything explicitly escaped with \$$$$ and passed
> to ListPathsSafely was now broken as there were too many escapes. This
> is what broke the profiles builds. So to fix that we had to reduce the
> number of escapes in the explicitly named files ie:
>
> sun/awt/motif/X11GB2312\$$Decoder.class
>
> so that after processing by ListPathsSafely it was back to the full
> \$$$$ form.
>
> That would have been the end of it, except, as I pointed out, not all
> uses of nested class file names get passed through ListFilesSafely.
> Those that do not still need the \$$$$ escape, while those that do
> need only \$$. Hence we have the problem that when writing the name of
> such a file you have to know how it is going to be used - which is not
> a very maintainable solution.
>
> I propose that we regress the change to ListpathsSafely so that it
> doesn't do the $ escape, and instead we either:
>
> a) rename the nashorn .java files with $ in their name; or else
> b) add the $ escape at a different point in the src list expansion so
> that it only affects src list expansion
>
> Pragmatically I prefer (a) because having $ in filenames is really a
> PITA when it is both the make meta-character and the shell
> meta-character. It's too late for .class file names but if we can
> avoid adding it to .java file names then we will simplify our lives. :)
>
> Otherwise (b) should be done somewhere in the bowels of
> JavaCompilation.gmk, probably by adjusting $1_ALL_SRCS.
>
>
> David
> -----
>
>
>
>
>> -- Jim
>>
>>
>>
>>
>> On 2013-02-27, at 6:15 AM, Alan Bateman <Alan.Bateman at oracle.com> wrote:
>>
>>> On 27/02/2013 02:47, David Holmes wrote:
>>>> :
>>>>
>>>> So the same file names are listed once with \$$ and once with
>>>> \$$$$, and they both have to be that way to work!
>>>>
>>>> This is untenable. There should only be one way to write the name
>>>> of a nested class file inside the makefile.
>>>>
>>>> FYI in Profiles.gmk when expanding foo/*.class I already had to do
>>>> a similar substitution as is now in ListPathsSafely:
>>>>
>>>> # Function to expand foo/*.class into the set of classes
>>>> # NOTE: Classfiles with $ in their name are problematic as that is the
>>>> # meta-character for both make and the shell! Hence the \$$$$
>>>> substitution.
>>>> # But note that if you echo these values they will NOT display as
>>>> expected.
>>>> class_list = $(patsubst $(JDK_OUTPUTDIR)/classes/%,%,\
>>>> $(foreach i,$(1), $(subst $$,\$$$$, $(wildcard
>>>> $(JDK_OUTPUTDIR)/classes/$i))))
>>>>
>>>>
>>>> So I'd like to understand why the nashorn change was made so that
>>>> we can determine how to get back to only having one way to specify
>>>> file names containing $
>>> I completely agree, it's very difficult to maintain. Also the two
>>> patches yesterday were just to get the build working again (Erik is
>>> out this week so it wasn't possible to establish why MakeBase.gmk
>>> was changed, also I cannot find the review thread to know if it came
>>> up during the review).
>>>
>>> -Alan
>>
More information about the build-dev
mailing list