RFR: JDK-8075054 Mixed case Windows path break native dependency checks
Erik Joelsson
erik.joelsson at oracle.com
Fri Mar 13 12:56:50 UTC 2015
Looks good!
/Erik
On 2015-03-13 13:37, Magnus Ihse Bursie wrote:
> Bug description:
>
> If the top-level directory of the forest contains mixed case elements
> in the path, then the script which checks for native C/C++ headers
> dependencies doesn't work properly.
> This happens because Visual Studio compiler sometimes (?) produce
> lower-case only paths when invoked with the -showIncludes option used
> in the dependency tracking, and the script doesn't match these paths
> with the mixed case paths produced from the top-level directory.
>
> For example, if the top-level directory is /cygdrive/c/Vadim/jdk9,
> then the cl.exe invocation cmdline looks like this:
> /cygdrive/c/Vadim/jdk9/.../fixpath.exe -c ...cl ... -c -showIncludes
> ... /cygdrive/c/Vadim/jdk9/...foo.cpp | tee ... foo.d.raw
> The .d.raw file contains these lines (note the lowercase path):
> Note: including file:
> c:\vadim\jdk9-cpu\jdk\src\java.desktop\share\native\foo.h
>
> My proposed fix:
>
> diff --git a/make/common/NativeCompilation.gmk
> b/make/common/NativeCompilation.gmk
> --- a/make/common/NativeCompilation.gmk
> +++ b/make/common/NativeCompilation.gmk
> @@ -60,7 +60,7 @@
> -e 's|Note: including file: *||' \
> -e 's|\\|/|g' \
> -e 's|^\([a-zA-Z]\):|$(UNIX_PATH_PREFIX)/\1|g' \
> - -e '/$(subst /,\/,$(TOPDIR))/!d' \
> + -e '\|$(TOPDIR)|I !d' \
> -e 's|$$$$| \\|g' \
> #
>
> @@ -153,7 +153,7 @@
> exit `cat $$($1_$2_DEP).exitvalue`
> $(RM) $$($1_$2_DEP).exitvalue
> ($(ECHO) $$@: \\ \
> - && $(SED) $(WINDOWS_SHOWINCLUDE_SED_PATTERN)
> $$($1_$2_DEP).raw) > $$($1_$2_DEP)
> + && $(SED) $(WINDOWS_SHOWINCLUDE_SED_PATTERN)
> $$($1_$2_DEP).raw) | $(SORT) -u > $$($1_$2_DEP)
> endif
> # Create a dependency target file from the dependency file.
> # Solution suggested by
> http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/
>
> Some comments might be warranted.
>
> I learned a bit about sed expressions when fixing this. :) For those
> who didn't know, sed expressions consists of two parts, an "address"
> and a "command". A typical "s/foo/bar/" is just the command "s" with
> some arguments. The "s" command allows the separator to be changed
> from / to anything else, eg "s!foo!bar!", and without an address, it
> works on all lines.
>
> The problematic line is instead using the "d" (delete), or more
> precisely, the "!d" (not delete) command. The expression in front is
> the "address", which in this case is a regexp. So lines matching the
> regexp would not be deleted (but all others will). Since TOPDIR
> contains slashes, the old expression used make $(subst) to espace
> these slashes, so they wouldn't be interpreted as ending the address
> regexp. A better solution is to use a different character, but for the
> address, this require the regexp to be preceeded by a backslash.
> Hence, e.g. "\|foo| d" would delete all lines matching foo.
>
> After the expression is what solves this bug. It is an uppercase I,
> which is a GNU sed extension to make the regexp case insensitive.
> While it is available in GNU sed only, this is not a problem since
> it's only being used on Windows, where only GNU sed is supported.
>
> The second changed line is strictly not needed to fix the bug, but
> removes the prolific duplication of header files that the .d files had
> on Windows before, drastically reducing them in size.
>
> Bug: https://bugs.openjdk.java.net/browse/JDK-8075054
>
> /Magnus
>
More information about the build-dev
mailing list