{"action":"created","issue":{"url":"https://api.github.com/repos/zzzeek/sqlalchemy/issues/195","labels_url":"https://api.github.com/repos/zzzeek/sqlalchemy/issues/195/labels{/name}","comments_url":"https://api.github.com/repos/zzzeek/sqlalchemy/issues/195/comments","events_url":"https://api.github.com/repos/zzzeek/sqlalchemy/issues/195/events","html_url":"https://github.com/zzzeek/sqlalchemy/pull/195","id":101264814,"number":195,"title":"Build universal wheels","user":{"login":"graingert","id":413772,"avatar_url":"https://avatars.githubusercontent.com/u/413772?v=3","gravatar_id":"","url":"https://api.github.com/users/graingert","html_url":"https://github.com/graingert","followers_url":"https://api.github.com/users/graingert/followers","following_url":"https://api.github.com/users/graingert/following{/other_user}","gists_url":"https://api.github.com/users/graingert/gists{/gist_id}","starred_url":"https://api.github.com/users/graingert/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/graingert/subscriptions","organizations_url":"https://api.github.com/users/graingert/orgs","repos_url":"https://api.github.com/users/graingert/repos","events_url":"https://api.github.com/users/graingert/events{/privacy}","received_events_url":"https://api.github.com/users/graingert/received_events","type":"User","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"milestone":null,"comments":11,"created_at":"2015-08-16T13:29:57Z","updated_at":"2015-08-17T16:40:02Z","closed_at":"2015-08-17T16:14:27Z","pull_request":{"url":"https://api.github.com/repos/zzzeek/sqlalchemy/pulls/195","html_url":"https://github.com/zzzeek/sqlalchemy/pull/195","diff_url":"https://github.com/zzzeek/sqlalchemy/pull/195.diff","patch_url":"https://github.com/zzzeek/sqlalchemy/pull/195.patch"},"body":""},"comment":{"url":"https://api.github.com/repos/zzzeek/sqlalchemy/issues/comments/131884923","html_url":"https://github.com/zzzeek/sqlalchemy/pull/195#issuecomment-131884923","issue_url":"https://api.github.com/repos/zzzeek/sqlalchemy/issues/195","id":131884923,"user":{"login":"dstufft","id":145979,"avatar_url":"https://avatars.githubusercontent.com/u/145979?v=3","gravatar_id":"","url":"https://api.github.com/users/dstufft","html_url":"https://github.com/dstufft","followers_url":"https://api.github.com/users/dstufft/followers","following_url":"https://api.github.com/users/dstufft/following{/other_user}","gists_url":"https://api.github.com/users/dstufft/gists{/gist_id}","starred_url":"https://api.github.com/users/dstufft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dstufft/subscriptions","organizations_url":"https://api.github.com/users/dstufft/orgs","repos_url":"https://api.github.com/users/dstufft/repos","events_url":"https://api.github.com/users/dstufft/events{/privacy}","received_events_url":"https://api.github.com/users/dstufft/received_events","type":"User","site_admin":false},"created_at":"2015-08-17T16:40:02Z","updated_at":"2015-08-17T16:40:02Z","body":"@zzzeek small divergence, I'm assuming the \"Aren't mandatory because ... Windows\" part is because of the problems getting a C compiler on Windows? If so, you *could* make them Mandatory on Windows too and just publish compiled wheels built for Windows which will install without a compiler toolchain installed and still get the speed ups. I also wonder if CFFI would have similar speeds to your hand written C extensions, if so you could also make them mandatory on PyPy, though I admit I've not looked at how SQLAlchemy uses C extensions at all so CFFI might not be a suitable tool for SQLAlchemy. If you're interested in either of these and need help, let me know.\r\n\r\nBack to the topic at hand, there's not a good way to publish universal wheels on PyPI without having them essentially render the C extensions useless unless you move the C extensions into their own package and have SQLAlchemy optionally depend on them based on Windows/PyPy. I don't think it's likely to be worth the effort though, on my machine SQLAlchemy installs in ~2 seconds when installed from a source distribution and ~1 second when installed from a wheel and splitting it out into a second package would still need to compile that second package and you'd end up with extra HTTP requests too. You could make the \"speedup\" package an optional dependency, but there are only opt-in optional dependencies not opt-out (currently) which I think would be a regression for SQLAlchemy. There is some benefit to splitting them out in that it makes your ``setup.py`` simpler since you no longer need to deal with the conditionals yourself, but it makes releasing anything harder since the C extensions are no longer part of SQLAlchemy but a separate tool.\r\n\r\nIn addition to all of the above, if someone is using pip 7+ and they have wheel installed into their environment then the first time they install SQLAlchemy it will download the sdist and build a wheel and cache it locally. All subsequent installs that are compatible with that wheel will just reuse that wheel instead of using the sdist. So if @graingert is using a modern pip with wheel installed they'll only have the  ~2 second install once per Python version and after that they'll have a ~1 second install.\r\n\r\ntl;dr I would just leave it how this is, possibly breaking it out into a separate project if you find the organization of that and removal of ``setup.py`` hacks convenient but leave it exactly how it is if you find the single source convenient. Possibly look into Windows wheels and/or CFFI to make the extensions mandatory instead of optional.\r\n\r\nHopefully this was helpful!"}}