Cannot configure on Windows in Chinese Environment

吴 国璋 zcxsythenew at outlook.com
Fri Nov 3 05:18:10 UTC 2023


If OpenJDK requires en-us environment, then nothing needs to be changed. Please ignore this thread.

________________________________
发件人: David Holmes <david.holmes at oracle.com>
发送时间: 2023年11月3日 13:13
收件人: 吴 国璋 <zcxsythenew at outlook.com>; build-dev at openjdk.org <build-dev at openjdk.org>
主题: Re: Cannot configure on Windows in Chinese Environment

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

https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fmail.openjdk.org%2Fpipermail%2Fbuild-dev%2F2013-October%2F010444.html&data=05%7C01%7C%7Cb4e7e71693064ce44a6808dbdc2bb17e%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C638345852459562317%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=HA7Es%2BMQGUbtrkVNFlawOr26%2FMy48Qi1Fc%2FnUdFTkws%3D&reserved=0<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 <rehn at rivosinc.com>
> *发送时间:* 2023年11月2日 23:06
> *收件人:* 吴 国璋 <zcxsythenew at outlook.com>; build-dev at openjdk.org
> <build-dev at openjdk.org>
> *抄送:* jdk-dev at openjdk.org <jdk-dev at 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 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://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flearn.microsoft.com%2Fen-us%2Fcpp%2Fpreprocessor%2Fpredefined-macros%3Fview%3Dmsvc-170&data=05%7C01%7C%7Cb4e7e71693064ce44a6808dbdc2bb17e%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C638345852459562317%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=ZCq81ekKfgLcB3ctwQXfqu03bWgalRB%2BuGEkcJZAnMg%3D&reserved=0<https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-170> <https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flearn.microsoft.com%2Fen-us%2Fcpp%2Fpreprocessor%2Fpredefined-macros%3Fview%3Dmsvc-170&data=05%7C01%7C%7Cb4e7e71693064ce44a6808dbdc2bb17e%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C638345852459562317%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=ZCq81ekKfgLcB3ctwQXfqu03bWgalRB%2BuGEkcJZAnMg%3D&reserved=0<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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/build-dev/attachments/20231103/94a9c13c/attachment-0001.htm>


More information about the build-dev mailing list