Windows: problem with msvxxx.dll locations containing spaces

Thomas Stüfe thomas.stuefe at gmail.com
Mon May 7 14:37:09 UTC 2018


Hi Erik,

since your proposal worked, will you do a fix?

Thanks, Thomas

On Fri, May 4, 2018 at 8:30 AM, Thomas Stüfe <thomas.stuefe at gmail.com> wrote:
> Hi Erik,
>
> that worked on both machines for all builds.
>
> Thanks, Thomas
>
> On Thu, May 3, 2018 at 10:13 PM, Erik Joelsson <erik.joelsson at oracle.com> wrote:
>> Hello,
>>
>> In my case, VCINSTALLDIR is in short form already. Could you try changing
>> line 543 from BASIC_WINDOWS_REWRITE_AS_UNIX_PATH to BASIC_FIXUP_PATH?
>>
>> /Erik
>>
>>
>>
>> On 2018-05-03 11:17, Thomas Stüfe wrote:
>>>
>>> Hi Erik,
>>>
>>> I see the error on two very different machines. One is my private
>>> machine - windows 7, VS2013 and VS2017 installed. The second one is my
>>> corporate Laptop, Windows 10 and only VS2013.
>>>
>>> In both cases I use a very recent cygwin64 installation.
>>>
>>> Both cases run in TOOLCHAIN_SETUP_MSVC_DLL into the "# Probe: Using
>>> well-known location from Visual Studio 12.0 and older" case, and in
>>> the for loop at line 559 attempt to tokenize the POSSIBLE_MSVC_DLL
>>> variable content. Here the 64bit build on my corporate laptop:
>>>
>>> checking if fixpath.exe works... yes
>>> POSSIBLE_MSVC_DLL /cygdrive/c/Program
>>> POSSIBLE_MSVC_DLL Files
>>> POSSIBLE_MSVC_DLL (x86)/Microsoft
>>> POSSIBLE_MSVC_DLL Visual
>>> POSSIBLE_MSVC_DLL Studio
>>> POSSIBLE_MSVC_DLL 12.0/VC/redist/x64/Microsoft.VC120.CRT/msvcr120.dll
>>> configure: Found msvcr120.dll at
>>> /cygdrive/c/WINDOWS/system32/msvcr120.dll using well-known location in
>>> SYSTEMROOT
>>> checking found msvcr120.dll architecture... ok
>>> checking for msvcr120.dll... /cygdrive/c/WINDOWS/system32/msvcr120.dll
>>> POSSIBLE_MSVC_DLL /cygdrive/c/Program
>>> POSSIBLE_MSVC_DLL Files
>>> POSSIBLE_MSVC_DLL (x86)/Microsoft
>>> POSSIBLE_MSVC_DLL Visual
>>> POSSIBLE_MSVC_DLL Studio
>>> POSSIBLE_MSVC_DLL 12.0/VC/redist/x64/Microsoft.VC120.CRT/msvcp120.dll
>>> configure: Found msvcp120.dll at
>>> /cygdrive/c/WINDOWS/system32/msvcp120.dll using well-known location in
>>> SYSTEMROOT
>>>
>>> As you can see, we fall back to the default in windows/system32, which
>>> happens to be working for 64bit. On 32bit, we get this error:
>>>
>>> checking if fixpath.exe works... yes
>>> POSSIBLE_MSVC_DLL /cygdrive/c/Program
>>> POSSIBLE_MSVC_DLL Files
>>> POSSIBLE_MSVC_DLL (x86)/Microsoft
>>> POSSIBLE_MSVC_DLL Visual
>>> POSSIBLE_MSVC_DLL Studio
>>> POSSIBLE_MSVC_DLL 12.0/VC/redist/x86/Microsoft.VC120.CRT/msvcr120.dll
>>> configure: Found msvcr120.dll at
>>> /cygdrive/c/WINDOWS/system32/msvcr120.dll using well-known location in
>>> SYSTEMROOT
>>> checking found msvcr120.dll architecture... incorrect, ignoring
>>> configure: The file type of the located msvcr120.dll is PE32+
>>> executable (DLL) (GUI) x86-64, for MS Windows
>>> configure: Found msvcr120.dll at /cygdrive/c/Program Files
>>> (x86)/Microsoft Visual Studio
>>> 12.0/VC/redist/arm/Microsoft.VC120.CRT/msvcr120.dll using search of
>>> VCINSTALLDIR
>>> checking found msvcr120.dll architecture... incorrect, ignoring
>>> configure: The file type of the located msvcr120.dll is PE32
>>> executable (DLL) (GUI) ARMv7 Thumb, for MS Windows
>>> checking for msvcr120.dll... no
>>> configure: error: Could not find msvcr120.dll. Please specify using
>>> --with-msvcr-dll.
>>> configure exiting with result code 1
>>>
>>> Best Regards, Thomas
>>>
>>> On Thu, May 3, 2018 at 7:18 PM, Erik Joelsson <erik.joelsson at oracle.com>
>>> wrote:
>>>>
>>>> Also, on my windows system, if I try using my local Visual Studio, both
>>>> MSVC
>>>> dll's are found in the Visual Studio dir, and the spaces are all cleaned
>>>> up.
>>>> I wonder what's different about your setup, Thomas.
>>>>
>>>> /Erik
>>>>
>>>>
>>>>
>>>> On 2018-05-03 10:13, Erik Joelsson wrote:
>>>>>
>>>>> Hello,
>>>>>
>>>>> On 2018-05-03 03:41, Magnus Ihse Bursie wrote:
>>>>>>
>>>>>> I think the main issue here is that BASIC_FIXUP_PATH should be called
>>>>>> for
>>>>>> the located msvcr*.dll files. I don't have time to look at it now, but
>>>>>> see
>>>>>> if you can do a rewrite using BASIC_FIXUP_PATH when the potential file
>>>>>> is
>>>>>> located. This should remove all spaces from the path.
>>>>>>
>>>>> No, that is not a good solution. I intentionally removed that
>>>>> BASIC_FIXUP_PATH because in VS2017, one of the files has a file name
>>>>> longer
>>>>> than 8 characters and BASIC_FIXUP_PATH rewrites that filename to short
>>>>> style. This in turn has weird consequences in make when we copy that
>>>>> file
>>>>> using generated copy rules. The target file then gets the short style
>>>>> name
>>>>> literally.
>>>>>
>>>>> When I made that change, I looked at all the calls for potential
>>>>> locations
>>>>> and thought all of them had the directory prepared properly already. It
>>>>> seems I was wrong. I think the correct solution is to either get rid of
>>>>> spaces earlier for all the input directories we search, or maybe tweak
>>>>> BASIC_FIXUP_PATH to not touch the actual filename.
>>>>>
>>>>> /Erik
>>>>>>
>>>>>> /Magnus
>>>>>>
>>>>>> On 2018-05-02 20:46, Thomas Stüfe wrote:
>>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> My 32bit builds on Windows were failing since quite a while and I
>>>>>>> finally had some minutes to look into that.
>>>>>>>
>>>>>>> See prior discussion here:
>>>>>>>
>>>>>>> http://mail.openjdk.java.net/pipermail/build-dev/2018-March/021150.html
>>>>>>>
>>>>>>> My output used to look like this:
>>>>>>>
>>>>>>> checking if fixpath.exe works... yes
>>>>>>> POSSIBLE_MSVC_DLL /cygdrive/c/Program
>>>>>>> POSSIBLE_MSVC_DLL Files
>>>>>>> POSSIBLE_MSVC_DLL (x86)/Microsoft
>>>>>>> POSSIBLE_MSVC_DLL Visual
>>>>>>> POSSIBLE_MSVC_DLL Studio
>>>>>>> POSSIBLE_MSVC_DLL 12.0/VC/redist/x64/Microsoft.VC120.CRT/msvcr120.dll
>>>>>>> configure: Found msvcr120.dll at
>>>>>>> /cygdrive/c/Windows/system32/msvcr120.dll using well-known location in
>>>>>>> SYSTEMROOT
>>>>>>>
>>>>>>> So basically, build does not correctly search for msvcr120.dll in
>>>>>>> "/cygdrive/c/Program Files (x86)/Microsoft Visual Studio
>>>>>>> 12.0/VC/redist/x86/Microsoft.VC120.CRT/msvcr120.dll" - instead, it
>>>>>>> fails and falls back to the system default
>>>>>>> "/cygdrive/c/Windows/system32/msvcr120.dll". That dll is a 64bit dll,
>>>>>>> and so configure fails.
>>>>>>>
>>>>>>> Note that 64bit build shows exactly the same behaviour! Only there it
>>>>>>> works by accident, since the default
>>>>>>> /cygdrive/c/Windows/system32/msvcr120.dll it finds happens to be a
>>>>>>> 64bit library too, so configure succeeds.
>>>>>>>
>>>>>>> Part of the problem is TOOLCHAIN_SETUP_MSVC_DLL in
>>>>>>> toolchain_windows.m4. We use a bash for loop to iterate thru a list of
>>>>>>> one or more files, but that for expression should be quoted.
>>>>>>>
>>>>>>> If I make this fix:
>>>>>>>
>>>>>>> --- a/make/autoconf/toolchain_windows.m4        Mon Apr 23 18:04:17
>>>>>>> 2018
>>>>>>> -0700
>>>>>>> +++ b/make/autoconf/toolchain_windows.m4        Wed May 02 18:38:04
>>>>>>> 2018
>>>>>>> +0200
>>>>>>> @@ -556,7 +556,7 @@
>>>>>>>            fi
>>>>>>>          fi
>>>>>>>          # In case any of the above finds more than one file, loop
>>>>>>> over
>>>>>>> them.
>>>>>>> -      for possible_msvc_dll in $POSSIBLE_MSVC_DLL; do
>>>>>>> +      for possible_msvc_dll in "$POSSIBLE_MSVC_DLL"; do
>>>>>>>            $ECHO "POSSIBLE_MSVC_DLL $possible_msvc_dll"
>>>>>>>            TOOLCHAIN_CHECK_POSSIBLE_MSVC_DLL([$DLL_NAME],
>>>>>>> [$possible_msvc_dll],
>>>>>>>                [well-known location in VCINSTALLDIR])
>>>>>>>
>>>>>>>
>>>>>>> the 32bit configure correctly sets the msvcrt dll:
>>>>>>>
>>>>>>> POSSIBLE_MSVC_DLL /cygdrive/c/Program Files (x86)/Microsoft Visual
>>>>>>> Studio 12.0/VC/redist/x86/Microsoft.VC120.CRT/msvcr120.dll
>>>>>>> configure: Found msvcr120.dll at /cygdrive/c/Program Files
>>>>>>> (x86)/Microsoft Visual Studio
>>>>>>> 12.0/VC/redist/x86/Microsoft.VC120.CRT/msvcr120.dll using well-known
>>>>>>> location in VCINSTALLDIR
>>>>>>> checking found msvcr120.dll architecture... ok
>>>>>>>
>>>>>>> and I can start the build, but I get follow up errors:
>>>>>>>
>>>>>>> ...
>>>>>>> Creating hotspot/variant-server/tools/adlc/adlc.exe from 13 file(s)
>>>>>>> Compiling 2 files for BUILD_JVMTI_TOOLS
>>>>>>> make[3]: *** No rule to make target '/cygdrive/c/Program', needed by
>>>>>>>
>>>>>>>
>>>>>>> '/cygdrive/c/mine/projects/openjdk/jdk-jdk/output-fastdebug-32/support/modules_libs/java.base/Program'.
>>>>>>> Stop.
>>>>>>> make[3]: *** Waiting for unfinished jobs....
>>>>>>> make[2]: *** [make/Main.gmk:165: java.base-copy] Error 2
>>>>>>> make[2]: *** Waiting for unfinished jobs....
>>>>>>>
>>>>>>> I stopped looking at that point, but to me it looks like the build
>>>>>>> cannot survive msvcrt.dll locations with spaces in them.
>>>>>>>
>>>>>>> Kind Regards, Thomas
>>>>>>
>>>>>>
>>



More information about the build-dev mailing list