Cannot configure on Windows in Chinese Environment

Robbin Ehn rehn at rivosinc.com
Thu Nov 2 15:06:33 UTC 2023


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 at openjdk.org is your friend, added.

/Robbin

On Thu, Nov 2, 2023 at 3:07 PM 吴 国璋 <zcxsythenew at 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 .
>
>
>
> 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+zcxsythenew at users.noreply.github.com


More information about the jdk-dev mailing list