Problems using make wildcard function to define class lists
David Holmes
david.holmes at oracle.com
Wed Aug 15 23:01:49 PDT 2012
On 16/08/2012 2:18 PM, David Holmes wrote:
> I'm trying to define my own include/exclude class lists based on this
> example in CreateJars.gmk:
>
> LOCALEDATA_INCLUDE_PATTERNS := \
> sun/text/resources/*_ar* \
> ...
> sun/util/resources/*_zh*
>
> LOCALEDATA_INCLUDES := $(patsubst $(JDK_OUTPUTDIR)/classes/%,%,\
> $(foreach i,$(LOCALEDATA_INCLUDE_PATTERNS), $(wildcard
> $(JDK_OUTPUTDIR)/classes/$i)))
>
> But I discovered that if the class file represents an inner class and so
> has $ in its name, then the value returned by the wildcard function has
> been processed as if the $XXX were a variable and so is generally
> replaced with an empty string! Eg:
>
> Foo$bar.class -> Foo.class
Actually it is more weird than that. Given:
$(wildcard $(JDK_OUTPUTDIR)/classes/sun/nio/cs/CharsetMapping*.class)
where we have:
> ls -1 classes/sun/nio/cs/CharsetMapping*.class
classes/sun/nio/cs/CharsetMapping$1.class
classes/sun/nio/cs/CharsetMapping$2.class
classes/sun/nio/cs/CharsetMapping$3.class
classes/sun/nio/cs/CharsetMapping$4.class
classes/sun/nio/cs/CharsetMapping.class
classes/sun/nio/cs/CharsetMapping$Entry.class
the value from wildcard when printed is:
classes/sun/nio/cs/CharsetMapping.class
classes/sun/nio/cs/CharsetMapping.class
classes/sun/nio/cs/CharsetMapping.class
classes/sun/nio/cs/CharsetMapping.class
classes/sun/nio/cs/CharsetMapping.class
classes/sun/nio/cs/CharsetMapping.class
where all the $X values got substituted as empty variables. However this
set of values gets processed by ListPathsSafely to produce
_the.jars.exclude, and in there I find:
sun/nio/cs/CharsetMappingRT_JAR_EXCLUDES.class
sun/nio/cs/CharsetMapping
.class
sun/nio/cs/CharsetMapping1.class
sun/nio/cs/CharsetMapping250.class
sun/nio/cs/CharsetMapping.class
sun/nio/cs/CharsetMappingntry.class
So it seems that the actual values that come out of wildcard still
contain the $, and it is only when using the value that substitution
occurs. Hence inside the ListPathsSafely function I presume the $1, $2
etc try to map to function arguments which may not even exist.
On the plus side this may mean that it is possible to process the
wildcard result to escape the $ characters so that they get used verbatim.
David
-----
> This would seem to make wildcard very error prone to use as you have to
> know that there are not, and never will be, files with $ in their name.
>
> wildcard also does not handle recursion in sub-directories.
>
> Given the above perhaps use of wildcard for .class files should be
> replaced by $(shell find ...) ?
>
> David
More information about the build-infra-dev
mailing list