Notwithstanding what was done in 2013 to try and be more locale tolerant with cl.exe:

https://mail.openjdk.org/pipermail/build-dev/2013-October/010444.html

I think the basic position is that supported building of OpenJDK requires a US-English locale and toolchain. For some reason this never made it into the build documentation though.

I suspect that even if you fix the version check in configure, you will then run into further locale issues.

Cheers,
David

On 3/11/2023 7:50 am, 吴 国璋 wrote:
Thanks, I will take a look.

Because I am new here, according to the developer's guide, I need to find a sponsor, who helps me create an issue in jira, before I can submit a pull request. Is there anyone who wants to help me?
------------------------------------------------------------------------
*发件人:* Robbin Ehn <r...@rivosinc.com>
*发送时间:* 2023年11月2日 23:06
*收件人:* 吴 国璋 <zcxsythe...@outlook.com>; build-dev@openjdk.org <build-dev@openjdk.org>
*抄送:* jdk-...@openjdk.org <jdk-...@openjdk.org>
*主题:* Re: Cannot configure on Windows in Chinese Environment
Hi,

You should not need to add any simple C files.
You should be able to use: AC_LANG_CONTEST, AC_LANG_PROGRAM and
friends to check those defines.

Also build-dev@openjdk.org is your friend, added.

/Robbin

On Thu, Nov 2, 2023 at 3:07 PM 吴 国璋 <zcxsythe...@outlook.com> wrote:

Hi team,



I discovered a problem while running `bash configure` on Windows platform in 
Chinese environment. The command fails, complaining CPU mismatch.



> configure: error: Target CPU mismatch. We are building for x86_64 but CL is for "版"; 
expected "x64".



There is also a warning complaining version mismatch:



> configure: WARNING: You are using microsoft 用于 x64 的 Microsoft (R) C/C++ 
优化编译器 19.37.32825 版 which is older than 19.28.0.0. This is not a supported 
configuration.



The line "用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.37.32825 版" is output by `cl.exe`. In 
English environment, it should be "Microsoft (R) C/C++ Optimizing Compiler Version 19.37.32825 
for x64".



Therefore, several questions arise, and I will try to answer them below.



1. Does JDK welcome localized Visual Studio?



I read the file `make/autoconf/toolchains.m4` and found the following comment:



>   elif test  "x$TOOLCHAIN_TYPE" = xmicrosoft; then

>     # There is no specific version flag, but all output starts with a version 
string.

>     # First line typically looks something like:

>     # Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 
for 80x86

>     # but the compiler name may vary depending on locale.

>     COMPILER_VERSION_OUTPUT=`$COMPILER 2>&1 1>/dev/null | $HEAD -n 1 | $TR -d 
'\r'`



Therefore, it can be inferred that JDK knows that there are different localizations of 
Visual Studio and is ready for them. JDK thinks that maybe there will be different names 
of "Optimizing Compiler" or others. However, in some languages, the whole 
structure  of the sentence is completely different, not just the names.



2. How can the problem be solved?



One solution is to change the way to parse the output of `cl.exe`. For example, JDK treat the last word separated by a blank as the target CPU, which is "x64" in English environment but "版" in Chinese environment. (`make/autoconf/toolchain.m4`, Lines 983 to 997.) We may use `grep` command to search for "x64" directly, and
then the issue can be solved.



However, this solution is not good enough, because it is also based on parsing the output, which is intended 
to be read by human, not by scripts. (What if "x64" is changed into "64-bit" or "64 
位" in a future version?)



3. What is the best solution?



According to MSVC reference, a solid way to get the MSVC version and the target 
CPU is via predefined macros.



To get the MSVC version, we can use `_MSC_VER`. When Visual Studio 2019 is 
used, the macro evaluates between 1920 and 1929. When Visual Studio 2022 is 
used, the macro evaluates above 1930.



To get the target CPU, we can use `_M_X64`, `_M_IX86`, `_M_ARM` and `_M_ARM64`. 
For example, if the target CPU is x64, `_M_X64` will be evaluated to 100, and 
the other three macros are undefined.



The reference page is at 
https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-170 
<https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-170>
 .



To use these macros, we may need to add 4 .c files. For example, if we need to 
get the MSVC version, let's create a file `get_msvc_version.c`. This file is 
absolutely simple and it just contains eight characters:



_MSC_VER



Then we can use cl.exe to prepocess this .c file:



> $ cl /EP get_msvc_version.c

> 用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.37.32825 版

> 版权所有(C) Microsoft Corporation。保留所有权利。

>

> get_msvc_version.c

>

> 1937



The last line `1937` contains the MSVC version, a pure number which will not be 
impacted by localizations. We may use `tail` command to get it.



We can use similar methods to get the target CPU.



4. How many changes need to be made?



- Four new simple .c files (which do not contain any "real" C code). Maybe a 
new folder to place them.

- `make/autoconf/toolchain.m4`, Lines 425 to 441 and 983 to 997.

- No change needed in any API or implementation of Java.



Guozhang Wu (吴国璋)

GitHub: zcxsythenew

GitHub anonymous email: 30565051+zcxsythe...@users.noreply.github.com

Reply via email to