Failure during build of Python 3.8 via cygport
Brian Inglis
Brian.Inglis@SystematicSw.ab.ca
Sun Dec 13 21:59:58 GMT 2020
On 2020-12-13 07:34, Marco Atzeri via Cygwin-apps wrote:
> On 13.12.2020 09:52, Mark Geisert wrote:
>> Mark Geisert wrote:
>>> This seems to be a problem setting up a platform-specific build directory.
>>> The sysconfig.py script wants to use "lib." + platform + pythonversion but
>>> the platform string somehow gets corrupted into non-utf8 bytes. For
>>> instance, building Python 3.8 comes up with:
>>> lib.cygwin-\365\377\377o-\377o-3.8
>>> as the directory name. Broken, but could work. The build failure happens
>>> because the script tries to write this directory name into a file but it's
>>> not a valid utf8 string. The directory name should have been:
>>> lib.cygwin-3.2.0-x86_64-3.8
>>
>> And the corruption is due to something about a recent change to the operation
>> of Cygwin's uname() function. The change was introduced in Cygwin API version
>> 335; I'm running 340 on my test machine. This being a fairly recent change
>> might possibly explain why nobody else has run into this issue yet.
That was nearly two years ago.
>> Basically, os.uname within Python is calling Cygwin's uname() passing the
>> address of a buffer declared to be 'struct utsname'. The structure layout
>> changed in API 335. What I've hit is a mismatch between what Python expects
>> and Cygwin delivers.
>>
>> I'll move this discussion over to the developers list tomorrow.
uname(2):
NOTES
...
The length of the fields in the struct varies. Some operating
systems or libraries use a hardcoded 9 or 33 or 65 or 257. Other
systems use *SYS_NMLN* or *_SYS_NMLN* or *UTSLEN* or *_UTSNAME_LENGTH*.
Clearly, it is a bad idea to use any of these constants; just use
*sizeof*(...). Often 257 is chosen in order to have room for an
internet hostname.
...
C library/kernel differences
Over time, increases in the size of the /utsname/ structure have led to
three successive versions of *uname*():
/sys_olduname/() (slot /__NR_oldolduname/),
/sys_uname/() (slot /__NR_olduname/), and
/sys_newuname/() (slot /__NR_uname/).
The first one used length 9 for all fields;
the second used 65;
the third also uses 65 but adds the domainname field.
The glibc *uname*() wrapper function hides these details from
applications, invoking the most recent version of the system call
provided by the kernel.
> thanks for the analysis
>
> let me know if you think we should correct the python build in any way
--
Take care. Thanks, Brian Inglis, Calgary, Alberta, Canada
This email may be disturbing to some readers as it contains
too much technical detail. Reader discretion is advised.
[Data in binary units and prefixes, physical quantities in SI.]
More information about the Cygwin-apps
mailing list