GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — C extension naming doesn't take bitness into account · Issue #67169 · python/cpython

C extension naming doesn't take bitness into account #67169

New issue
Copy link
New issue
Copy link
Closed
Closed
C extension naming doesn't take bitness into account#67169
Copy link
Labels
deferred-blockertype-featureA feature request or enhancementA feature request or enhancement

Description

@pitrou
pitrou
opened on Dec 2, 2014
Issue body actions
BPO 22980
Nosy @malemburg, @warsaw, @doko42, @ncoghlan, @pitrou, @larryhastings, @tjguk, @ned-deily, @ericsnowcurrently, @berkerpeksag, @zware, @1st1, @zooba, @dstufft
Files
  • 22980_windows.patch
  • 22980_2.patch: Patch with version in tag
  • abi_bitness.patch
  • ma.diff: alternate patch
  • ma2.diff
  • larry.whatsnew35.ext.module.suffix.diff.1.txt
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = <Date 2015-09-12.16:13:19.053>
    created_at = <Date 2014-12-02.14:35:25.510>
    labels = ['deferred-blocker', 'type-feature']
    title = "C extension naming doesn't take bitness into account"
    updated_at = <Date 2017-01-14.07:25:16.112>
    user = 'https://github.com/pitrou'

    bugs.python.org fields:

    activity = <Date 2017-01-14.07:25:16.112>
    actor = 'python-dev'
    assignee = 'none'
    closed = True
    closed_date = <Date 2015-09-12.16:13:19.053>
    closer = 'larry'
    components = []
    creation = <Date 2014-12-02.14:35:25.510>
    creator = 'pitrou'
    dependencies = []
    files = ['37379', '37384', '38155', '38964', '39027', '40420']
    hgrepos = []
    issue_num = 22980
    keywords = ['patch']
    message_count = 96.0
    messages = ['232000', '232001', '232002', '232003', '232008', '232014', '232016', '232026', '232030', '232031', '232033', '232034', '232036', '232037', '232038', '232039', '232040', '232041', '232042', '232043', '232044', '232045', '232047', '232052', '232063', '232065', '232251', '232256', '232266', '232268', '232270', '232272', '232277', '232297', '232710', '232711', '232729', '232740', '232759', '232760', '232764', '232765', '232807', '233822', '236109', '236111', '237558', '237559', '240516', '240548', '240746', '240748', '240750', '240761', '240762', '240769', '240775', '241065', '241127', '241139', '241141', '241159', '241167', '241183', '241211', '241223', '241228', '241230', '241231', '241236', '241242', '241248', '241249', '241250', '241251', '241252', '241253', '241254', '241283', '241285', '241287', '241291', '241512', '241513', '246247', '249725', '250045', '250299', '250302', '250308', '250341', '250424', '250425', '250431', '250524', '285464']
    nosy_count = 16.0
    nosy_names = ['lemburg', 'barry', 'doko', 'ncoghlan', 'pitrou', 'larry', 'tim.golden', 'ned.deily', 'Arfrever', 'python-dev', 'eric.snow', 'berker.peksag', 'zach.ware', 'yselivanov', 'steve.dower', 'dstufft']
    pr_nums = []
    priority = 'deferred blocker'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = 'enhancement'
    url = 'https://bugs.python.org/issue22980'
    versions = ['Python 3.5']

    Activity

    Next
    1. pitrou commented on Dec 2, 2014

      @pitrou
      pitrou
      on Dec 2, 2014
      MemberAuthor
      More actions

      Currently, C extensions are named something like "_helperlib.cpython-34dm.so". This doesn't take into account the bitness of the interpreter (32- vs. 64-bit), which makes it awkward to use the same working copy with two different interpreters (you have to rebuild everything each time you switch bitnesses).

      Worse, under Windows it seems ABI tags aren't even used, giving generic names such as "_helperlib.pyd". Why is that?

    2. pitrou
      added
      type-featureA feature request or enhancementA feature request or enhancement
      on Dec 2, 2014
    3. vstinner commented on Dec 2, 2014

      @vstinner
      vstinner
      on Dec 2, 2014
      Member
      More actions

      See also the PEP-3149.

    4. pitrou commented on Dec 2, 2014

      @pitrou
      pitrou
      on Dec 2, 2014
      MemberAuthor
      More actions

      PEP-3149 says """It is not currently clear that the facilities in this PEP are even useful for Windows""". Well, it seems I have found a use for it :-)

    5. pitrou commented on Dec 2, 2014

      @pitrou
      pitrou
      on Dec 2, 2014
      MemberAuthor
      More actions

      Ideally, we would use distutils.util.get_platform(). However, there are two cases where it relies on other modules:

      • the re module under CygWin
      • the sysconfig and _osx_support under OS X

      Of course, ideally we should be able to hardcode this into the compiled CPython executable...

    6. pitrou commented on Dec 2, 2014

      @pitrou
      pitrou
      on Dec 2, 2014
      MemberAuthor
      More actions

      As a side-note, it is interesting to note that Python currently wrongly identifies 32-bit builds under 64-bit Linux:

      Python 3.5.0a0 (default:64a54f0c87d7, Nov  2 2014, 17:18:13) 
      [GCC 4.9.1] on linux
      Type "help", "copyright", "credits" or "license" for more information.
      >>> import sys, os, sysconfig
      >>> sys.maxsize
      2147483647
      >>> os.uname()
      posix.uname_result(sysname='Linux', nodename='fsol', release='3.16.0-25-generic', version='#33-Ubuntu SMP Tue Nov 4 12:06:54 UTC 2014', machine='x86_64')
      >>> sysconfig.get_platform()
      'linux-x86_64'

      AFAIU, sysconfig.get_platform() (or its sibling distutils.util.get_platform()) is used for the naming of binary distributions...

    7. pitrou commented on Dec 2, 2014

      @pitrou
      pitrou
      on Dec 2, 2014
      MemberAuthor
      More actions

      The MULTIARCH variable can help at least under Linux:

      >>> import sysconfig
      >>> sysconfig.get_platform()
      'linux-x86_64'
      >>> sysconfig.get_config_var('MULTIARCH')
      'i386-linux-gnu'
    8. vstinner commented on Dec 2, 2014

      @vstinner
      vstinner
      on Dec 2, 2014
      Member
      More actions

      There is also platform.architecture(). I don't like its implementation, it relies on the external file program :-(

    9. zooba commented on Dec 2, 2014

      @zooba
      zooba
      on Dec 2, 2014
      Member
      More actions

      I'm very much in favor of adding this for .pyds on Windows.

      I assume the hard part will be getting the details for Linux (doesn't bitness have to be compiled in there? For Windows it can be determined at compile-time...), but preferring an extension with the ABI tag and falling back on one without seems easy enough.

      (Would/could this also work for .py files? So a 2.7/3.x or Jython/CPython/IronPython package could include tags in pure-Python code files?)

    10. malemburg commented on Dec 2, 2014

      @malemburg
      malemburg
      on Dec 2, 2014
      Member
      More actions

      Note that there's a difference between the platform's architecture (which is what get_platform() returns) and the pointer size of the currently running Python executable.

      On 64-bit Linux, it's rather rare to have an application built as 32-bit executable. On 64-bit Windows, it's rather common to have 32-bit applications running.

      The best way to determine 32-bit vs. 64-bit is by using the struct module:

          # Determine bitsize used by Python (not necessarily the same as
          # the one used by the platform)
          import struct
          bits = struct.calcsize('P') * 8

      This should be portable across all platforms and will always refer to the pointer size of the currently running Python executable.

    11. pitrou commented on Dec 2, 2014

      @pitrou
      pitrou
      on Dec 2, 2014
      MemberAuthor
      More actions

      Note that there's a difference between the platform's architecture

      Yes, that's pointed out above.

    12. pitrou commented on Dec 2, 2014

      @pitrou
      pitrou
      on Dec 2, 2014
      MemberAuthor
      More actions

      Nothing new should be necessary for pyc files under Windows:

      Python 3.4.2 |Continuum Analytics, Inc.| (default, Oct 22 2014, 11:51:45) [MSC v.1600 64 bit (AMD64)] on win32
      Type "help", "copyright", "credits" or "license" for more information.
      >>> import sys
      >>> sys.implementation.cache_tag
      'cpython-34'

      The problem is with C extensions:

      >>> import _imp
      >>> _imp.extension_suffixes()
      ['.pyd']

      Compare with Linux:

      >>> import _imp
      >>> _imp.extension_suffixes()
      ['.cpython-35dm.so', '.abi3.so', '.so']
    13. pitrou commented on Dec 2, 2014

      @pitrou
      pitrou
      on Dec 2, 2014
      MemberAuthor
      More actions

      I assume the hard part will be getting the details for Linux (doesn't bitness
      have to be compiled in there? For Windows it can be determined at compile-
      time...), but preferring an extension with the ABI tag and falling back on
      one without seems easy enough.

      Sticking to bitness should be easy (although I wonder if it would be desirable for platforms with fat binaries - Ned?). If we can go the extra mile and include platform identification all the better, of course.

    14. zooba commented on Dec 2, 2014

      @zooba
      zooba
      on Dec 2, 2014
      Member
      More actions

      I was more interested in source file resolution than bytecode caching. If Python 3.5 would prefer "spam.cpython-35.py" or "spam.cpython-3.py" over "spam.py" and Python 2 preferred "spam.py", then I can more easily separate the code that won't parse in the alternative.

      Happy to be told it's unrelated and I should raise it separately, but from my POV resolving .pyd filenames looks very similar to resolving .py files.

    15. malemburg commented on Dec 2, 2014

      @malemburg
      malemburg
      on Dec 2, 2014
      Member
      More actions

      On 02.12.2014 19:02, Antoine Pitrou wrote:

      Sticking to bitness should be easy (although I wonder if it would be desirable for platforms with fat binaries - Ned?). If we can go the extra mile and include platform identification all the better, of course.

      I hear the "can of worms" alarm ringing :-)

      Seriously, I think that putting platform infos into the file name
      is bound to cause more trouble than it tries to solve. Fat builds
      leave the decision to the linker, which is a good method and avoids
      the file name clashes.

      I think we should only focus on platforms where fat builds are
      uncommon, while at the same time you do have to support multiple
      architectures, like e.g. Windows:

      http://en.wikipedia.org/wiki/Fat_binary

      Note that on Linux, 32-bit and 64-bit versions are typically placed
      into different directory trees:

      http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

      so I'm not sure whether it's a real problem on Linux.

    16. 72 remaining items

    17. ned-deily commented on Jul 4, 2015

      @ned-deily
      ned-deily
      on Jul 4, 2015
      Member
      More actions

      I think we should add something to the 3.5 "What's New" document about these changes and which platforms are affected. Otherwise is there anything left to do before closing?

    18. ned-deily
      added
      deferred-blocker
      on Jul 4, 2015
    19. larryhastings commented on Sep 4, 2015

      @larryhastings
      larryhastings
      on Sep 4, 2015
      Contributor
      More actions

      I sure hope not.

    20. larryhastings commented on Sep 7, 2015

      @larryhastings
      larryhastings
      on Sep 7, 2015
      Contributor
      More actions

      I'm leaving this open just because we're apparently waiting on some "What's New" docs.

    21. larryhastings commented on Sep 9, 2015

      @larryhastings
      larryhastings
      on Sep 9, 2015
      Contributor
      More actions

      Here's an attempt at a What's New section for this change. I expect it's wrong! Maybe someone can fix it. Maybe it's actually better than not having one at all.

      Can we maybe get a round or two of edits on this and get something in for 3.5 final?

    22. berkerpeksag commented on Sep 9, 2015

      @berkerpeksag
      berkerpeksag
      on Sep 9, 2015
      Member
      More actions

      Adding Yury since he and Elvis are working on Doc/whatsnew/3.5.rst and they might want to take a look at the latest patch.

    23. zooba commented on Sep 9, 2015

      @zooba
      zooba
      on Sep 9, 2015
      Member
      More actions

      Only thing I'd add is that the extra tag is optional (on Windows at least), and Python will happily import extensions without it. But extensions with a mismatched tag won't be loaded.

    24. doko42 commented on Sep 9, 2015

      @doko42
      doko42
      on Sep 9, 2015
      Member
      More actions

      thanks for the draft!

      I'm not sure how to describe this properly. The extension names are derived from https://wiki.debian.org/Multiarch/Tuples

      and this again is derived from the GNU triplets/quadruplets.

      there is no "cpu" and "os" part, depending on the architecture some ABI parts are either encoded in the "cpu" part or the "os" part.

      So what about just enumerating the most common cases (i386-linux-gnu, x86_64-linux-gnu, arm-linux-gnueabi (still used for the old Raspberry Pi), arm-linux-gnueabihf), and then point to the "spec"? The above examples have some irregular cases, most other cases just follow the triplets.

      I wouldn't mention x86_64-linux-gnux32 explicitly. Until now there are only unreleased or experimental distros.

      Not sure if it is worth mentioning that this would allow distributing "fat" wheels.

    25. python-dev commented on Sep 10, 2015

      @python-dev
      python-devmannequin
      on Sep 10, 2015
      Mannequin
      More actions

      New changeset 1744d65705d0 by Yury Selivanov in branch '3.5':
      whatsnew/3.5: Describe changes in issue bpo-22980
      https://hg.python.org/cpython/rev/1744d65705d0

      New changeset cfbcb3a6a848 by Yury Selivanov in branch 'default':
      Merge 3.5 (issue bpo-22980, whatsnew/3.5)
      https://hg.python.org/cpython/rev/cfbcb3a6a848

    26. 1st1 commented on Sep 10, 2015

      @1st1
      1st1
      on Sep 10, 2015
      Member
      More actions

      Larry, Matthias, Steve, Berker - I've mentioned this issue in the whatsnew (applied Larry's patch with some modifications to address comments from Steve and Matthias). Please review.

    27. zooba commented on Sep 11, 2015

      @zooba
      zooba
      on Sep 11, 2015
      Member
      More actions

      There's no dot before the debug marker on Windows. Otherwise, looks good to me. Thanks for writing this up.

    28. larryhastings commented on Sep 12, 2015

      @larryhastings
      larryhastings
      on Sep 12, 2015
      Contributor
      More actions

      It's fixed! So it's finally closed.

    29. larryhastings
      closed this as completedon Sep 12, 2015
    30. python-dev commented on Jan 14, 2017

      @python-dev
      python-devmannequin
      on Jan 14, 2017
      Mannequin
      More actions

      New changeset 80fc40a9ae47 by Martin Panter in branch '3.5':
      Issue bpo-22980: Skip a sysconfig test if _ctypes is not available.
      https://hg.python.org/cpython/rev/80fc40a9ae47

    31. ezio-melotti
      transferred this issue fromon Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      deferred-blockertype-featureA feature request or enhancementA feature request or enhancement

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        You are visitor 01402503 — GeezerVison does not store the pages you look up.
        Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.