Compare commits

..
452 Commits
Author SHA1 Message Date
Joe Rickerby beda529298 Bump version 2019-11-10 15:16:37 +00:00
Joe Rickerby 292bf42cb0 Merge pull request #169 from joerick/docs
Pull docs into a dedicated documentation site
2019-11-10 15:14:09 +00:00
Joe Rickerby a8d1e69783 Merge pull request #200 from joerick/test-bash-errexit-again
Add check that failing tests fail on manylinux1 specifically
2019-11-10 15:07:45 +00:00
Joe Rickerby ab53f06bc6 Merge pull request #201 from mayeut/remove-macos-travis-python2
Remove macOS python2 on Travis CI
2019-11-10 15:04:01 +00:00
Joe Rickerby 053a154d1d Merge pull request #197 from mayeut/cibw-dir
Use specific cibw directory on Windows to prevent collisions with installed software
2019-11-10 15:03:09 +00:00
Joe Rickerby 7d08bac099 Add note about command line option 2019-11-10 14:57:21 +00:00
Joe Rickerby 8e274700f4 Reformat examples on the options page and add a comment for each one 2019-11-10 14:54:56 +00:00
Joe Rickerby 22ae365ae9 Clean up plugin 2019-11-10 13:22:44 +00:00
Joe Rickerby ccd22e5a5a Allow line breaks in table headers 2019-11-10 13:22:35 +00:00
Joe Rickerby 2692162617 Improve BUILD/SKIP options formatting 2019-11-10 13:21:05 +00:00
Joe Rickerby d112b343e1 Fix link 2019-11-10 13:20:33 +00:00
Joe Rickerby 7ac8798d26 fix element id 2019-11-10 12:08:14 +00:00
Joe Rickerby a41ce8e4a0 Add options summary to readme 2019-11-09 19:41:42 +00:00
Joe Rickerby 07fd1a3203 Formatting and polish 2019-11-09 19:38:59 +00:00
mayeut 81ce8116b5 Remove macos python2 on travis-ci
Testing with python2 is already done on circle-ci
2019-11-09 20:18:39 +01:00
mayeut c82330b0bc Use specific cibw directory on Windows to prevent collisions with installed software 2019-11-09 19:44:14 +01:00
Joe Rickerby 50a518eac4 Merge remote-tracking branch 'origin/master' into test-bash-errexit-again 2019-11-09 18:41:56 +00:00
Joe Rickerby 42d1610d52 Merge pull request #175 from GjjvdBurg/returncode
Make sure build fails when test command fails
2019-11-09 18:41:26 +00:00
Joe Rickerby ac51d22884 Merge remote-tracking branch 'origin/master' into docs 2019-11-09 18:23:41 +00:00
Joe Rickerby c42cca1c86 Add test that failing tests fail on manylinux1 specifically 2019-11-09 18:07:46 +00:00
Joe Rickerby b51434b5a8 Merge pull request #199 from mayeut/cibuildwheel-pythons
Tests cibuildwheel across different python versions
2019-11-09 17:49:00 +00:00
mayeut 7dee79a96b Add python_requires metadata 2019-11-09 12:38:38 +01:00
mayeut ce93a03098 Fix tests on Windows Python 3.8 2019-11-09 12:16:25 +01:00
mayeut 319aee73f2 Force python 3.8 on Azure 2019-11-09 11:19:02 +01:00
Gertjan van den Burg 5210ad3610 clarify comment at if statement 2019-11-08 10:53:18 +00:00
Gertjan van den Burg def8f9a2e3 Remove errexit flag for test command subshell 2019-11-08 10:53:06 +00:00
Gertjan van den Burg f716f87a04 Merge branch 'master' into returncode 2019-11-08 10:51:49 +00:00
Joe Rickerby 0375e92110 Merge pull request #188 from metabolize/fix-appveyor-setup-doc-outline
Readme: Fix the outline for Appveyor setup
2019-11-05 19:28:05 +00:00
Gertjan van den Burg 560c1adeb7 Merge branch 'master' into returncode 2019-11-05 17:09:17 +00:00
Paul Melnikow 3c9875db19 Readme: Remove obsolete bullet for Appveyor setup 2019-11-05 09:41:23 -05:00
Joe Rickerby 89e2ac7ebf Merge pull request #180 from mayeut/nuget
Adding Python 3.8, Always use nuget to install python on Windows
2019-11-05 09:06:20 +00:00
mayeut 05ab66cf97 Fix documentation for macOS python 3.8 2019-11-04 22:49:53 +01:00
mayeut 104dcf1d37 Add python 3.8 support 2019-11-04 22:22:40 +01:00
mayeut f2ef7a6169 Always use nuget to install python on Windows 2019-11-04 22:08:30 +01:00
mayeut 58048b4bb1 Remove trailing-spaces from README.md
Also replace double-space by a backslash to show intent of a line-break.
2019-11-04 22:05:24 +01:00
Joe Rickerby 332674a382 Merge pull request #168 from mayeut/drop-python-3.4
Drop python 3.4
2019-11-04 19:15:05 +00:00
Joe Rickerby 88ef908bad Merge remote-tracking branch 'origin/master' into docs
Manually merged updates to README.md across to docs

# Conflicts:
#	README.md
2019-11-03 19:38:18 +00:00
Joe Rickerby eb8c926eba Remove unused CSS and visual tweaks 2019-11-03 19:13:56 +00:00
Joe Rickerby 73cba728a1 Have the page generate markdown for the README 2019-11-03 19:06:48 +00:00
Joe Rickerby 1446529f7c Sort out page titles 2019-11-03 19:06:33 +00:00
Joe Rickerby 51649fd806 Add page from wiki to 'tips and tricks' page 2019-11-03 18:40:14 +00:00
Joe Rickerby f55b663ea7 Add requirement for our markdown plugin 2019-11-03 18:35:17 +00:00
Joe Rickerby 2360c406bf Add JS code to generate a table of contents 2019-11-03 18:35:06 +00:00
Joe Rickerby 5db3763b2d Add plugin to import sections of readme into the documentation 2019-11-03 18:30:15 +00:00
mayeut bb0cad404b Drop python 3.4
Python 3.4 reached the end of its life on 16 March 2019. It's about time to drop support for Python 3.4.
2019-10-26 15:53:44 +02:00
Yannick Jadoul a6164f765c Merge pull request #183 from mayeut/macos-python3
Do not update brew python3
2019-10-26 15:47:08 +02:00
mayeut 892c7b4d9c Update .travis.yml 2019-10-26 14:45:24 +02:00
Joe Rickerby 3fcb902fd9 Merge pull request #171 from mayeut/python-3.7.5
Update CPython 2.7 from 2.7.16 to 2.7.17 & 3.7 from 3.7.4 to 3.7.5 on macOS
2019-10-25 10:06:09 +01:00
Yannick Jadoul 8c9345fa1f Updated line of README mistakenly claiming Windows is not supported on Travis CI 2019-10-24 14:00:28 +02:00
mayeut 5eab3620c9 Update CPython 2.7 from 2.7.16 to 2.7.17 & 3.7 from 3.7.4 to 3.7.5 on macOS 2019-10-23 22:59:17 +02:00
Grzegorz BokotaandJoe Rickerby 80974e5b39 Build Python wheels for windows on travis (#160)
* upgrade for windows on travis

* Install python on travis windows, update readme, update tests

* update readme, travis config and clean code

* install python inside cibuildwheel run

* use register to get python path

* fixes from review

* fix pip version

* use nuget for instal python

* clean code

* Update cibuildwheel/windows.py

Co-Authored-By: Joe Rickerby <joerick@mac.com>

* fixes from review

* Final bits of tidy up
2019-10-23 21:53:10 +01:00
Joe Rickerby 4f705b7cc9 Merge pull request #177 from joerick/failing-test-test
Add failing test check
2019-10-23 21:35:44 +01:00
Gertjan van den Burg e0eb375449 Returncode fix (#1)
Some trial and error to make sure it works reliably.

* remove test_retcode
* debug local bash settings
* set errexit explicitly in subshell
* set errexit also in the subshell in parenthesis
* debugging
* more debugging (exit code of sh)
* is the venv subshell returning exit 1?
* what if we remove the additional subshell?
* then we need to unquote the command
* if statement needs test command quoted
* simple if statement
* echo command needs to be removed of course
* remove debug statements
* check if setting errexit here is needed
* these settings can be removed
  At this point ("before") the shell already has errexit set.
* setting errexit in the sh invocation is needed
  This is not inherited, so it's good to specify it.
* just double checking that the subshell doesn't exit
* use solution from fvue.nl
* Solution doesn't seem to work, even popd is run
  So now I'm putting back the if statement, it seems
  to be the simplest and most effective solution.
* add a comment
* prove that errexit is necessary
* errexit is indeed needed for chaining
2019-10-21 11:42:43 +01:00
Joe Rickerby bbecbe43ec Add failing test check 2019-10-20 20:45:25 +01:00
Joe Rickerby 46865a5f40 Options page rework (incomplete) 2019-10-20 20:39:50 +01:00
Joe Rickerby b577c5f00f Misc copy edits 2019-10-20 19:43:13 +01:00
Joe Rickerby ee2a90880a Merge pull request #155 from YannickJadoul/manylinux2010-alternative
Adding support for building manylinux2010 wheels - alternative
2019-10-20 19:29:19 +01:00
Yannick Jadoul 31d89377da Updated README with new CIBW_MANYLINUX_*_IMAGE options 2019-10-19 14:07:50 +02:00
Gertjan van den Burg 0c33a58579 failing test breaks out of subshell 2019-10-18 11:45:48 +01:00
Gertjan van den Burg 3842cfd853 Attempt at getting the retcode of the test process 2019-10-18 11:31:48 +01:00
Yannick Jadoul 2e0dc40e3f Adding manylinux2010_i686 image and simplifying tests' utils.expected_wheels() 2019-10-16 01:15:09 +02:00
Yannick Jadoul c6f1382813 Making manylinux1 still the default for manylinux_i686 builds 2019-10-16 00:35:20 +02:00
Yannick Jadoul 1220fbbd4b Adding detection of old CIBW_MANYLINUX1_*_IMAGE options and manylinux1-* build identifiers in CIBW_BUILD and CIBW_SKIP 2019-10-16 00:35:20 +02:00
Yannick Jadoul 179148b0e5 Updated preset values for CIBW_MANYLINUX_*_IMAGE, fixed skip message in 08_manylinux2010_only test, and added clarifying comment on multiple wheels in Linux bash script 2019-10-16 00:35:20 +02:00
Yannick Jadoul 4536b23a1d Adding test accessing manylinux2010-only ABI 2019-10-16 00:34:13 +02:00
Yannick Jadoul 4571262803 Adapting Linux bash script for multiple output wheels from auditwheel 2019-10-16 00:34:13 +02:00
Yannick Jadoul 27517cd8a0 Updating test 06_docker_images to use new CIBW_MANYLINUX_*_IMAGE options 2019-10-16 00:33:45 +02:00
Yannick Jadoul 54dd72de66 Copying all created manylinux wheels to the output directory 2019-10-16 00:33:45 +02:00
Yannick Jadoul 7978247fa7 Fixing tests still failing as manylinux1 wheels are also produced by auditwheel 2019-10-16 00:33:45 +02:00
Yannick Jadoul 7cadc6374a Fixing tests failing because of new manylinux2010 default 2019-10-16 00:33:45 +02:00
Yannick Jadoul e194dad0da Alternative proposal to generalize manylinux builds and support manylinux2010 2019-10-16 00:33:45 +02:00
Joe Rickerby 5f416b194a Merge pull request #164 from astrofrog/virtualenv-notox
Run tests in clean virtual environment [version without tox]
2019-10-13 21:24:19 +01:00
Joe Rickerby 2a244616ad windows: only make venv when test is defined and isolate env vars 2019-10-12 10:47:00 +01:00
Joe Rickerby bfa3eebb7f Remove redundant if clause 2019-10-12 10:44:47 +01:00
Joe Rickerby b0c2fd8af2 macos: only make venv when test is defined and isolate env vars 2019-10-12 10:35:45 +01:00
Joe Rickerby cf90846161 linux: run tests in a subshell, only create env if test defined 2019-10-12 10:17:28 +01:00
Joe Rickerby 89bb2d352d Add docs links to the setup guide 2019-10-07 09:15:59 +01:00
Joe Rickerby c1572e4ff4 Ensure the pinned versions in docs are bumped 2019-10-06 23:09:34 +01:00
Joe Rickerby 1741d7ce1f Docs samples should pin versions 2019-10-06 23:05:55 +01:00
Joe Rickerby 05385b1cb0 Add readthedocs config 2019-10-06 22:57:41 +01:00
Joe Rickerby 3ba7aa3532 Copy improvements 2019-10-06 20:36:37 +01:00
Joe Rickerby bb2a5f8d17 Formatting improvements 2019-10-06 20:36:21 +01:00
Joe Rickerby 44d0dcba12 Update license copyright 2019-10-06 11:38:48 +01:00
Joe Rickerby 4c86af69a5 Readme tweaks 2019-10-06 11:38:36 +01:00
Joe Rickerby 93663d19df Move changelog back into the readme 2019-10-06 11:38:24 +01:00
Joe Rickerby c006fdab36 Migrate more README over to the docs 2019-10-02 09:49:31 +01:00
Joe Rickerby d280f0f16a Add options to docs 2019-09-29 21:53:18 +01:00
Joe Rickerby b49754dc7d mkdocs setup 2019-09-29 20:55:41 +01:00
Joe Rickerby 3302aa136b Update README 2019-09-29 20:46:31 +01:00
Joe Rickerby 14d9b4091e Update changelog 2019-09-29 20:46:23 +01:00
Joe Rickerby aeeac6725a Bump version 2019-09-29 20:40:44 +01:00
Joe Rickerby 41b4b092b1 Merge pull request #167 from mayeut/update-openssl
Update openssl patch from 1.0.2s to 1.0.2t on macOS
2019-09-29 20:34:56 +01:00
mayeut 28186bf142 Update openssl patch from 1.0.2s to 1.0.2t on macOS 2019-09-22 14:46:17 +02:00
Joe Rickerby 4e10d9d897 Merge pull request #163 from astrofrog/circleci-verbose
Clean up CircleCI YAML syntax
2019-09-21 16:26:13 +01:00
Yannick Jadoul c963013858 Fixing weird issue with the shebang of pip installed scripts and __PYVENV_LAUNCHER__ 2019-09-11 23:56:27 +02:00
Thomas Robitaille 9470ca623f Use python -m virtualenv on Windows and Linux 2019-09-10 09:40:20 +01:00
Thomas Robitaille 2e3bc016b4 Try and avoid relying on global virtualenv command 2019-09-10 09:40:20 +01:00
Thomas Robitaille d4732130a7 Use unique temporary directory for virtual environment on linux 2019-09-10 09:40:20 +01:00
Thomas Robitaille 853699c265 Fix calls to pip and virtualenv 2019-09-10 09:40:19 +01:00
Thomas Robitaille 40968897a8 Test package in a virtualenv on Linux and Windows 2019-09-10 09:40:19 +01:00
Thomas Robitaille fdc2ba8715 Try and work around the fact we can't source activate 2019-09-10 09:40:19 +01:00
Thomas Robitaille 3ff59eefc6 Fix syntax 2019-09-10 09:40:19 +01:00
Thomas Robitaille e3416abeb9 Use virtual environment for testing on MacOS X 2019-09-10 09:40:18 +01:00
Joe Rickerby 2ab2d079ab Merge pull request #161 from astrofrog/test-extras-require
Add support for specifying test-time dependencies via extras_require
2019-09-09 22:18:33 +01:00
Joe Rickerby 5e529969ea Merge pull request #153 from mayeut/update-python
Update Python from 3.7.2 to 3.7.4 on macOS
2019-09-09 21:48:50 +01:00
Joe Rickerby b7a689e349 Merge pull request #157 from altendky/patch-1
Add Twisted to working examples list
2019-09-09 21:48:30 +01:00
Thomas Robitaille 4f4fed06e0 Added unit test for CIBW_TEST_EXTRAS 2019-09-09 12:49:11 +01:00
Thomas Robitaille 45fcebf9d8 Fix issue on linux 2019-09-09 12:49:05 +01:00
Thomas Robitaille e67b3bc611 Added support for CIBW_TEST_EXTRAS to allow extras_require to be used to install test dependencies 2019-09-09 12:49:04 +01:00
Thomas Robitaille d8456a0ffa Use one-line commands on CircleCI to ensure that command output is shown 2019-09-07 21:55:42 +01:00
Kyle Altendorf 73681d9b24 Add Twisted to working examples list 2019-08-28 23:06:38 -04:00
mayeut 02ed7b2262 Update Python from 3.7.2 to 3.7.4 on macOS 2019-07-27 11:24:47 +02:00
Joe Rickerby ab86b8cd93 Merge pull request #149 from mayeut/update-openssl
Update openssl patch from 1.0.2r to 1.0.2s on macOS
2019-06-24 10:02:41 +01:00
mayeut 3a03df8ec9 Update openssl patch from 1.0.2r to 1.0.2s on macOS 2019-06-23 18:15:46 +02:00
Joe Rickerby 0e78b2b1f5 Merge pull request #147 from cher-nov/V_for_Veyor
Correct spelling: capitalized 'V' in 'AppVeyor'
2019-06-21 08:53:24 +01:00
Joe Rickerby 5b14c8c0ec Merge pull request #148 from delivrance/add-tgcrypto
Add pyrogram/tgcrypto to README.md
2019-06-21 08:51:49 +01:00
Dan 0627bd09d4 Add pyrogram/tgcrypto to README.md 2019-06-14 21:38:38 +02:00
Dmitry D. Chernov a5e64e216c Correct spelling: capitalized 'V' in 'AppVeyor' 2019-06-10 20:27:32 +10:00
Joe Rickerby 23cf50614f Merge pull request #142 from kngwyu/upd-readme
Specify cibuildwheel=0.11 in Azure example
2019-05-29 08:47:04 +01:00
kngwyu 1e08ff03b3 Specify cibuildwheel=0.11 in README example 2019-05-29 15:15:58 +09:00
Joe Rickerby 2216385c0b Update changelog 2019-05-28 19:22:25 +01:00
Joe Rickerby a1fc0cb117 Bump version 2019-05-28 19:17:28 +01:00
Joe Rickerby 430b71c767 Ensure resources are packaged in release tarballs and wheels
Fix #141
2019-05-28 19:17:05 +01:00
Joe Rickerby 14f14a24d3 Add config for universal wheel support so we can post wheels to PyPI too 2019-05-28 10:34:31 +01:00
Joe Rickerby b732026734 Update changelog 2019-05-26 12:53:51 +01:00
Joe Rickerby 0d85db7111 Bump version 2019-05-26 12:48:43 +01:00
Joe Rickerby 477fc7e060 Merge pull request #132 from joerick/azure-windows
Support Windows on Azure Pipelines [continued...]
2019-05-26 11:38:36 +01:00
Joe Rickerby 17566cdee7 Don't expect Python 3.4 wheels on Azure 2019-04-27 12:12:02 +01:00
Joe Rickerby 49bc742add Remove unused imports 2019-04-27 10:23:07 +01:00
Joe Rickerby 4cbb67fac1 Merge remote-tracking branch 'origin/master' into azure-windows 2019-04-27 10:22:00 +01:00
Joe Rickerby 2e3155decf Merge branch 'master' into azure-windows 2019-04-27 10:11:30 +01:00
Joe Rickerby 719352b1d2 Merge pull request #137 from joerick/custom-test-checks
Custom test checks let individual tests assert exactly which wheels they expect to produce
2019-04-25 14:56:28 +01:00
Joe Rickerby f7d93cc9e4 Fix function name 2019-04-23 22:23:54 +01:00
Joe Rickerby 3f5572e956 Make included scripts virtualenv-friendly 2019-04-23 22:17:59 +01:00
Joe Rickerby bab8b6668e Full error output during pytest fails 2019-04-23 22:17:25 +01:00
Joe Rickerby f29697d623 Retain PYTHONPATH if already in env 2019-04-23 22:17:03 +01:00
Joe Rickerby e87032c830 Rework tests check all wheels produced against a reference list
Also, wrap the cibuildwheel call to make building env easier
2019-04-23 22:15:02 +01:00
Joe Rickerby e360a04dc1 Use utils.platform for platform checks 2019-04-22 23:25:14 +01:00
Joe Rickerby 9050137d2b Neaten the environment modification using triple-quotes and dict.update 2019-04-22 23:23:49 +01:00
Joe Rickerby 857aafbd3f Move the pythonpath fiddling to the test runner
instead of including it in every test
2019-04-22 23:13:34 +01:00
Joe Rickerby 0cd3e426bc Minor formatting fixes 2019-04-22 19:05:34 +01:00
Joe Rickerby 8b632bcb6d Skip cleanup if its not needed (when a test is skipped) 2019-04-22 18:55:55 +01:00
Joe Rickerby 364fc5220e another trailing comma 2019-04-22 18:44:09 +01:00
Joe Rickerby 0ed37f268a In general, prefer single quotes 2019-04-22 18:35:57 +01:00
Joe Rickerby f410fbdd03 Remove trailing commas from environment declarations 2019-04-22 18:33:03 +01:00
Joe Rickerby 21fb27faf7 Rework custom test machinery to give the individual tests more control
on how they're run, and combine environment.json and check.py
2019-04-22 18:22:43 +01:00
Yannick Jadoul ac4b62ca07 Update README.md with --print-build-identifiers switch 2019-04-22 16:15:47 +02:00
Yannick Jadoul 3f7a4d753f Skip non-linux builds for 06_docker_images test, now that we have custom checks 2019-04-20 22:12:45 +02:00
Yannick Jadoul 95d2086ced Adding check.py to tests, rather than a simple generic assert on number of wheels 2019-04-20 20:49:56 +02:00
Yannick Jadoul 52e8f41b5c Added --print-build-identifiers command line option 2019-04-20 19:02:35 +02:00
Joe Rickerby 1e2a2e7d4d Revert "Add azure-template.yml for more compact config"
This reverts commit 6377854545.
2019-04-06 18:03:05 +01:00
Joe Rickerby 6377854545 Add azure-template.yml for more compact config 2019-04-06 17:34:36 +01:00
Joe Rickerby be57269d5d Remove 3.4 from the pipelines config because 3.4 isn't supported 2019-04-06 16:23:14 +01:00
Joe Rickerby d5856884a3 README updates 2019-04-06 16:18:26 +01:00
Joe Rickerby c2d3dc3b0f Update README.md
Fix #133. Thanks @zackw for the report!
2019-04-05 21:31:50 +01:00
Joe Rickerby 9116217b60 Update README.md
Readme improvements, adding Azure config and putting services behind disclosure triangles
2019-03-11 22:37:59 +00:00
Joe Rickerby a8f6684bfd Skip Python 3.4 builds on Azure 2019-03-11 19:59:31 +00:00
Joe Rickerby 6852d87d2e Update changelog 2019-03-10 23:37:36 +00:00
Joe Rickerby 054c273997 Bump version 2019-03-10 23:32:06 +00:00
Joe Rickerby 652d094e46 Fix typo 2019-03-10 23:19:22 +00:00
Joe Rickerby 1bfe6d45bd Add auto-detect platform for Azure 2019-03-10 23:07:14 +00:00
Joe Rickerby aefde9535b Add azure-pipelines test run config 2019-03-10 22:50:07 +00:00
Joe Rickerby d46fb62e95 Refactor for code style 2019-03-10 22:41:55 +00:00
Joe Rickerby 87a9d170b0 Merge pull request #131 from mayeut/openssl-1.0.2r
Update openssl patch from 1.0.2q to 1.0.2r on macOS
2019-03-10 22:38:47 +00:00
Joe Rickerby dcce949d3c Vendor appveyor_run_with_cmd, but don't use it on azure pipelines 2019-03-10 22:03:31 +00:00
mayeut 1d3c59d804 Update openssl patch from 1.0.2q to 1.0.2r on macOS 2019-03-10 22:28:43 +01:00
Joe Rickerby 0b791dbea5 Merge pull request #130 from YannickJadoul/macos-python-2.7.16
Updating version of Python 2.7 to 2.7.16 on macOS
2019-03-10 21:26:04 +00:00
Yannick Jadoul 44256e4aa5 Revert "Running 'pip install --upgrade setuptools' with 'sudo' on macOS, fixing #122" (#129)
This reverts commit d79ca07bbb.
2019-03-10 21:25:28 +00:00
Joe Rickerby 243103762b Merge branch 'master' into azure-windows 2019-03-10 20:29:05 +00:00
Yannick Jadoul b579cd5f2a Updating version of Python 2.7 to 2.7.16 on macOS 2019-03-10 21:22:41 +01:00
Joe Rickerby 8523b25a18 Merge pull request #128 from YannickJadoul/fix-bashlex-install-permission
Fixing issue #127 by avoiding bashlex 0.13 in 'install_requires'
2019-03-10 19:52:32 +00:00
Yannick Jadoul 637a251b79 Fixing issue #127 by avoiding bashlex 0.13 in 'install_requires' 2019-03-10 14:57:43 +01:00
Thomas Robitaille ac76af4f75 Support Python location on Windows in Azure Pipelines 2019-02-22 22:19:41 +00:00
Joe Rickerby a6ff864010 Merge pull request #125 from ushuz/patch-1
Add missing date to changelog
2019-02-15 22:28:18 +00:00
John Hu 79f044314b Add missing date to changelog 2019-02-14 11:58:56 +08:00
Joe Rickerby 0c0e21aa83 Update changelog 2019-02-03 21:58:53 +00:00
Joe Rickerby f1bba58f86 Bump version 2019-02-03 21:54:00 +00:00
Joe Rickerby 56218d896c Merge pull request #123 from YannickJadoul/fix-issue-122
Running 'pip install --upgrade setuptools' with 'sudo' on macOS, fixing #122
2019-02-03 21:37:57 +00:00
Yannick Jadoul d79ca07bbb Running 'pip install --upgrade setuptools' with 'sudo' on macOS, fixing #122 2019-01-30 17:36:17 +01:00
Joe Rickerby c6f4f01732 Update README.md
ref #93
2019-01-07 22:17:19 +00:00
mayeut 586b3c7197 Update openssl patch from 1.0.2p to 1.0.2q on macOS 2019-01-07 18:34:46 +01:00
mayeut 0b4475ed07 Update Python from 3.6.7, 3.7.1 to 3.6.8, 3.7.2 on macOS 2019-01-06 23:52:57 +01:00
Yannick Jadoul 38b3b0a3da Merge pull request #114 from YannickJadoul/deterministic-preamble-order
Sorting build options dict items when printing preamble
2018-11-30 16:09:53 +01:00
Yannick Jadoul 5adfce9838 Merge pull request #113 from xanderyzwich/master
Refactoring: remove package_name
2018-11-30 00:03:03 +01:00
Yannick Jadoul bc83839387 Sorting build options dict items when printing preamble 2018-11-30 00:02:18 +01:00
Yannick Jadoul 481b1cb060 Revert "Uninstalling oclint in Travis CI config to fix HomeBrew upgrade of gcc (triggered by upgrading Python)"
This reverts commit c43f1b6e3d.
2018-11-29 23:37:04 +01:00
Yannick Jadoul ccfc3c3aa1 Fixing indentation error, and keeping only check for setup.py in project root directory in __main__.py 2018-11-29 23:26:10 +01:00
unknown 3d23cbf2a6 corrected as per notations from @YannickJadoul on #113 2018-11-29 02:44:19 +00:00
Joe Rickerby b9a296324d Merge pull request #108 from YannickJadoul/py27-popen-args
Fixing "AttributeError: 'Popen' object has no attribute 'args'" on Python 2.7 for Linux builds
2018-11-06 21:22:22 +00:00
Corey McCarty c4822ebdd6 Remove Try/Except for package_name #102
recommended by @YannickJadoul
2018-11-05 16:30:34 -06:00
corey.d.mccarty 2ca6500bba removed '--name' pieces for #102 2018-11-05 11:47:31 -05:00
corey.d.mccarty 8dd71189b2 removed 'package-name' as per #102 2018-11-05 11:16:42 -05:00
Yannick Jadoul a448c02d7f Fixing "AttributeError: 'Popen' object has no attribute 'args'" on Python 2.7 for Linux builds 2018-10-28 11:51:10 +01:00
Yannick Jadoul 696866bfe1 Merge pull request #111 from mayeut/openssl-update
Update openssl patch from 1.0.2o to 1.0.2p on macOS
2018-10-28 11:46:20 +01:00
Yannick Jadoul 1faa2fe5df Merge pull request #110 from mayeut/python-update
Update Python from 3.6.6, 3.7.0 to 3.6.7, 3.7.1 on macOS
2018-10-28 11:46:05 +01:00
Yannick Jadoul 602acebcc8 Merge pull request #112 from YannickJadoul/brew-upgrade-gcc
Fixing Travic CI build with HomeBrew upgrade of gcc
2018-10-28 11:44:38 +01:00
Yannick Jadoul c43f1b6e3d Uninstalling oclint in Travis CI config to fix HomeBrew upgrade of gcc (triggered by upgrading Python) 2018-10-27 19:22:53 +02:00
mayeut 0d3e67b1f9 Update openssl patch from 1.0.2o to 1.0.2p on macOS 2018-10-26 19:25:25 +02:00
mayeut e3b565320c Update Python from 3.6.6, 3.7.0 to 3.6.7, 3.7.1 on macOS 2018-10-26 19:23:49 +02:00
Yannick Jadoul 56973d34df Merge pull request #109 from safijari/add_apriltags2_to_readme
Add apriltags2-ethz library to readme
2018-10-18 11:13:02 +02:00
Jariullah Safi 66e9a1cc19 Update README.md 2018-10-18 00:04:25 -07:00
Joe Rickerby 2a91396064 Bump version 2018-09-23 22:08:39 +01:00
Joe Rickerby 1c98a9ed22 Update changelog 2018-09-23 22:07:47 +01:00
Joe Rickerby dbcf5ef64b Clarify README shared library note 2018-09-23 22:07:36 +01:00
Joe Rickerby cc030312a3 Prepare changelog update 2018-09-23 21:38:36 +01:00
Joe Rickerby 31c162fa59 Remove Python 3.3 support on windows 2018-09-23 21:38:36 +01:00
Joe Rickerby d80636aa22 Merge pull request #101 from YannickJadoul/cibw-build
Adding CIBW_BUILD option
2018-09-23 21:31:42 +01:00
Yannick Jadoul 22a6f0c7a9 Fixing tests by reducing minimum number of built wheels 2018-09-23 13:08:26 +02:00
Yannick Jadoul 7362075b61 Changing variable name of BuildSelector instance, updating Python version in test 04_build_skip, and adding unit tests for BuildSelector 2018-09-23 13:08:26 +02:00
Yannick Jadoul c108807e16 Renaming test 04_skip to 04_build_skip and amending it to test CIBW_BUILD as well 2018-09-23 13:07:28 +02:00
Yannick Jadoul 05a054245a Updating README.md to include CIBW_BUILD and interation with CIBW_SKIP 2018-09-23 13:07:28 +02:00
Yannick Jadoul a5f89fa7aa Adding CIBW_BUILD option and changing util.BuildSkipper to util.BuildSelector 2018-09-23 13:07:28 +02:00
Yannick Jadoul cf73851c61 Merge pull request #97 from YannickJadoul/docker-without-timeout
Reordering the Linux docker commands to get rid of timeout logic
2018-09-23 12:18:32 +02:00
Joe Rickerby 9372e37b18 Merge pull request #95 from anthrotype/overwrite-existing-wheel
overwrite existing wheel file with same name
2018-09-16 19:24:21 +01:00
Joe Rickerby fbb447c3aa Merge pull request #100 from msanders/patch-1
Add AutoPy
2018-09-15 11:08:42 +01:00
Michael Sanders 1e978d1b35 Add AutoPy 2018-09-14 12:36:46 -07:00
Yannick Jadoul 1dbda7af7e Add '--force' to 'docker rm' command in Linux builds 2018-09-12 11:52:41 +02:00
Yannick Jadoul b64770a560 Cleaning up use of run_docker and removing some debug output 2018-09-09 16:11:42 +02:00
Yannick Jadoul 4cc09a35b4 Removing monotonic from dependencies (until necessary again) 2018-09-09 01:24:07 +02:00
Yannick Jadoul d4885fe44a Fixing outdated Python 2 syntax error 2018-09-09 01:24:07 +02:00
Yannick Jadoul fcf1e9cd84 Moving stdin communication with docker to run_docker function 2018-09-09 01:23:48 +02:00
Yannick Jadoul f417a91a57 First try at getting rid of timeout logic in Linux docker handling, by swapping splitting docker run into create and start 2018-09-09 00:53:08 +02:00
Cosimo Lupo 1b9c74aabc macos: no need to call os.remove, shutil.move overwrites on posix 2018-09-08 18:41:39 +01:00
Joe Rickerby 35832c4309 Readme tweaks 2018-09-08 17:13:39 +01:00
Cosimo Lupo c9fffab6ea remove same-named wheel before shutil.move
In https://github.com/adobe-type-tools/afdko/pull/595 we attempt to build a py2.py3 wheel
thus the filename of the wheel is the same as the previous ones, and it causes a shutil.Error
https://travis-ci.org/adobe-type-tools/afdko/jobs/424691105#L1460

just remove the previous existing file before moving the new one (they'll be identical anyway,
or at least they *should*).
2018-09-06 11:34:50 +01:00
Kyle Altendorf 9f7fdbf456 Add CircleCI support (#91)
* Initial guess at supporting CircleCI

joerick/cibuildwheel#90

* Add note about setup_remote_docker on Circle

* Add diagnostic print of entire docker command

* Add more diagnostic prints

* Retrigger for Circle build

* Preliminary .circleci/config.yml

* Add workflows to Circle

* drop osx on circle

* call python3 directly on circle

* drop repeat pip install

* use a virtualenv on circle

* use a virtualenv on circle... again

* use a virtualenv on circle... again... again

* setup_remote_docker on circle

* try to manually copy into docker on circle

* correct Host

* correct docker calls

* refactor docker calls

* take 2 on the docker cp destination

* more docker cp debugging

* more docker cp debugging... again

* docker cp explicitly to /project

* wait until docker container is up

* wait until docker container is up... again

* and copy results back

* and copy results back... again

* create /output in container

* create /output in container... again

* copy contents of container's /output

* Retrigger ci

* fix merge typo

* fix monotonic

* always install monotonic

* always install monotonic... again

* correct to use project_dir

* wait a bit longer and a bit smarter

* wait a bit longer and a bit smarter... again

* add back circle osx

* add back circle osx... again

* py2/3 for circle

* py2/3 for circle... again

* use python2.7 image on circle linux

* (mostly) remove unused ci host identification code

* skip inspecting docker for the container, just retry copy on failure

* cleanup docker container and images

* fully remove ci host detection

* docs and tidy

* add circle badge
2018-09-05 09:15:32 +01:00
Yannick Jadoul 7c6b331e15 Merge pull request #84 from YannickJadoul/unbuffered-output
Applying unbuffered output to all platforms instead of only Windows
2018-09-02 22:49:26 +02:00
Tommy 22f69e4ced Added a repo using cibuildwheel and fixed some spelling (#92)
* Added KDEpy and fixed some spelling

* Reversed spelling, added repo to README

* Fixing single 'progams' typo in README
2018-09-02 22:40:49 +02:00
Joe Rickerby 4083a7600a Merge pull request #88 from miguelsousa/show-err-output
Improve error reporting during package name fetching
2018-08-21 22:52:45 +01:00
Miguel Sousa 20624e44a3 Improve error reporting during package name fetching 2018-08-21 14:11:28 -07:00
Yannick Jadoul 332b8ec6ac Merge pull request #86 from miguelsousa/patch-1
Update README.md
2018-08-20 09:09:51 +02:00
Miguel Sousa eaf59e385c Update README.md
Add horizontal rules between option descriptions; they make it easier to understand what text belongs to each option.
2018-08-19 21:06:43 -07:00
Yannick Jadoul 57454e75b0 Applying unbuffered output to all platforms instead of only Windows 2018-08-02 12:04:39 +02:00
Joe Rickerby 391c95d355 Update README.md 2018-07-29 18:21:19 +01:00
Joe Rickerby 8124b14491 Bump version 2018-07-29 18:19:24 +01:00
Joe Rickerby b3b15f8404 Merge pull request #81 from madig/macos-test-cmd-in-shell
macOS: run test_command in shell
2018-07-29 14:05:57 +01:00
Joe Rickerby 9a96910919 Merge pull request #83 from mayeut/pybase64
Add pybase64 to the list of working examples
2018-07-29 14:01:43 +01:00
mayeut fce00dd77e Add pybase64 to the list of working examples 2018-07-11 00:03:15 +02:00
Joe Rickerby 6da52a544b Bump version 2018-07-10 19:03:48 +01:00
Joe Rickerby c8037fb237 Update changelog 2018-07-10 19:03:38 +01:00
Joe Rickerby 95a81f2216 Merge pull request #82 from mayeut/update-macos-python-3.6
Update Python 3.6 from 3.6.5 to 3.6.6 on macOS
2018-07-10 18:54:50 +01:00
Joe Rickerby 56c9c9864d Merge pull request #76 from jlaine/python37-windows
Build Windows wheels for Python 3.7 (fixes #75)
2018-07-10 18:51:47 +01:00
Joe Rickerby 0789842ef0 Add note about shell use on mac and linux 2018-07-10 18:46:10 +01:00
Joe Rickerby 5c47700d31 Add platform-specific notes to readme 2018-07-10 18:44:27 +01:00
Joe Rickerby 5ef7eeba4d Update readme: add @mayeut to maintainers team! 2018-07-10 18:39:29 +01:00
mayeut bb554acb28 Update Python 3.6 from 3.6.5 to 3.6.6 on macOS 2018-07-07 14:15:45 +02:00
Joe Rickerby ea3c52631f Add platform-specific CIBW_TEST_COMMAND and CIBW_TEST_REQUIRES variants 2018-07-05 09:58:05 +01:00
Joe Rickerby b18281867b Add test for CIBW_TEST_COMMAND running in a shell on mac and linux 2018-07-05 09:28:44 +01:00
Nikolaus Waxweiler 4a0d05df49 macOS: run test_command in shell
Fixes https://github.com/joerick/cibuildwheel/issues/39.
2018-07-04 15:56:12 +01:00
Joe Rickerby c1cd99ee4c Add check for python & pip within the configured python root 2018-07-01 21:38:14 +01:00
Joe Rickerby e68400b403 Update changelog 2018-07-01 21:30:53 +01:00
Jeremy Lainé 2f1f34f693 Build Windows wheels for Python 3.7 (fixes #75) 2018-07-01 22:30:22 +02:00
Joe Rickerby 3ef401b19e Bump version 2018-07-01 21:28:28 +01:00
Joe Rickerby 8800ea514b Merge pull request #79 from YannickJadoul/python-macos-3.7.0
Update Python 3.7.0rc1 to 3.7.0 on macOS
2018-07-01 21:27:00 +01:00
Yannick Jadoul f62b9755e1 Update Python 3.7.0rc1 to 3.7.0 on macOS 2018-06-30 18:28:04 +02:00
Joe Rickerby 033ba29ec6 Update changelog 2018-06-18 23:17:42 +01:00
Joe Rickerby 0627b38402 Bump version 2018-06-18 23:09:19 +01:00
Joe Rickerby 189dc13714 Merge pull request #71 from mayeut/macos-ssl
macOS: patch _ssl module on Python 3.4 & 3.5
2018-06-18 23:02:01 +01:00
Joe Rickerby 793026f3ed Merge pull request #60 from YannickJadoul/python-pip-replacement
Removing replacement of {python} and {pip} in CIBW_BEFORE_BUILD
2018-06-18 22:59:52 +01:00
Joe Rickerby 08b4895b9c Changelog update 2018-06-18 22:57:22 +01:00
Joe Rickerby 7c635b4550 Bump version 2018-06-18 22:52:02 +01:00
Joe Rickerby 33433f0b21 Merge pull request #73 from lelit/py37
Add support for Python 3.7
2018-06-18 22:50:54 +01:00
Joe Rickerby e3981db2a6 Skip the custom docker image specifier for Python 3.7
We'll reenable this when 3.7 is released and dockcross updates :)
2018-06-18 22:35:05 +01:00
Joe Rickerby 1ec652dff8 Fix pip variable use 2018-06-17 21:06:00 +01:00
Joe Rickerby d2394e9a57 Merge commit '57a2259a00bf7ea3309faa231406df8e487ae792' into python-pip-replacement
* commit '57a2259a00bf7ea3309faa231406df8e487ae792':
  Use travis-ci provided python3 on Linux
  linux: transfer ownership of the wheel to the current user
  Update changelog
  Bump version
  macOS/Windows: Update setuptools
  Drop python 3.3 support on Linux
  macOS: update to python 2.7.15
  Renaming util.get_build_verbosity_flag into util.get_build_verbosity_extra_flags
  Bump version
  windows: upgrade pip with 'python -m pip'
  Fixing empty verbosity flag argument to `subprocess.check_call`
  Adding an to make the `pip wheel` invocation more or less verbose
2018-06-17 21:00:16 +01:00
Joe Rickerby 0b21df216e update support matrix in readme 2018-06-17 20:52:46 +01:00
Lele Gaifax e5b9d1f586 Fix mistake in directory name 2018-06-16 15:23:26 +02:00
Lele Gaifax 9b31b5e6c9 Add support for Python 3.7
This enables building binary wheels for Python 3.7, now at its rc1 release.

It is included in the latest manylinux1 Docker image, see https://github.com/pypa/manylinux/pull/196.

Accordingly to https://www.appveyor.com/docs/build-environment/#python it is not yet available on Appveyor.
2018-06-16 13:42:11 +02:00
mayeut 1a910257bb macOS: patch _ssl module on Python 3.4 & 3.5 2018-05-06 17:13:21 +02:00
mayeut 4f542ca3d4 Add test for TLS 1.2 support & valid certificates 2018-05-06 17:13:21 +02:00
Yannick Jadoul 57a2259a00 Merge pull request #66 from mayeut/drop-linux-python3.3
Give ownership of the wheel files to the current user instead of root on Linux
2018-05-06 16:00:42 +02:00
mayeut d186b0bbb7 Use travis-ci provided python3 on Linux 2018-05-06 15:44:27 +02:00
mayeut 57cdb8711c linux: transfer ownership of the wheel to the current user 2018-05-06 15:44:27 +02:00
Joe Rickerby 7448ca3cf1 Update changelog 2018-05-04 10:21:34 -07:00
Joe Rickerby d93547d8be Bump version 2018-05-04 10:04:39 -07:00
Yannick Jadoul a863e21b14 Merge pull request #68 from mayeut/python-update
macOS: update to python 2.7.15
2018-05-04 17:43:36 +02:00
mayeut b4c0150d43 macOS/Windows: Update setuptools 2018-05-04 17:27:33 +02:00
Yannick Jadoul c8019dac1d Merge pull request #67 from mayeut/only-drop-linux-python3.3
Drop python 3.3 support on Linux
2018-05-04 12:12:48 +02:00
mayeut e6fa70a910 Drop python 3.3 support on Linux 2018-05-03 22:05:45 +02:00
mayeut b19e8b76f3 macOS: update to python 2.7.15 2018-05-02 22:01:53 +02:00
Yannick Jadoul 23ab1f780e Merge pull request #61 from YannickJadoul/pip-verbose
Adding an option to make the `pip wheel` invocation more or less verbose
2018-04-30 15:24:19 +02:00
Yannick Jadoul eedcd62753 Renaming util.get_build_verbosity_flag into util.get_build_verbosity_extra_flags 2018-04-30 15:07:56 +02:00
Joe Rickerby 3a4d611da1 Bump version 2018-04-25 23:03:14 +01:00
Joe Rickerby 8877990ec6 Merge pull request #62 from anthrotype/fix-pip-upgrade-windows
windows: upgrade pip with 'python -m pip'
2018-04-25 23:01:58 +01:00
Cosimo Lupo 0cc41fabba windows: upgrade pip with 'python -m pip'
this fixes an "ImportError: cannot import name main" when self-upgrading
pip to latest version 10

see https://github.com/pypa/pip/issues/5240#issuecomment-382989420
2018-04-20 10:48:42 +01:00
Joe Rickerby 0156a9a870 Fix "'NoneType' is not iterable" error
The build_options dict contains None objects ! :)
2018-04-08 23:38:54 +01:00
Joe Rickerby 460a4d9656 Code tidy/reorganise 2018-04-08 23:26:04 +01:00
Yannick Jadoul 8d9d970874 Fixing empty verbosity flag argument to subprocess.check_call 2018-04-08 21:51:19 +02:00
Yannick Jadoul c563bca054 Adding an to make the pip wheel invocation more or less verbose 2018-04-08 21:37:40 +02:00
Joe Rickerby b47a5c018f Remove unused warnings import 2018-04-08 19:11:38 +01:00
Joe Rickerby 94e33cd7e3 Switch to a more user-friendly warning style 2018-04-08 18:42:47 +01:00
Joe Rickerby c9c54602ed Correct comment 2018-04-08 18:42:21 +01:00
Joe Rickerby b74333a940 Simplify prepare_command function and add deprecation warning 2018-04-08 18:25:18 +01:00
Joe Rickerby 4655311a7a Merge origin/master into python-pip-replacement
* commit '71503b7143d22765a8f2b324dd75046644ea5726':
  Replacing leftover `test_command.format(...)` by `prepare_command(test_command, ...)` in linux.py
  Replacing {python} and {pip} in CIBW_TEST_COMMAND (and {project} in CIBW_BEFORE_BUILD) for consistency

# Conflicts:
#	README.md
#	cibuildwheel/macos.py
2018-04-08 18:11:00 +01:00
Joe Rickerby 71503b7143 Merge pull request #59 from YannickJadoul/prepare-test-command
Replacing {python} and {pip} in CIBW_TEST_COMMAND (and {project} in C…
2018-04-08 18:06:30 +01:00
Joe Rickerby 5099d60584 Use a separate folder for bin overrides 2018-04-08 18:05:59 +01:00
Yannick Jadoul 2ebde4c078 Reverting removal of prepare_command to maintain backwards compatibility of configurations with {python} and {pip} 2018-04-08 17:01:54 +02:00
Yannick Jadoul e33b6bed77 Replacing leftover test_command.format(...) by prepare_command(test_command, ...) in linux.py 2018-04-08 16:50:10 +02:00
Yannick Jadoul 4d61b08fa3 Updating README, removing documentation on {python} and {pip} 2018-04-08 15:26:09 +02:00
Yannick Jadoul 5e009e53c9 Symlinking only on first-time installation of Python versions on mac OS X 2018-04-08 15:15:47 +02:00
Yannick Jadoul 783a4deec6 Symlinking python3 and pip3 to python and pip for OS X runs 2018-04-08 15:05:21 +02:00
Yannick Jadoul 529e22bfe0 Removing {python} from test 03_before_build 2018-04-08 14:14:01 +02:00
Yannick Jadoul 418cb9c39d Removing replacement of {python} and {pip} in CIBW_BEFORE_BUILD 2018-04-08 13:40:30 +02:00
Yannick Jadoul 99469087ed Replacing {python} and {pip} in CIBW_TEST_COMMAND (and {project} in CIBW_BEFORE_BUILD) for consistency 2018-04-07 23:57:58 +02:00
Joe Rickerby 3b847ab0aa Changelog updated 2018-04-02 15:50:59 +01:00
Joe Rickerby 7f51b1d8e7 Bump version 2018-04-02 15:49:39 +01:00
Joe Rickerby 7f77aa86b1 Merge pull request #57 from mayeut/macos-update
macOS: Fix Pip bugs resulting from PyPI TLS 1.2 enforcement
macOS: Fix brew python version
2018-04-02 15:48:57 +01:00
mayeut 47873a9175 Use latest pip on macos 2018-03-31 13:19:12 +02:00
mayeut c38a33381d Update python versions on macos 2018-03-31 13:19:00 +02:00
mayeut 121f7cc678 Fix macos python3 test 2018-03-31 12:36:59 +02:00
Joe Rickerby d6361c0e31 Update changelog 2018-01-07 18:10:27 +00:00
Joe Rickerby ffb48a61cb Bump version 2018-01-07 18:04:52 +00:00
Joe Rickerby d16c63ad95 Merge pull request #46 from YannickJadoul/alternative-docker-images
Option for alternative docker images for manylinux1
2018-01-07 18:02:23 +00:00
Joe Rickerby d16d81e207 Update minimal config example
pip2 and language: generic is required on mac for travis to work.

Fixes #48
2018-01-07 17:58:21 +00:00
Joe Rickerby e5c7bb416d Merge pull request #51 from YannickJadoul/single-subdir-project-fix
Fixing confusion between subdirectory and PyPI projectin call to `pip wheel <subdir>`
2018-01-04 22:31:51 +00:00
Yannick Jadoul a85b535d83 Fixing confusion between subdirectory and PyPI projectin call to pip wheel <subdir> 2017-12-30 13:27:55 +01:00
Yannick Jadoul 9013a7783f Adding a check for Linux to test 06_docker_images's check for the '/dockcross' directory 2017-12-29 13:42:08 +01:00
Joe Rickerby 08194a1db9 Add check for running inside the dockcross image 2017-12-24 12:53:10 +00:00
Joe Rickerby a9e05a596a Update README.md
Add extra examples of CIBW_SKIP as discussed in #47
2017-12-21 15:54:21 +00:00
Yannick Jadoul e40f9b2345 Added documentation on CIBW_MANYLINUX1_..._IMAGE options to the README 2017-11-19 23:59:24 +01:00
Yannick Jadoul 65dccc46b2 Disabling skipping of all macos/windows tests for 06_docker_images 2017-11-19 23:18:55 +01:00
Yannick Jadoul d247743713 Adding platform-specific arguments (for manylinux1 images) 2017-11-19 23:18:10 +01:00
Yannick Jadoul 4e0b3c0f31 First try at implementing optionsfor allowing different manylinux1 docker images 2017-10-29 11:47:38 +01:00
Joe Rickerby 6bbef964c9 Update changelog 2017-10-09 19:26:45 +01:00
Joe Rickerby ede818944e Bump version 2017-10-09 19:09:26 +01:00
Joe Rickerby 9c73dd2ac7 Merge pull request #42 from hroncok/patch-2
Add python-admesh to the list of working examples
2017-10-09 19:05:22 +01:00
Miro Hrončok 5f7c019392 Add python-admesh to the list of working examples 2017-09-20 18:09:30 +02:00
Joe Rickerby cd9eeb72e5 Merge pull request #34 from joerick/faster-mac-ci
Faster builds on Mac
2017-09-19 20:12:39 +01:00
Joe Rickerby d075c731b6 Merge pull request #36 from YannickJadoul/linux-docker-host-mount
Adding extra mount / to /host on docker invocation for linux wheels
2017-09-19 20:11:09 +01:00
Joe Rickerby 8fa41df67d Fix a couple typos 2017-09-19 20:09:59 +01:00
Joe Rickerby 0e849c2bcf Merge pull request #37 from joerick/readme-repos-parselmouth
Added the Parselmouth project to the projects using cibuildwheel in the README
2017-09-19 12:20:53 +01:00
Joe Rickerby 212fa34d9d Merge pull request #38 from hroncok/patch-1
It's manylinux1_i686, not manylinux1_i386
2017-09-19 12:20:37 +01:00
Miro Hrončok cb73b18bce It's manylinux1_i686, not manylinux1_i386 2017-09-18 23:59:46 +02:00
Yannick Jadoul 1730d6fd0b Adding notes on Linux builds in Docker 2017-09-16 23:03:14 +02:00
Joe Rickerby 1e9067272d Merge pull request #35 from YannickJadoul/linux-python-bin-path
Adding $PYBIN to path when calling pip wheel
2017-09-16 10:04:13 +01:00
Yannick Jadoul b0afaf33c2 Added the Parselmouth project to the projects using cibuildwheel in the README 2017-09-14 10:54:01 +02:00
Yannick Jadoul d0e5a4bb3c Adding extra mount / to /host on docker invocation for linux wheels 2017-09-13 22:56:06 +02:00
Yannick Jadoul 4dc8bf447f Adding $PYBIN to path when calling pip wheel 2017-09-12 12:37:51 +02:00
Joe Rickerby 9a6a7d3375 Python 3 faster builds too 2017-09-11 10:51:30 +01:00
Joe Rickerby 719ad30d05 Update changelog 2017-09-10 22:52:21 +01:00
Joe Rickerby d549a1301f Bump version 2017-09-10 22:46:27 +01:00
Joe Rickerby adef5445f7 Merge pull request #25 from joerick/python3-ci
Add CI runs for Python3 as well as Python2
2017-09-10 22:42:48 +01:00
Joe Rickerby 666c10465a Speed up mac CI by only installing python if it's not already installed 2017-09-10 22:40:49 +01:00
Joe Rickerby e486a6551d Merge pull request #33 from YannickJadoul/readme-summary
Adding an overview of available options
2017-09-10 22:22:33 +01:00
Joe Rickerby 53b4ea5125 Maybe bitrise will run the macos builds! 2017-09-10 22:02:36 +01:00
Joe Rickerby a7f81b3c58 Use language: generic for Mac builds on Travis
https://github.com/travis-ci/travis-ci/issues/2312
2017-09-10 21:29:01 +01:00
Yannick Jadoul 52dba1cc83 Updating README with overview of available customizations 2017-09-08 00:15:11 +02:00
Joe Rickerby 986d56279e Update changelog 2017-09-07 23:06:08 +01:00
Joe Rickerby 203ce7879d Bump version 2017-09-07 22:59:56 +01:00
Joe Rickerby e413863531 Fix running command nodes on python 3 2017-09-07 22:38:52 +01:00
Joe Rickerby f4eafa901b Ignore some venv locations 2017-09-07 22:38:32 +01:00
Joe Rickerby 0cd8228db1 Use same python interpreter for running pytest 2017-09-07 21:59:04 +01:00
Joe Rickerby 510a6ce84a Only install python3 pip when doing that build 2017-09-07 21:50:48 +01:00
Joe Rickerby 7420e2a924 Use apt to install pip 2017-09-07 21:45:43 +01:00
Joe Rickerby 1cd65ccbb6 Add ensurepip for Linux build to ensure setuptools/pip are installed 2017-09-07 18:58:08 +01:00
Joe Rickerby 857644e391 Merge branch 'master' into python3-ci
* master: (28 commits)
  Update README to combine environment sections
  Update README
  os.path.samefile is not available on windows.
  Add shell-style execution on the Mac
  Use os.path.samefile to get around filename case insensitivity
  Add test for before_build executing in a shell
  Fix some linter warnings
  Add CIBW_ENVIRONMENT to README and reorder options
  Fix empty env string case
  Fix string splitting for the env string
  Making call from run_tests to run_test subprocess.check_call
  Fixing 'ValueError: Attempted relative import in non-package'
  Update README.md
  Reducing code duplication in bin/run_test.py and bin/run_tests.py
  Semicolons need quoting
  Ignore vscode project settings
  Windows uses a different pathsep so have to use that in the test
  Make shell evals work and add tests for that
  Use parse_environment in the main code
  Run the unit tests in CI
  ...

# Conflicts:
#	.travis.yml
#	appveyor.yml
#	run_tests.py
2017-09-07 18:55:33 +01:00
Joe Rickerby d0a211dcf5 Update README to combine environment sections 2017-09-07 18:35:21 +01:00
Joe Rickerby 48fb148341 Merge branch 'set-cibw-env-variable' of https://github.com/mayeut/cibuildwheel into mayeut-set-cibw-env-variable 2017-09-07 18:31:21 +01:00
Joe Rickerby 43dcd58b0b Merge pull request #32 from joerick/before-build-shell
before_build executes in shell
2017-09-07 18:23:51 +01:00
Joe Rickerby d381b63b00 Update README 2017-09-07 18:21:01 +01:00
Joe Rickerby 4457a128f6 Merge pull request #21 from joerick/environment
CIBW_ENVIRONMENT
Fixes #16
2017-09-07 18:12:23 +01:00
Joe Rickerby aca294f5bb os.path.samefile is not available on windows. 2017-09-06 22:33:01 +01:00
Joe Rickerby b64a1c1465 Add shell-style execution on the Mac 2017-09-06 22:11:05 +01:00
Joe Rickerby ddb9c077a5 Use os.path.samefile to get around filename case insensitivity 2017-09-06 22:07:24 +01:00
Joe Rickerby bade2da061 Add test for before_build executing in a shell 2017-09-06 22:02:10 +01:00
Joe Rickerby 523dfc0643 Fix some linter warnings 2017-09-06 19:18:28 +01:00
Joe Rickerby 7c416329d4 Add CIBW_ENVIRONMENT to README and reorder options 2017-09-06 19:14:06 +01:00
Joe Rickerby 34e8ee0f25 Fix empty env string case 2017-09-06 18:35:42 +01:00
Joe Rickerby b18684aee5 Merge branch 'environment' of github.com:joerick/cibuildwheel into environment
* 'environment' of github.com:joerick/cibuildwheel:
  Making call from run_tests to run_test subprocess.check_call
  Fixing 'ValueError: Attempted relative import in non-package'
  Reducing code duplication in bin/run_test.py and bin/run_tests.py
2017-09-06 18:27:13 +01:00
Joe Rickerby be474fd7f7 Fix string splitting for the env string 2017-09-06 18:27:06 +01:00
Yannick Jadoul 93d2a593c4 Making call from run_tests to run_test subprocess.check_call 2017-09-06 16:14:39 +02:00
Yannick Jadoul 3188c978c9 Fixing 'ValueError: Attempted relative import in non-package' 2017-09-06 15:46:31 +02:00
Joe Rickerby 0facf0ae12 Update README.md
Add Yannick to collaborators
2017-09-06 14:22:44 +01:00
Yannick Jadoul a7c7a58407 Reducing code duplication in bin/run_test.py and bin/run_tests.py 2017-09-06 15:07:58 +02:00
Joe Rickerby 60ed370002 Semicolons need quoting 2017-09-03 10:01:59 +01:00
Joe Rickerby cc852f1cc1 Ignore vscode project settings 2017-09-03 10:00:18 +01:00
Joe Rickerby 7229ddeb67 Windows uses a different pathsep so have to use that in the test 2017-09-02 22:20:28 +01:00
Joe Rickerby f56ddda157 Make shell evals work and add tests for that 2017-09-02 22:09:32 +01:00
Joe Rickerby 4922c8c4ec Merge commit '92304597bd06531c0139db9dd8766562f38cf19e' into python3-ci
* commit '92304597bd06531c0139db9dd8766562f38cf19e':
  Replacing unbuffered 'os.fdopen' by proxy object to have a unbuffered stdout solution for Windows and AppVeyor that works on Python 3
2017-09-01 13:51:49 +01:00
Joe Rickerby 267e566c43 Add language: python to the travis build 2017-09-01 13:49:39 +01:00
Joe Rickerby f64cb35d22 Merge remote-tracking branch 'origin/master' into environment 2017-09-01 13:42:45 +01:00
Joe Rickerby 4d26e4360f Merge pull request #31 from beniwohli/issue/nested-output-dir
use os.makedirs to allow nested output directory
2017-09-01 13:34:21 +01:00
Joe Rickerby fcb681d283 Use parse_environment in the main code 2017-09-01 13:33:29 +01:00
Joe Rickerby 9091533fcc Run the unit tests in CI 2017-09-01 13:32:34 +01:00
Joe Rickerby 5ae4da631f Add environment code satisfying unit test 2017-09-01 13:24:12 +01:00
Benjamin Wohlwend 0766cbd52f use os.makedirs to allow nested output directory 2017-08-31 09:49:57 +02:00
Joe Rickerby fd385a9bf8 Add some tests for the environment functionality 2017-08-30 19:05:06 +01:00
mayeut 0a7a1b8fb3 Set CIBUILDWHEEL environment variable to 1 during build 2017-08-29 18:18:40 +02:00
Joe Rickerby 9faa8f8728 Merge pull request #27 from aaugustin/patch-1
Add websockets to list of users.
2017-08-21 20:51:11 +01:00
Aymeric Augustin e9eba34869 Add websockets to list of users. 2017-08-20 14:16:07 +02:00
Yannick Jadoul 92304597bd Replacing unbuffered 'os.fdopen' by proxy object to have a unbuffered stdout solution for Windows and AppVeyor that works on Python 3 2017-08-17 22:06:23 +02:00
Joe Rickerby 6abacb46e4 Run the tests with the same interpreter that runs run_tests.py 2017-08-14 23:37:06 +01:00
Joe Rickerby f07979ec23 Actually fix syntax error 2017-08-14 23:23:15 +01:00
Joe Rickerby e66ab50909 Fix syntax error 2017-08-14 23:20:41 +01:00
Joe Rickerby 037cda5ef3 Add Python 3 CI runners 2017-08-14 23:19:39 +01:00
Joe Rickerby a5a23114a9 Update changelog 2017-08-14 21:39:42 +01:00
Joe Rickerby 77ab9a7627 Bump version 2017-08-14 21:37:37 +01:00
Joe Rickerby adf98443a1 Merge pull request #24 from YannickJadoul/windows-output
Unbuffered stdout for Windows and displaying the output of subprocess calls

Fix #23
2017-08-14 21:35:35 +01:00
Joe Rickerby abfbe42d6f Add -u flag so the test output is in the right order on Appveyor 2017-08-14 21:11:04 +01:00
Joe Rickerby b7a52b502d Move the stdout flush to the windows file, since it's only needed there 2017-08-14 21:10:48 +01:00
Joe Rickerby 573098f38f Mac/Windows stubs and test case for environment inheritance 2017-08-14 21:07:08 +01:00
Yannick Jadoul 84c2b30676 Flushing stdout in print_preamble 2017-08-14 15:12:46 +02:00
Yannick Jadoul f3e06f0a99 Unbuffered stdout for Windows and displaying the output of subprocess calls 2017-08-14 14:45:55 +02:00
Joe Rickerby 6aba5f81f1 Add a Linux implementation of environment 2017-07-24 22:39:37 +01:00
Joe Rickerby 38f89e955f Added test for environment and a script for local running 2017-07-24 22:39:16 +01:00
Joe Rickerby ed104d1315 Update readme 2017-07-23 22:39:15 +01:00
Joe Rickerby 4c0dd55c1a Bump version 2017-07-23 22:24:56 +01:00
Joe Rickerby e43d06f928 Update README.md
Capture the `pip install .` wisdom for quick-building projects.
2017-07-20 12:13:15 +01:00
tdos.apone f26da27db8 Merge pull request #18 from tgarc/master
revert PR9; add --no-deps to pip wheel

Revert PR9; it was never actually needed in the first place it just fixed an
issue by side effect.

1) add --no-deps to pip wheel step in order to avoid building wheels for
   dependencies. This also addresses the issues raised in PR #11.

2) Modify the pip install step across platforms to allow installation of
   dependencies from the index. (This is required since we will no longer be
   building wheels for dependencies).
2017-07-20 00:57:01 -05:00
Joe Rickerby b2fc3f4220 Remove more Python 2.6 support that I missed. See #12. 2017-07-18 23:12:07 +01:00
Joe Rickerby 609f90c88b Update README.md 2017-07-13 22:21:44 +01:00
Joe Rickerby 6e0d6b7fbc Update README.md 2017-07-13 22:20:33 +01:00
Joe Rickerby 5b7f105cb3 Merge pull request #14 from tgarc/master
minor fixes including python3 fix
2017-07-05 09:36:39 +01:00
tdos.apone b5006fc4bc minor fixes including python3 fix
+ In linux environment, if there was no matching python configurations for a
  particular architecture (i.e. if that architecture was skipped) the docker
  build script would just crash. The offending line:

    for whl in /tmp/linux_wheels/*.whl; do

  would result in whl being equal to the unexpanded glob expression. Rather
  than checking this in the bash script, python checks whether there are any
  actual wheels to build and skips the script if there are none.

+ added universal_newlines=True when making the call to grab the package name -
  this fix is required for python3 since other a bytes prefix (b'') will be
  added to the package name

+ In the linux/docker environment, added a try/catch statement around the
  docker script for KeyboardInterrupt that will kill the docker subprocess in
  cases where cibuildwheel is being run interactively.
2017-07-02 17:11:15 -05:00
Joe Rickerby c28e85df9e Create CODE_OF_CONDUCT.md 2017-06-27 20:14:39 +01:00
Joe Rickerby 726939506e Update Readme 2017-06-27 19:57:47 +01:00
Joe Rickerby 3ad2443df1 Add Docker check to linux run 2017-06-27 18:18:20 +01:00
Joe Rickerby e475859d89 Update changelog 2017-06-27 18:18:07 +01:00
Joe Rickerby dbb9bcb4d5 Bump version 2017-06-27 17:48:34 +01:00
Joe Rickerby c585dbd6f3 Remove Python 2.6 support on Linux
See #12 for discussion. Fix #12.
2017-06-27 16:44:41 +01:00
Joe Rickerby fdda1ee2e1 Add changelog to README 2017-06-11 16:32:13 +01:00
Joe Rickerby 533ef04740 Bump version 2017-06-11 16:20:44 +01:00
Joe Rickerby 8a3935551b Merge pull request #9 from tgarc/master
add a 'pip install' step before building wheels
2017-06-11 16:20:19 +01:00
tdos.apone 1b33c4cac5 add a 'pip install' step before building wheels 2017-06-03 12:37:13 -05:00
Joe Rickerby f734bffc1e Merge pull request #8 from tgarc/master
fix python 3 support
2017-05-27 18:37:40 +01:00
tdos.apone b40852ec90 fix python 3 support
+ urllib2 doesn't exist in python 3 - import from urllib.request instead

+ for linux builds open docker process with universal_newlines; this
  opens a pipe in 'text' mode using the default preferred encoding
2017-05-27 09:40:34 -05:00
Joe Rickerby a232b09fee Add automatic deployment option to readme
See #5
2017-04-23 13:25:40 +01:00
Joe Rickerby e3b2de0489 Bump version 2017-04-13 15:24:05 +01:00
Joe Rickerby c3565d5025 Add fancy preamble for the log files 2017-04-13 15:02:04 +01:00
Joe Rickerby 31ac2ba03f Fix compatibility with setup_requires 2017-04-13 14:22:27 +01:00
Joe Rickerby 083ece8bbc Don't ignore dependency wheels, copy them to output if pure wheels 2017-04-13 13:48:57 +01:00
Joe Rickerby bdbbf18e43 Add zfrenchee credit to README
Ref #2
2017-04-12 09:59:58 +01:00
Joe Rickerby 45a7836cc6 Fix copy/paste error 2017-04-12 09:58:46 +01:00
Joe Rickerby d5fa5475d4 Don't audit or delocate wheels that are dependencies of the package
Wheels that are dependencies are also output by `pip wheel`. These can
cause auditwheel trouble, and we're not interested in them anyway
2017-04-12 09:49:38 +01:00
Joe Rickerby 3f6a943b6d Add missing imports 2017-04-11 23:28:13 +01:00
Joe Rickerby c7764d239b Remove coming soon link
Fix #3
2017-04-11 23:24:53 +01:00
Joe Rickerby e072e82252 Add test for CIBW_SKIP 2017-04-11 23:23:59 +01:00
Joe Rickerby cf7f2e18ce Style 2017-04-11 23:23:50 +01:00
Joe Rickerby a2a2a7b382 Add Mac and Windows implementations of CIBW_SKIP 2017-04-11 23:15:19 +01:00
Joe Rickerby ba22589f6f Implement CIBW_SKIP for linux 2017-04-11 22:57:42 +01:00
Joe Rickerby e9bf990fd2 Merge branch 'before_build'
* before_build:
  Add documentation for CIBW_BEFORE_BUILD
  Fix os/sys typo and use an absolute path on *nix too
  Change version file path to absolute on Windows
  Perhaps a filename collision
  Check the path is okay on windows
  remove redundant line
  A little more debugging info for Windows
  Add before_build option, that runs a shell command before 'pip wheel'
  Don't run tests in a subshell so the errexit option applies
  Run the pip version check in the right env

# Conflicts:
#	README.md
2017-04-11 21:54:31 +01:00
Joe Rickerby db09cfc4a9 Update README.md 2017-04-10 22:58:05 +01:00
Joe Rickerby 2c0d6e3db1 Add documentation for CIBW_BEFORE_BUILD 2017-04-10 22:48:12 +01:00
Joe Rickerby 89c8735719 Fix os/sys typo and use an absolute path on *nix too 2017-04-10 22:41:08 +01:00
Joe Rickerby 7a2e951f48 Change version file path to absolute on Windows 2017-04-10 22:36:06 +01:00
Joe Rickerby ff942ad766 Perhaps a filename collision 2017-04-10 22:25:34 +01:00
Joe Rickerby 881cd66fae Check the path is okay on windows 2017-04-10 22:12:26 +01:00
Joe Rickerby 278661df77 remove redundant line 2017-04-10 22:11:10 +01:00
Joe Rickerby 520daa4c23 A little more debugging info for Windows 2017-04-10 21:56:26 +01:00
Joe Rickerby 2679cb7f46 Add before_build option, that runs a shell command before 'pip wheel' 2017-04-10 21:42:12 +01:00
Joe Rickerby 56f9a37165 Don't run tests in a subshell so the errexit option applies 2017-04-10 21:41:05 +01:00
Joe Rickerby 5c91340ad0 Run the pip version check in the right env 2017-04-10 21:40:03 +01:00
64 changed files with 3332 additions and 408 deletions
+73
View File
@@ -0,0 +1,73 @@
version: 2
jobs:
osx-python2:
macos:
xcode: "10.0.0"
environment:
PYTHON: python2
steps:
- checkout
- run:
name: Prepare the environment.
command: bash .circleci/prepare.sh
- run:
name: Test.
command: venv/bin/python ./bin/run_tests.py
osx-python3:
macos:
xcode: "10.0.0"
environment:
PYTHON: python3
steps:
- checkout
- run:
name: Prepare the environment.
command: bash .circleci/prepare.sh
- run:
name: Test.
command: venv/bin/python ./bin/run_tests.py
linux-python2:
docker:
- image: circleci/python:2.7
environment:
PYTHON: python2
steps:
- checkout
- setup_remote_docker
- run:
name: Prepare the environment.
command: bash .circleci/prepare.sh
- run:
name: Test.
command: venv/bin/python ./bin/run_tests.py
linux-python3:
docker:
- image: circleci/python:3.6
environment:
PYTHON: python3
steps:
- checkout
- setup_remote_docker
- run:
name: Prepare the environment.
command: bash .circleci/prepare.sh
- run:
name: Test.
command: venv/bin/python ./bin/run_tests.py
workflows:
version: 2
all-tests:
jobs:
- osx-python2
- osx-python3
- linux-python2
- linux-python3
+7
View File
@@ -0,0 +1,7 @@
$PYTHON --version
$PYTHON -m pip --version
$PYTHON -m pip install -q --user --ignore-installed --upgrade virtualenv
$PYTHON -m virtualenv -p $PYTHON venv
venv/bin/python -m pip install -r requirements-dev.txt
venv/bin/python -m pip freeze
venv/bin/python --version
+6
View File
@@ -85,10 +85,16 @@ celerybeat-schedule
# virtualenv
.venv
venv/
venv3/
ENV/
env/
env3/
# Spyder project settings
.spyderproject
# Rope project settings
.ropeproject
# VSCode project settings
/.vscode
+11
View File
@@ -0,0 +1,11 @@
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
version: 2
mkdocs:
configuration: mkdocs.yml
python:
version: 3.7
install:
- requirements: requirements-dev.txt
+30 -13
View File
@@ -1,17 +1,34 @@
language: generic
matrix:
include:
# Linux Python 2
- sudo: required
services:
- docker
- os: osx
language: python
python: 2.7
services: docker
env: PYTHON=python
script:
- |
if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
pip install .
python ./run_tests.py
else
# linux test requires root to clean up the wheelhouse (docker runs as root)
sudo pip install .
sudo python ./run_tests.py
fi
# Linux Python 3
- sudo: required
language: python
python: 3.5
services: docker
env: PYTHON=python
# macOS Python 3
- os: osx
env: PYTHON=python3
- os: windows
language: shell
before_install:
- choco install python3 --version 3.6.8 --no-progress -y
install:
- C:\\Python36\\python -m pip install -r requirements-dev.txt
script:
- C:\\Python36\\python ./bin/run_tests.py
install: $PYTHON -m pip install -r requirements-dev.txt
script: $PYTHON ./bin/run_tests.py
+46
View File
@@ -0,0 +1,46 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at joerick@mac.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
+1 -1
View File
@@ -1,6 +1,6 @@
This project is licensed under the 'BSD 2-clause license'.
Copyright (c) 2016, Tingbot. All rights reserved.
Copyright (c) 2017-2019, Joe Rickerby and contributors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
+276 -195
View File
@@ -1,258 +1,339 @@
cibuildwheel
============
[![PyPI](https://img.shields.io/pypi/v/cibuildwheel.svg)](https://pypi.python.org/pypi/cibuildwheel) [![Build Status](https://travis-ci.org/joerick/cibuildwheel.svg?branch=master)](https://travis-ci.org/joerick/cibuildwheel) [![Build status](https://ci.appveyor.com/api/projects/status/wbsgxshp05tt1tif/branch/master?svg=true)](https://ci.appveyor.com/project/joerick/cibuildwheel/branch/master)
[![PyPI](https://img.shields.io/pypi/v/cibuildwheel.svg)](https://pypi.python.org/pypi/cibuildwheel) [![Build Status](https://travis-ci.org/joerick/cibuildwheel.svg?branch=master)](https://travis-ci.org/joerick/cibuildwheel) [![Build status](https://ci.appveyor.com/api/projects/status/wbsgxshp05tt1tif/branch/master?svg=true)](https://ci.appveyor.com/project/joerick/cibuildwheel/branch/master) [![CircleCI](https://circleci.com/gh/joerick/cibuildwheel.svg?style=svg)](https://circleci.com/gh/joerick/cibuildwheel)
[Documentation](https://cibuildwheel.readthedocs.org)
<!--intro-start-->
Python wheels are great. Building them across **Mac, Linux, Windows**, on **multiple versions of Python**, is not.
`cibuildwheel` is here to help. `cibuildwheel` runs on your CI server - currently it supports Travis CI and Appveyor - and it builds and tests your wheels across all of your platforms.
`cibuildwheel` is here to help. `cibuildwheel` runs on your CI server - currently it supports Azure Pipelines, Travis CI, AppVeyor, and CircleCI - and it builds and tests your wheels across all of your platforms.
**`cibuildwheel` is in beta**. It's brand new - I'd love for you to try it and help make it better!
What does it do?
----------------
| | macOS 10.6+ | manylinux i686 | manylinux x86_64 | Windows 32bit | Windows 64bit |
|---|---|---|---|---|---|
| Python 2.7 | ✅ | | ✅ | ✅ | ✅ |
| Python 3.3 | | ✅ | ✅ | ✅ | ✅ |
| Python 3.4 | ✅ | | ✅ | ✅ | ✅ |
| Python 3.5 | ✅ | | ✅ | ✅ | ✅ |
| Python 3.6 | ✅ | ✅ | ✅ | ✅ | ✅ |
| | macOS 10.6+ intel | macOS 10.9+ x86_64 | manylinux i686 | manylinux x86_64 | Windows 32bit | Windows 64bit |
|---|---|---|---|---|---|---|
| Python 2.7 | ✅ | | ✅ | ✅ | ✅¹ | ✅¹ |
| Python 3.5 | ✅ | | ✅ | ✅ | ✅ | ✅ |
| Python 3.6 | ✅ | | ✅ | ✅ | ✅ | ✅ |
| Python 3.7 | ✅ | | ✅ | ✅ | ✅ | ✅ |
| Python 3.8 | | ✅ | ✅ | ✅ | ✅ | ✅ |
- Builds manylinux, macOS and Windows (32 and 64bit) wheels using Travis CI and Appveyor
> ¹ Not supported on Travis
- Builds manylinux, macOS and Windows (32 and 64bit) wheels using Azure Pipelines, Travis CI, AppVeyor, and CircleCI
- Bundles shared library dependencies on Linux and macOS through [auditwheel](https://github.com/pypa/auditwheel) and [delocate](https://github.com/matthew-brett/delocate)
- Runs the library test suite against the wheel-installed version of your library
Usage
-----
`cibuildwheel` currently works on **Travis CI** to build Linux and Mac wheels, and **Appveyor** to build Windows wheels.
`cibuildwheel` currently works on **Travis CI** and **Azure Pipelines** to build wheels for all three supported platforms (Linux, macOS, Windows). On **CircleCI** Linux and macOS wheels can be built, and on **AppVeyor** Windows is supported.
`cibuildwheel` is not intended to run on your development machine. It will try to install packages globally; this is no good. Travis CI and Appveyor run their builds in isolated environments, so are ideal for this kind of script.
| | Linux | macOS | Windows |
|-----------------|-------|-------|---------|
| Azure Pipelines | ✅ | ✅ | ✅ |
| Travis CI | ✅ | ✅ | ✅ |
| AppVeyor | | | ✅ |
| CircleCI | ✅ | ✅ | |
### Minimal setup
`cibuildwheel` is not intended to run on your development machine. Because it uses system Python from Python.org it will try to install packages globally - not what you expect from a build tool! Instead, isolated CI services like Travis CI, CircleCI, Azure Pipelines and AppVeyor are ideal.
- Create a `.travis.yml` file in your repo.
<!--intro-end-->
```
matrix:
include:
- sudo: required
services:
- docker
- os: osx
Example setup
-------------
script:
- pip install cibuildwheel==0.1.3
- cibuildwheel --output-dir wheelhouse
```
To build manylinux and macOS wheels on Travis CI, and upload them to PyPI whenever you tag a version, you could use this `.travis.yml`:
Then setup a deployment method by following the [Travis CI deployment docs](https://docs.travis-ci.com/user/deployment/).
```yaml
language: python
- Create an `appveyor.yml` file in your repo.
matrix:
include:
# perform a linux build
- sudo: required
services:
- docker
env: PIP=pip
# and a mac build
- os: osx
language: generic
env: PIP=pip2
```
build_script:
- pip install cibuildwheel==0.1.3
- cibuildwheel --output-dir wheelhouse
artifacts:
- path: "wheelhouse\\*.whl"
name: Wheels
```
Appveyor will store the built wheels for you - you can access them from the project console. Alternatively, you may want to store them in the same place as the Travis CI build. See [Appveyor deployment docs](https://www.appveyor.com/docs/deployment/) for more info.
- Commit those files, enable building of your repo on Travis CI and Appveyor, and push.
env:
global:
- TWINE_USERNAME=joerick
# Note: TWINE_PASSWORD is set in Travis settings
All being well, you should get wheels delivered to you in a few minutes.
script:
- $PIP install cibuildwheel==1.0.0
> ⚠️ Got an error? Check the [checklist](#it-didnt-work) below.
# build the wheels, put them into './wheelhouse'
- cibuildwheel --output-dir wheelhouse
# if the release was tagged, upload them to PyPI
- |
if [[ $TRAVIS_TAG ]]; then
python -m pip install twine
python -m twine upload wheelhouse/*.whl
fi
```
For more information, including how to build on Appveyor, Azure, CircleCI, check out the [documentation](https://cibuildwheel.readthedocs.org).
Options
-------
```
usage: cibuildwheel [-h]
[--output-dir OUTPUT_DIR]
[--platform PLATFORM]
[project_dir]
Build wheels for all the platforms.
positional arguments:
project_dir Path to the project that you want wheels for.
Default: the current directory.
optional arguments:
-h, --help show this help message and exit
--platform {auto,linux,macos,windows}
Platform to build for. For "linux" you need docker
running, on Mac or Linux. For "macos", you need a Mac
machine, and note that this script is going to
automatically install MacPython on your system, so
don't run on your development machine. For "windows",
you need to run in Windows, and it will build and test
for all versions of Python at C:\PythonXX[-x64].
--output-dir OUTPUT_DIR
Destination folder for the wheels.
```
Most of the config is via environment variables. These go into `.travis.yml` and `appveyor.yml` nicely.
| Environment variable: `CIBW_PLATFORM` | Command line argument: `--platform`
| --- | ---
Options: `auto` `linux` `macos` `windows`
Default: `auto`
`auto` will auto-detect platform using environment variables, such as `TRAVIS_OS_NAME`/`APPVEYOR`.
For `linux` you need Docker running, on Mac or Linux. For `macos`, you need a Mac machine, and note that this script is going to automatically install MacPython on your system, so don't run on your development machine. For `windows`, you need to run in Windows, and it will build and test for all versions of Python at `C:\PythonXX[-x64]`.
| Environment variable: `CIBW_TEST_COMMAND`
| ---
Optional.
Shell command to run the tests. The project root should be included in the command as "{project}". The wheel will be installed automatically and available for import from the tests.
Example: `nosetests {project}/tests`
| Environment variable: `CIBW_TEST_REQUIRES`
| ---
Optional.
Space-separated list of dependencies required for running the tests.
Example: `pytest`
Example: `nose==1.3.7 moto==0.4.31`
| Environment variable: `CIBW_SKIP` | 🔶 coming soon 🔶
| --- | ---
Optional.
Space-separated list of builds to skip. Each build has an identifier like `cp27-linux_x86_64` or `cp34-macosx_10_6_intel` - you can list ones to skip here and `cibuildwheel` won't try to build them.
The format is `python_tag-platform_tag`. The tags are as defined in [PEP 0425](https://www.python.org/dev/peps/pep-0425/#details).
Python tags look like `cp27` `cp34` `cp35` `cp36`
Platform tags look like `macosx_10_6_intel` `linux_x86_64` `linux_i386` `win32` `win_amd64`
You can also use shell-style globbing syntax (as per `fnmatch`)
Example: `cp27-macosx_10_6_intel ` (don't build on Python 2 on Mac)
Example: `cp27-win*` (don't build on Python 2.7 on Windows)
Example: `cp34-*` (don't build on Python 3.4)
--
#### Example YML syntax
<table>
<tr><td><i>example .travis.yml environment variables</i><pre><code>env:
global:
- CIBW_TEST_REQUIRES=nose
- CIBW_TEST_COMMAND="nosetests {project}/tests"
</code></pre></td>
<td><i>example appveyor.yml environment variables</i><pre><code>environment:
global:
CIBW_TEST_REQUIRES: nose
CIBW_TEST_COMMAND: "nosetests {project}\\tests"
</code></pre></td>
</tr></table>
Delivering to PyPI
------------------
After you've built your wheels, you'll probably want to deliver them to PyPI.
### Manual method
On your development machine, do the following...
```bash
# Clear out your 'dist' folder.
rm -rf dist
# Make a source distribution
python setup.py sdist
# 🏃🏻
# Go and download your wheel files from wherever you put them. Put
# them all into the 'dist' folder.
# Upload using 'twine' (you may need to 'pip install twine')
twine upload dist/*
```
### Semi-automatic method using wheelhouse-uploader
Obviously, manual steps are for chumps, so we can automate this a little by using [wheelhouse-uploader](https://github.com/ogrisel/wheelhouse-uploader).
> Quick note from me - using S3 as a storage didn't work due to a [bug](https://issues.apache.org/jira/browse/LIBCLOUD-792) in libcloud. Feel free to use my fork of that package that fixes the bug `pip install https://github.com/joerick/libcloud/archive/v1.5.0-s3fix.zip`
It didn't work!
---------------
If your wheel didn't compile, check the list below for some debugging tips.
- A mistake in your config. To quickly test your config without doing a git push and waiting for your code to build on CI, you can run the Linux build in a Docker container. On Mac or Linux, with Docker running, try `cibuildwheel --platform linux`. You'll have to bring your config into the current environment first.
- Missing dependency. You might need to install something on the build machine. You can do this in `.travis.yml` or `appveyor.yml`, with apt-get, brew or whatever Windows uses :P . Given how the Linux build works, we'll probably have to build something into `cibuildwheel`. Let's chat about that over in the issues!
- Windows: missing C feature. The Windows C compiler doesn't support C language features invented after 1990, so you'll have to backport your C code to C90. For me, this mostly involved putting my variable declarations at the top of the function like an animal.
| | Option | Description |
|---|--------|-------------|
| **Build selection** | [`CIBW_PLATFORM`](https://cibuildwheel.readthedocs.io/en/stable/options/#platform) | Override the auto-detected target platform |
| | [`CIBW_BUILD`](https://cibuildwheel.readthedocs.io/en/stable/options/#build-skip) [`CIBW_SKIP`](https://cibuildwheel.readthedocs.io/en/stable/options/#build-skip) | Choose the Python versions to build |
| **Build environment** | [`CIBW_ENVIRONMENT`](https://cibuildwheel.readthedocs.io/en/stable/options/#environment) | Set environment variables needed during the build |
| | [`CIBW_BEFORE_BUILD`](https://cibuildwheel.readthedocs.io/en/stable/options/#before-build) | Execute a shell command preparing each wheel's build |
| | [`CIBW_MANYLINUX_X86_64_IMAGE`](https://cibuildwheel.readthedocs.io/en/stable/options/#manylinux-image) [`CIBW_MANYLINUX_I686_IMAGE`](https://cibuildwheel.readthedocs.io/en/stable/options/#manylinux-image) | Specify alternative manylinux docker images |
| **Testing** | [`CIBW_TEST_COMMAND`](https://cibuildwheel.readthedocs.io/en/stable/options/#test-command) | Execute a shell command to test all built wheels |
| | [`CIBW_TEST_REQUIRES`](https://cibuildwheel.readthedocs.io/en/stable/options/#test-requires) | Install Python dependencies before running the tests |
| | [`CIBW_TEST_EXTRAS`](https://cibuildwheel.readthedocs.io/en/stable/options/#test-extras) | Install your wheel for testing using extras_require |
| **Other** | [`CIBW_BUILD_VERBOSITY`](https://cibuildwheel.readthedocs.io/en/stable/options/#test-extras) | Increase/decrease the output of pip wheel |
Working examples
----------------
Here are some repos that use cibuildwheel.
Here are some repos that use cibuildwheel.
- [pyinstrument_cext](https://github.com/joerick/pyinstrument_cext)
- [websockets](https://github.com/aaugustin/websockets)
- [Parselmouth](https://github.com/YannickJadoul/Parselmouth)
- [python-admesh](https://github.com/admesh/python-admesh)
- [pybase64](https://github.com/mayeut/pybase64)
- [KDEpy](https://github.com/tommyod/KDEpy)
- [AutoPy](https://github.com/autopilot-rs/autopy)
- [apriltags2-ethz](https://github.com/safijari/apriltags2_ethz)
- [TgCrypto](https://github.com/pyrogram/tgcrypto)
- [Twisted](https://github.com/twisted/twisted)
> Add repo here! Send a PR.
> Add your repo here! Send a PR.
Legal note
----------
Since `cibuildwheel` runs the wheel through delocate or auditwheel, it will automatically bundle library dependencies. This is similar to static linking - it might have some licence implications. Check the license for any code you're pulling in to make sure that's allowed.
Since `cibuildwheel` runs the wheel through delocate or auditwheel, it might automatically bundle dynamically linked libraries from the build machine.
It helps ensure that the library can run without any dependencies outside of the pip toolchain.
This is similar to static linking, so it might have some licence implications. Check the license for any code you're pulling in to make sure that's allowed.
Changelog
=========
### 0.12.0
_29 September 2019_
- ✨ Add CIBW_TEST_EXTRAS option, to allow testing using extra_require
options. For example, set `CIBW_TEST_EXTRAS=test,qt` to make the wheel
installed with `pip install <wheel_file>[test,qt]`
- 🛠 Update Python from 3.7.2 to 3.7.4 on macOS
- 🛠 Update OpenSSL patch to 1.0.2t on macOS
### 0.11.1
_28 May 2019_
- 🐛 Fix missing file in the release tarball, that was causing problems with
Windows builds (#141)
### 0.11.0
_26 May 2019_
- ✨ Add support for building on Azure pipelines! This lets you build all
Linux, Mac and Windows wheels on one service, so it promises to be the
easiest to set up! Check out the quickstart in the docs, or
[cibuildwheel-azure-example](https://github.com/joerick/cibuildwheel-azure-example)
for an example project. (#126, #132)
- 🛠 Internal change - the end-to-end test projects format was updated, so we
can more precisely assert what should be produced for each one. (#136, #137).
### 0.10.2
_10 March 2019_
- 🛠 Revert temporary fix in macOS, that was working around a bug in pip 19 (#129)
- 🛠 Update Python to 2.7.16 on macOS
- 🛠 Update OpenSSL patch to 1.0.2r on macOS
### 0.10.1
_3 February 2019_
- 🐛 Fix build stalling on macOS (that was introduced in pip 19) (#122)
- 🐛 Fix "AttributeError: 'Popen' object has no attribute 'args'" on Python 2.7 for Linux builds (#108)
- 🛠 Update Python from 3.6.7, 3.7.1 to 3.6.8, 3.7.2 on macOS
- 🛠 Update openssl patch from 1.0.2p to 1.0.2q on macOS
- 🛠 Sorting build options dict items when printing preamble (#114)
### 0.10.0
_23 September 2018_
- ✨ Add `CIBW_BUILD` option, for specifying which specific builds to perform (#101)
- ✨ Add support for building Mac and Linux on CircleCI (#91, #97)
- 🛠 Improved support for building universal wheels (#95)
- 🛠 Ensure log output is unbuffered and therefore in the correct order (#92)
- 🛠 Improved error reporting for errors that occur inside a package's setup.py (#88)
- ⚠️ Removed support for Python 3.3 on Windows.
### 0.9.4
_29 July 2018_
- 🛠 CIBW_TEST_COMMAND now runs in a shell on Mac (as well as Linux) (#81)
### 0.9.3
_10 July 2018_
- 🛠 Update to Python 3.6.6 on macOS (#82)
- ✨ Add support for building Python 3.7 wheels on Windows (#76)
- ⚠️ Deprecated support for Python 3.3 on Windows.
### 0.9.2
_1 July 2018_
- 🛠 Update Python 3.7.0rc1 to 3.7.0 on macOS (#79)
### 0.9.1
_18 June 2018_
- 🛠 Removed the need to use `{python}` and `{pip}` in `CIBW_BEFORE_BUILD` statements, by ensuring the correct version is always on the path at `python` and `pip` instead. (#60)
- 🛠 We now patch the _ssl module on Python 3.4 and 3.5 so these versions can still make SSL web requests using TLS 1.2 while building. (#71)
### 0.9.0
_18 June 2018_
- ✨ Add support for Python 3.7 (#73)
### 0.8.0
_4 May 2018_
- ⚠️ Drop support for Python 3.3 on Linux (#67)
- 🐛 Fix TLS by updating setuptools (#69)
### 0.7.1
_2 April 2017_
- 🐛 macOS: Fix Pip bugs resulting from PyPI TLS 1.2 enforcement
- 🐛 macOS: Fix brew Python3 version problems in the CI
### 0.7.0
_7 January 2018_
- ✨ You can now specify a custom docker image using the `CIBW_MANYLINUX1_X86_64_IMAGE` and `CIBW_MANYLINUX1_I686_IMAGE` options. (#46)
- 🐛 Fixed a bug where cibuildwheel would download and build a package from PyPI(!) instead of building the package on the local machine. (#51)
### 0.6.0
_9 October 2017_
- ✨ On the Linux build, the host filesystem is now accessible via `/host` (#36)
- 🐛 Fixed a bug where setup.py scripts would run the wrong version of Python when running subprocesses on Linux (#35)
### 0.5.1
_10 September 2017_
- 🐛 Fixed a couple of bugs on Python 3.
- ✨ Added experimental support for Mac builds on [Bitrise.io](https://www.bitrise.io)
### 0.5.0
_7 September 2017_
-`CIBW_ENVIRONMENT` added. You can now set environment variables for each build, even within the Docker container on Linux. This is a big one! (#21)
-`CIBW_BEFORE_BUILD` now runs in a system shell on all platforms. You can now do things like `CIBW_BEFORE_BUILD="cmd1 && cmd2"`. (#32)
### 0.4.1
_14 August 2017_
- 🐛 Fixed a bug on Windows where subprocess' output was hidden (#23)
- 🐛 Fixed a bug on AppVeyor where logs would appear in the wrong order due to output buffering (#24, thanks @YannickJadoul!)
### 0.4.0
_23 July 2017_
- 🐛 Fixed a bug that was increasing the build time by building the wheel twice. This was a problem for large projects that have a long build time. If you're upgrading and you need the old behaviour, use `CIBW_BEFORE_BUILD={pip} install .`, or install exactly the dependencies you need in `CIBW_BEFORE_BUILD`. See #18.
### 0.3.0
_27 June 2017_
- ⚠️ Removed Python 2.6 support on Linux (#12)
### 0.2.1
_11 June 2017_
- 🛠 Changed the build process to install the package before building the wheel - this allows direct dependencies to be installed first (#9, thanks @tgarc!)
- ✨ Added Python 3 support for the main process, for systems where Python 3 is the default (#8, thanks @tgarc).
### 0.2.0
_13 April 2017_
- ✨ Added `CIBW_SKIP` option, letting users explicitly skip a build
- ✨ Added `CIBW_BEFORE_BUILD` option, letting users run a shell command before the build starts
### 0.1.3
_31 March 2017_
- 🌟 First public release!
Contributing
============
Wheel-building is pretty complex. I expect users to find many edge-cases - please help the rest of the community out by documenting these, adding features to support them, and reporting bugs.
For more info on how to contribute to cibuildwheel, see the [docs](https://cibuildwheel.readthedocs.io/en/latest/contributing/).
I plan to be pretty liberal in accepting pull requests, as long as they align with the design goals below.
Maintainers
-----------
`cibuildwheel` is indie open source. I'm not paid to work on this.
Design Goals
------------
- `cibuildwheel` should wrap the complexity of wheel building.
- The user interface to `cibuildwheel` is the build script (e.g. `.travis.yml`). Feature additions should not increase the complexity of this script.
- Options should be environment variables (these lend themselves better to YML config files). They should be prefixed with `CIBW_`.
- Options should be generalise to all platforms. If platform-specific options are required, they should be namespaced e.g. `CIBW_TEST_COMMAND_MACOS`
Other notes:
- The platforms are very similar, until they're not. I'd rather have straight-forward code than totally DRY code, so let's keep airy platfrom abstractions to a minimum.
- I might want to break the options into a shared config file one day, so that config is more easily shared. That has motivated some of the design decisions.
- Joe Rickerby [@joerick](https://github.com/joerick)
- Tomas Garcia [@tgarc](https://github.com/tgarc)
- Yannick Jadoul [@YannickJadoul](https://github.com/YannickJadoul)
- Matthieu Darbois [@mayeut](https://github.com/mayeut)
Credits
-------
`cibuildwheel` stands on the shoulders of giants. Massive props to-
`cibuildwheel` stands on the shoulders of giants.
- ⭐️ @matthew-brett for [matthew-brett/multibuild](http://github.com/matthew-brett/multibuild) and [matthew-brett/delocate](http://github.com/matthew-brett/delocate)
- @PyPA for the manylinux Docker images [pypa/manylinux](https://github.com/pypa/manylinux)
- @ogrisel for [wheelhouse-uploader](https://github.com/ogrisel/wheelhouse-uploader) and `run_with_env.cmd`
Massive props also to-
- @zfrenchee for [help debugging many issues](https://github.com/joerick/cibuildwheel/issues/2)
- @lelit for some great bug reports and [contributions](https://github.com/joerick/cibuildwheel/pull/73)
- @mayeut for a [phenomenal PR](https://github.com/joerick/cibuildwheel/pull/71) patching Python itself for better compatibility!
See also
--------
========
If you'd like to keep wheel building separate from the package itself, check out [astrofrog/autowheel](https://github.com/astrofrog/autowheel). It builds packages using cibuildwheel from source distributions on PyPI.
If `cibuildwheel` is too limited for your needs, consider [matthew-brett/multibuild](http://github.com/matthew-brett/multibuild). `multibuild` is a toolbox for building a wheel on various platforms. It can do a lot more than this project - it's used to build SciPy!
+9 -2
View File
@@ -1,3 +1,10 @@
environment:
matrix:
- PYTHON: "C:\\Python27\\python.exe"
- PYTHON: "C:\\Python35\\python.exe"
build_script:
- pip install .
- python ./run_tests.py
- "%PYTHON% -m pip install -r requirements-dev.txt"
# the '-u' flag is required so the output is in the correct order.
# See https://github.com/joerick/cibuildwheel/pull/24 for more info.
- "%PYTHON% -u ./bin/run_tests.py"
+33
View File
@@ -0,0 +1,33 @@
jobs:
- job: linux
pool: {vmImage: 'Ubuntu-18.04'}
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.8'
- bash: |
python -m pip install -r requirements-dev.txt
python ./bin/run_tests.py
- job: macos
pool: {vmImage: 'macOS-10.13'}
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.8'
- bash: |
python -m pip install -r requirements-dev.txt
python ./bin/run_tests.py
- job: windows
pool: {vmImage: 'vs2017-win2016'}
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.8'
- script: choco install vcpython27 -f -y
displayName: Install Visual C++ for Python 2.7
- bash: |
python -m pip install -r requirements-dev.txt
python ./bin/run_tests.py
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
cd "$(dirname "$0")"
cd ..
CIBW_PLATFORM=linux ./bin/run_test.py $1
+41
View File
@@ -0,0 +1,41 @@
#!/usr/bin/env python
from __future__ import print_function
import os, sys, subprocess, shutil
project_root = os.path.dirname(os.path.dirname(__file__))
test_utils_dir = os.path.join(project_root, 'test', 'shared')
def single_run(test_project):
# set up an environment that gives access to the test utils
env = os.environ.copy()
if 'PYTHONPATH' in env:
env['PYTHONPATH'] += os.pathsep + test_utils_dir
else:
env['PYTHONPATH'] = test_utils_dir
# run the test
subprocess.check_call(
[sys.executable, '-m', 'pytest', '-vv', os.path.join(test_project, 'cibuildwheel_test.py')],
env=env,
)
# clean up
if os.path.exists('wheelhouse'):
shutil.rmtree('wheelhouse')
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("test_project_dir")
args = parser.parse_args()
project_path = os.path.abspath(args.test_project_dir)
if not os.path.exists(project_path):
print('No test project not found.', file=sys.stderr)
exit(2)
single_run(project_path)
+29
View File
@@ -0,0 +1,29 @@
#!/usr/bin/env python
from __future__ import print_function
import os, sys, subprocess, shutil, json
from glob import glob
if __name__ == '__main__':
# move cwd to the project root
os.chdir(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
### run the unit tests
subprocess.check_call([sys.executable, '-m', 'pytest', 'unit_test'])
### run the integration tests
test_projects = sorted(glob('test/??_*'))
if len(test_projects) == 0:
print('No test projects found. Aborting.', file=sys.stderr)
exit(2)
print('Testing projects:', test_projects)
run_test_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'run_test.py')
for project_path in test_projects:
subprocess.check_call([sys.executable, run_test_path, project_path])
print('%d projects built successfully.' % len(test_projects))
+1
View File
@@ -0,0 +1 @@
__version__ = '1.0.0'
+206 -40
View File
@@ -1,7 +1,28 @@
from __future__ import print_function
import argparse, os, subprocess, sys
import argparse, os, subprocess, sys, textwrap
import cibuildwheel
import cibuildwheel.linux, cibuildwheel.windows, cibuildwheel.macos
from cibuildwheel.environment import parse_environment, EnvironmentParseError
from cibuildwheel.util import BuildSelector, Unbuffered
def get_option_from_environment(option_name, platform=None, default=None):
'''
Returns an option from the environment, optionally scoped by the platform.
Example:
get_option_from_environment('CIBW_COLOR', platform='macos')
This will return the value of CIBW_COLOR_MACOS if it exists, otherwise the value of
CIBW_COLOR.
'''
if platform:
option = os.environ.get('%s_%s' % (option_name, platform.upper()))
if option is not None:
return option
return os.environ.get(option_name, default)
from cibuildwheel import linux, windows, macos
def main():
parser = argparse.ArgumentParser(
@@ -27,65 +48,210 @@ def main():
help=('Path to the project that you want wheels for. Default: the current '
'directory.'))
parser.add_argument('--print-build-identifiers',
action='store_true',
help='Print the build identifiers matched by the current invocation and exit.')
args = parser.parse_args()
output_dir = args.output_dir
test_command = os.environ.get('CIBW_TEST_COMMAND', None)
test_requires = os.environ.get('CIBW_TEST_REQUIRES', '').split()
project_dir = args.project_dir
try:
project_setup_py = os.path.join(project_dir, 'setup.py')
package_name = subprocess.check_output([sys.executable, project_setup_py, '--name'])
except subprocess.CalledProcessError as err:
if not os.path.exists(project_setup_py):
print('cibuildwheel: Could not find setup.py at root of project', file=sys.stderr)
exit(2)
else:
print('cibuildwheel: Failed to get name of the package. Command was %s' % err.cmd,
file=sys.stderr)
exit(2)
package_name = package_name.strip()
if package_name == '' or package_name == 'UNKNOWN':
print('cibuildwheel: Invalid package name "%s". Check your setup.py' % package_name,
file=sys.stderr)
exit(2)
build_args = dict(
project_dir=project_dir,
package_name=package_name,
output_dir=output_dir,
test_command=test_command,
test_requires=test_requires
)
detect_obsolete_options()
if args.platform != 'auto':
platform = args.platform
else:
platform = None
if os.environ.get('TRAVIS_OS_NAME') == 'linux':
platform = 'linux'
elif os.environ.get('TRAVIS_OS_NAME') == 'osx':
platform = 'macos'
elif os.environ.get('TRAVIS_OS_NAME') == 'windows':
platform = 'windows'
elif 'APPVEYOR' in os.environ:
platform = 'windows'
else:
print('Unable to detect platform. cibuildwheel should run on your CI server, '
'Travis CI and Appveyor are supported. You can run on your development '
elif 'BITRISE_BUILD_NUMBER' in os.environ:
platform = 'macos'
elif os.environ.get('CIRCLECI'):
if sys.platform.startswith('linux'):
platform = 'linux'
elif sys.platform.startswith('darwin'):
platform = 'macos'
elif 'AZURE_HTTP_USER_AGENT' in os.environ:
if os.environ['AGENT_OS'] == 'Linux':
platform = 'linux'
elif os.environ['AGENT_OS'] == 'Darwin':
platform = 'macos'
elif os.environ['AGENT_OS'] == 'Windows_NT':
platform = 'windows'
if platform is None:
print('cibuildwheel: Unable to detect platform. cibuildwheel should run on your CI server, '
'Travis CI, AppVeyor, and CircleCI are supported. You can run on your development '
'machine using the --platform argument. Check --help output for more '
'information.',
file=sys.stderr)
exit(2)
output_dir = args.output_dir
test_command = get_option_from_environment('CIBW_TEST_COMMAND', platform=platform)
test_requires = get_option_from_environment('CIBW_TEST_REQUIRES', platform=platform, default='').split()
test_extras = get_option_from_environment('CIBW_TEST_EXTRAS', platform=platform, default='')
project_dir = args.project_dir
before_build = get_option_from_environment('CIBW_BEFORE_BUILD', platform=platform)
build_verbosity = get_option_from_environment('CIBW_BUILD_VERBOSITY', platform=platform, default='')
build_config, skip_config = os.environ.get('CIBW_BUILD', '*'), os.environ.get('CIBW_SKIP', '')
environment_config = get_option_from_environment('CIBW_ENVIRONMENT', platform=platform, default='')
if test_extras:
test_extras = '[{0}]'.format(test_extras)
try:
build_verbosity = min(3, max(-3, int(build_verbosity)))
except ValueError:
build_verbosity = 0
try:
environment = parse_environment(environment_config)
except (EnvironmentParseError, ValueError) as e:
print('cibuildwheel: Malformed environment option "%s"' % environment_config, file=sys.stderr)
import traceback
traceback.print_exc(None, sys.stderr)
exit(2)
build_selector = BuildSelector(build_config, skip_config)
# Add CIBUILDWHEEL environment variable
# This needs to be passed on to the docker container in linux.py
os.environ['CIBUILDWHEEL'] = '1'
if not os.path.exists(os.path.join(project_dir, 'setup.py')):
print('cibuildwheel: Could not find setup.py at root of project', file=sys.stderr)
exit(2)
if args.print_build_identifiers:
print_build_identifiers(platform, build_selector)
exit(0)
build_options = dict(
project_dir=project_dir,
output_dir=output_dir,
test_command=test_command,
test_requires=test_requires,
test_extras=test_extras,
before_build=before_build,
build_verbosity=build_verbosity,
build_selector=build_selector,
environment=environment,
)
if platform == 'linux':
linux.build(**build_args)
elif platform == 'windows':
windows.build(**build_args)
manylinux_x86_64_image = os.environ.get('CIBW_MANYLINUX_X86_64_IMAGE', 'manylinux2010')
manylinux_i686_image = os.environ.get('CIBW_MANYLINUX_I686_IMAGE', 'manylinux2010')
default_manylinux_images_x86_64 = {'manylinux1': 'quay.io/pypa/manylinux1_x86_64',
'manylinux2010': 'quay.io/pypa/manylinux2010_x86_64'}
default_manylinux_images_i686 = {'manylinux1': 'quay.io/pypa/manylinux1_i686',
'manylinux2010': 'quay.io/pypa/manylinux2010_i686'}
build_options.update(
manylinux_images={'x86_64': default_manylinux_images_x86_64.get(manylinux_x86_64_image) or manylinux_x86_64_image,
'i686': default_manylinux_images_i686.get(manylinux_i686_image) or manylinux_i686_image},
)
elif platform == 'macos':
macos.build(**build_args)
pass
elif platform == 'windows':
pass
# Python is buffering by default when running on the CI platforms, giving problems interleaving subprocess call output with unflushed calls to 'print'
sys.stdout = Unbuffered(sys.stdout)
print_preamble(platform, build_options)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
if platform == 'linux':
cibuildwheel.linux.build(**build_options)
elif platform == 'windows':
cibuildwheel.windows.build(**build_options)
elif platform == 'macos':
cibuildwheel.macos.build(**build_options)
else:
raise Exception('Unsupported platform')
def detect_obsolete_options():
# Check the old 'MANYLINUX1_*_IMAGE' options
for (deprecated, alternative) in [('CIBW_MANYLINUX1_X86_64_IMAGE', 'CIBW_MANYLINUX_X86_64_IMAGE'),
('CIBW_MANYLINUX1_I686_IMAGE', 'CIBW_MANYLINUX_I686_IMAGE')]:
if deprecated in os.environ:
print("'{}' has been deprecated, and will be removed in a future release. Use the option '{}' instead.".format(deprecated, alternative))
if alternative not in os.environ:
print("Using value of option '{}' as replacement for '{}'".format(deprecated, alternative))
os.environ[alternative] = os.environ[deprecated]
else:
print("Option '{}' is not empty. Please unset '{}'".format(alternative, deprecated))
exit(2)
# Check for 'manylinux1' in the 'CIBW_BUILD' and 'CIBW_SKIP' options
for deprecated in ['CIBW_BUILD', 'CIBW_SKIP']:
if deprecated in os.environ and 'manylinux1' in os.environ[deprecated]:
print("Build identifiers with 'manylinux1' been deprecated. Replacing all occurences of 'manylinux1' by 'manylinux' in the option '{}'".format(deprecated))
os.environ[deprecated] = os.environ[deprecated].replace('manylinux1', 'manylinux')
def print_preamble(platform, build_options):
print(textwrap.dedent('''
_ _ _ _ _ _ _
___|_| |_ _ _|_| |_| |_ _ _| |_ ___ ___| |
| _| | . | | | | | . | | | | | -_| -_| |
|___|_|___|___|_|_|___|_____|_|_|___|___|_|
'''))
print('cibuildwheel version %s\n' % cibuildwheel.__version__)
print('Build options:')
print(' platform: %r' % platform)
for option, value in sorted(build_options.items()):
print(' %s: %r' % (option, value))
warnings = detect_warnings(platform, build_options)
if warnings:
print('\nWarnings:')
for warning in warnings:
print(' ' + warning)
print('\nHere we go!\n')
def print_build_identifiers(platform, build_selector):
if platform == 'linux':
python_configurations = cibuildwheel.linux.get_python_configurations(build_selector)
elif platform == 'windows':
python_configurations = cibuildwheel.windows.get_python_configurations(build_selector)
elif platform == 'macos':
python_configurations = cibuildwheel.macos.get_python_configurations(build_selector)
else:
python_configurations = []
for config in python_configurations:
print(config.identifier)
def detect_warnings(platform, build_options):
warnings = []
# warn about deprecated {python} and {pip}
for option_name in ['test_command', 'before_build']:
option_value = build_options.get(option_name)
if option_value:
if '{python}' in option_value or '{pip}' in option_value:
warnings.append(option_name + ": '{python}' and '{pip}' are no longer needed, and will be removed in a future release. Simply use 'python' or 'pip' instead.")
return warnings
if __name__ == '__main__':
main()
+71
View File
@@ -0,0 +1,71 @@
import subprocess, shlex, sys
from collections import namedtuple
import bashlex
NodeExecutionContext = namedtuple('NodeExecutionContext', ['environment', 'input'])
def evaluate(value, environment):
if not value:
# empty string evaluates to empty string
# (but trips up bashlex)
return ''
command_node = bashlex.parsesingle(value)
if len(command_node.parts) != 1:
raise ValueError('"%s" has too many parts' % value)
value_word_node = command_node.parts[0]
return evaluate_node(
value_word_node,
context=NodeExecutionContext(environment=environment, input=value)
)
def evaluate_node(node, context):
if node.kind == 'word':
return evaluate_word_node(node, context=context)
elif node.kind == 'commandsubstitution':
return evaluate_command_node(node.command, context=context)
elif node.kind == 'parameter':
return evaluate_parameter_node(node, context=context)
else:
raise ValueError('Unsupported bash construct: "%s"' % node.word)
def evaluate_word_node(node, context):
word_start = node.pos[0]
word_end = node.pos[1]
word_string = context.input[word_start:word_end]
letters = list(word_string)
for part in node.parts:
part_start = part.pos[0] - word_start
part_end = part.pos[1] - word_start
# Set all the characters in the part to None
for i in range(part_start, part_end):
letters[i] = None
letters[part_start] = evaluate_node(part, context=context)
# remove the None letters and concat
value = ''.join(l for l in letters if l is not None)
# apply bash-like quotes/whitespace treatment
return ' '.join(word.strip() for word in shlex.split(value))
def evaluate_command_node(node, context):
words = [evaluate_node(part, context=context) for part in node.parts]
command = ' '.join(words)
output = subprocess.check_output(shlex.split(command), env=context.environment)
if sys.version_info[0] >= 3:
return output.decode('utf8', 'replace')
else:
return output
def evaluate_parameter_node(node, context):
return context.environment.get(node.value, '')
+80
View File
@@ -0,0 +1,80 @@
import bashlex
from . import bashlex_eval
class EnvironmentParseError(Exception):
pass
def parse_environment(env_string):
env_items = split_env_items(env_string)
assignments = [EnvironmentAssignment(item) for item in env_items]
return ParsedEnvironment(assignments=assignments)
def split_env_items(env_string):
'''Splits space-separated variable assignments into a list of individual assignments.
>>> split_env_items('VAR=abc')
['VAR=abc']
>>> split_env_items('VAR="a string" THING=3')
['VAR="a string"', 'THING=3']
>>> split_env_items('VAR="a string" THING=\\'single "quotes"\\'')
['VAR="a string"', 'THING=\\'single "quotes"\\'']
>>> split_env_items('VAR="dont \\\\"forget\\\\" about backslashes"')
['VAR="dont \\\\"forget\\\\" about backslashes"']
>>> split_env_items('PATH="$PATH;/opt/cibw_test_path"')
['PATH="$PATH;/opt/cibw_test_path"']
>>> split_env_items('PATH2="something with spaces"')
['PATH2="something with spaces"']
'''
if not env_string:
return []
command_node = bashlex.parsesingle(env_string)
result = []
for word_node in command_node.parts:
part_string = env_string[word_node.pos[0]:word_node.pos[1]]
result.append(part_string)
return result
class EnvironmentAssignment(object):
def __init__(self, assignment):
name, equals, value = assignment.partition('=')
if not equals:
raise EnvironmentParseError(assignment)
self.name = name
self.value = value
def evaluated_value(self, environment):
'''Returns the value of this assignment, as evaluated in the environment'''
return bashlex_eval.evaluate(self.value, environment=environment)
def as_shell_assignment(self):
return 'export %s=%s' % (self.name, self.value)
def __repr__(self):
return '%s=%s' % (self.name, self.value)
class ParsedEnvironment(object):
def __init__(self, assignments):
self.assignments = assignments
def as_dictionary(self, prev_environment):
environment = prev_environment.copy()
for assignment in self.assignments:
value = assignment.evaluated_value(environment=environment)
environment[assignment.name] = value
return environment
def as_shell_commands(self):
return [a.as_shell_assignment() for a in self.assignments]
def __repr__(self):
return 'ParsedEnvironment(%r)' % [repr(a) for a in self.assignments]
+153 -34
View File
@@ -1,5 +1,7 @@
from __future__ import print_function
import os, subprocess
import os, subprocess, sys, uuid
from collections import namedtuple
from .util import prepare_command, get_build_verbosity_extra_flags
try:
from shlex import quote as shlex_quote
@@ -7,54 +9,171 @@ except ImportError:
from pipes import quote as shlex_quote
def build(project_dir, package_name, output_dir, test_command, test_requires):
for docker_image in ['quay.io/pypa/manylinux1_x86_64', 'quay.io/pypa/manylinux1_i686']:
def get_python_configurations(build_selector):
PythonConfiguration = namedtuple('PythonConfiguration', ['identifier', 'path'])
python_configurations = [
PythonConfiguration(identifier='cp27-manylinux_x86_64', path='/opt/python/cp27-cp27m'),
PythonConfiguration(identifier='cp27-manylinux_x86_64', path='/opt/python/cp27-cp27mu'),
PythonConfiguration(identifier='cp35-manylinux_x86_64', path='/opt/python/cp35-cp35m'),
PythonConfiguration(identifier='cp36-manylinux_x86_64', path='/opt/python/cp36-cp36m'),
PythonConfiguration(identifier='cp37-manylinux_x86_64', path='/opt/python/cp37-cp37m'),
PythonConfiguration(identifier='cp38-manylinux_x86_64', path='/opt/python/cp38-cp38'),
PythonConfiguration(identifier='cp27-manylinux_i686', path='/opt/python/cp27-cp27m'),
PythonConfiguration(identifier='cp27-manylinux_i686', path='/opt/python/cp27-cp27mu'),
PythonConfiguration(identifier='cp35-manylinux_i686', path='/opt/python/cp35-cp35m'),
PythonConfiguration(identifier='cp36-manylinux_i686', path='/opt/python/cp36-cp36m'),
PythonConfiguration(identifier='cp37-manylinux_i686', path='/opt/python/cp37-cp37m'),
PythonConfiguration(identifier='cp38-manylinux_i686', path='/opt/python/cp38-cp38'),
]
# skip builds as required
return [c for c in python_configurations if build_selector(c.identifier)]
def build(project_dir, output_dir, test_command, test_requires, test_extras, before_build, build_verbosity, build_selector, environment, manylinux_images):
try:
subprocess.check_call(['docker', '--version'])
except:
print('cibuildwheel: Docker not found. Docker is required to run Linux builds. '
'If you\'re building on Travis CI, add `services: [docker]` to your .travis.yml.'
'If you\'re building on Circle CI in Linux, add a `setup_remote_docker` step to your .circleci/config.yml',
file=sys.stderr)
exit(2)
python_configurations = get_python_configurations(build_selector)
platforms = [
('manylinux_x86_64', manylinux_images['x86_64']),
('manylinux_i686', manylinux_images['i686']),
]
for platform_tag, docker_image in platforms:
platform_configs = [c for c in python_configurations if c.identifier.endswith(platform_tag)]
if not platform_configs:
continue
bash_script = '''
set -o errexit
set -o xtrace
mkdir /output
cd /project
for PYBIN in /opt/python/*/bin; do
"$PYBIN/pip" wheel . -w /tmp/linux_wheels
done
{environment_exports}
for whl in /tmp/linux_wheels/*.whl; do
auditwheel repair "$whl" -w /output
done
for PYBIN in {pybin_paths}; do
# Setup
rm -rf /tmp/built_wheel
rm -rf /tmp/delocated_wheels
mkdir /tmp/built_wheel
mkdir /tmp/delocated_wheels
# Install packages and test
for PYBIN in /opt/python/*/bin/; do
# Install the wheel we just built
"$PYBIN/pip" install {package_name} --no-index -f /output
# Install any requirements to run the tests
if [ ! -z "{test_requires}" ]; then
"$PYBIN/pip" install {test_requires}
if [ ! -z {before_build} ]; then
PATH="$PYBIN:$PATH" sh -c {before_build}
fi
# Run the tests from a different directory
# Build that wheel
PATH="$PYBIN:$PATH" "$PYBIN/pip" wheel . -w /tmp/built_wheel --no-deps {build_verbosity_flag}
built_wheel=(/tmp/built_wheel/*.whl)
# Delocate the wheel
# NOTE: 'built_wheel' here is a bash array of glob matches; "$built_wheel" returns
# the first element
if [[ "$built_wheel" == *none-any.whl ]]; then
# pure python wheel - just copy
mv "$built_wheel" /tmp/delocated_wheels
else
auditwheel repair "$built_wheel" -w /tmp/delocated_wheels
fi
delocated_wheels=(/tmp/delocated_wheels/*.whl)
if [ ! -z {test_command} ]; then
(cd "$HOME" && export PATH=$PYBIN:$PATH && sh -c {test_command})
# Set up a virtual environment to install and test from, to make sure
# there are no dependencies that were pulled in at build time.
"$PYBIN/pip" install virtualenv
venv_dir=`mktemp -d`/venv
"$PYBIN/python" -m virtualenv "$venv_dir"
# run the tests in a subshell to keep that `activate`
# script from polluting the env
(
source "$venv_dir/bin/activate"
echo "Running tests using `which python`"
# Install the wheel we just built
# Note: If auditwheel produced two wheels, it's because the earlier produced wheel
# conforms to multiple manylinux standards. These multiple versions of the wheel are
# functionally the same, differing only in name, wheel metadata, and possibly include
# different external shared libraries. so it doesn't matter which one we run the tests on.
# Let's just pick the first one.
pip install "${{delocated_wheels[0]}}"{test_extras}
# Install any requirements to run the tests
if [ ! -z "{test_requires}" ]; then
pip install {test_requires}
fi
# Run the tests from a different directory
pushd $HOME
sh -c {test_command}
popd
)
# exit if tests failed (needed for older bash versions)
if [ $? -ne 0 ]; then
exit 1;
fi
# clean up
rm -rf "$venv_dir"
fi
# we're all done here; move it to output
mv "${{delocated_wheels[@]}}" /output
for delocated_wheel in "${{delocated_wheels[@]}}"; do chown {uid}:{gid} "/output/$(basename "$delocated_wheel")"; done
done
'''.format(
package_name=package_name,
pybin_paths=' '.join(c.path+'/bin' for c in platform_configs),
test_requires=' '.join(test_requires),
test_command=shlex_quote(test_command.format(project='/project') if test_command else ''),
test_extras=test_extras,
test_command=shlex_quote(
prepare_command(test_command, project='/project') if test_command else ''
),
before_build=shlex_quote(
prepare_command(before_build, project='/project') if before_build else ''
),
build_verbosity_flag=' '.join(get_build_verbosity_extra_flags(build_verbosity)),
environment_exports='\n'.join(environment.as_shell_commands()),
uid=os.getuid(),
gid=os.getgid(),
)
docker_process = subprocess.Popen([
'docker',
'run',
'--rm',
'-i',
'-v', '%s:/project' % os.path.abspath(project_dir),
'-v', '%s:/output' % os.path.abspath(output_dir),
docker_image,
'/bin/bash'],
stdin=subprocess.PIPE)
def run_docker(command, stdin_str=None):
print('docker command: docker {}'.format(' '.join(map(shlex_quote, command))))
if stdin_str is None:
subprocess.check_call(['docker'] + command)
else:
args = ['docker'] + command
process = subprocess.Popen(args, stdin=subprocess.PIPE, universal_newlines=True)
try:
process.communicate(stdin_str)
except KeyboardInterrupt:
process.kill()
process.wait()
if process.returncode != 0:
raise subprocess.CalledProcessError(process.returncode, args)
docker_process.communicate(bash_script)
if docker_process.returncode != 0:
container_name = 'cibuildwheel-{}'.format(uuid.uuid4())
try:
run_docker(['create',
'--env', 'CIBUILDWHEEL',
'--name', container_name,
'-i',
'-v', '/:/host', # ignored on Circle
docker_image, '/bin/bash'])
run_docker(['cp', os.path.abspath(project_dir) + '/.', container_name + ':/project'])
run_docker(['start', '-i', '-a', container_name], stdin_str=bash_script)
run_docker(['cp', container_name + ':/output/.', os.path.abspath(output_dir)])
except subprocess.CalledProcessError:
exit(1)
finally:
# Still gets executed, even when 'exit(1)' gets called
run_docker(['rm', '--force', '-v', container_name])
+129 -40
View File
@@ -1,5 +1,6 @@
from __future__ import print_function
import os, subprocess, shlex
import tempfile
import os, subprocess, shlex, sys, shutil
from collections import namedtuple
from glob import glob
try:
@@ -7,66 +8,154 @@ try:
except ImportError:
from pipes import quote as shlex_quote
from .util import prepare_command, get_build_verbosity_extra_flags
def build(project_dir, package_name, output_dir, test_command, test_requires):
PythonConfiguration = namedtuple('PythonConfiguration', ['version', 'url'])
def get_python_configurations(build_selector):
PythonConfiguration = namedtuple('PythonConfiguration', ['version', 'identifier', 'url'])
python_configurations = [
PythonConfiguration(version='2.7', url='https://www.python.org/ftp/python/2.7.13/python-2.7.13-macosx10.6.pkg'),
PythonConfiguration(version='3.4', url='https://www.python.org/ftp/python/3.4.4/python-3.4.4-macosx10.6.pkg'),
PythonConfiguration(version='3.5', url='https://www.python.org/ftp/python/3.5.3/python-3.5.3-macosx10.6.pkg'),
PythonConfiguration(version='3.6', url='https://www.python.org/ftp/python/3.6.0/python-3.6.0-macosx10.6.pkg'),
PythonConfiguration(version='2.7', identifier='cp27-macosx_10_6_intel', url='https://www.python.org/ftp/python/2.7.17/python-2.7.17-macosx10.6.pkg'),
PythonConfiguration(version='3.5', identifier='cp35-macosx_10_6_intel', url='https://www.python.org/ftp/python/3.5.4/python-3.5.4-macosx10.6.pkg'),
PythonConfiguration(version='3.6', identifier='cp36-macosx_10_6_intel', url='https://www.python.org/ftp/python/3.6.8/python-3.6.8-macosx10.6.pkg'),
PythonConfiguration(version='3.7', identifier='cp37-macosx_10_6_intel', url='https://www.python.org/ftp/python/3.7.5/python-3.7.5-macosx10.6.pkg'),
PythonConfiguration(version='3.8', identifier='cp38-macosx_10_9_x86_64', url='https://www.python.org/ftp/python/3.8.0/python-3.8.0-macosx10.9.pkg'),
]
def shell(args, env=None, cwd=None):
# skip builds as required
return [c for c in python_configurations if build_selector(c.identifier)]
def build(project_dir, output_dir, test_command, test_requires, test_extras, before_build, build_verbosity, build_selector, environment):
python_configurations = get_python_configurations(build_selector)
get_pip_url = 'https://bootstrap.pypa.io/get-pip.py'
get_pip_script = '/tmp/get-pip.py'
pkgs_output = subprocess.check_output(['pkgutil', '--pkgs'])
if sys.version_info[0] >= 3:
pkgs_output = pkgs_output.decode('utf8')
installed_system_packages = pkgs_output.splitlines()
def call(args, env=None, cwd=None, shell=False):
# print the command executing for the logs
print('+ ' + ' '.join(shlex_quote(a) for a in args))
return subprocess.check_call(args, env=env, cwd=cwd)
if shell:
print('+ %s' % args)
else:
print('+ ' + ' '.join(shlex_quote(a) for a in args))
return subprocess.check_call(args, env=env, cwd=cwd, shell=shell)
abs_project_dir = os.path.abspath(project_dir)
# get latest pip once and for all
call(['curl', '-L', '-o', get_pip_script, get_pip_url])
for config in python_configurations:
# download the pkg
shell(['curl', '-L', '-o', '/tmp/Python.pkg', config.url])
# install
shell(['sudo', 'installer', '-pkg', '/tmp/Python.pkg', '-target', '/'])
# if this version of python isn't installed, get it from python.org and install
python_package_identifier = 'org.python.Python.PythonFramework-%s' % config.version
if python_package_identifier not in installed_system_packages:
# download the pkg
call(['curl', '-L', '-o', '/tmp/Python.pkg', config.url])
# install
call(['sudo', 'installer', '-pkg', '/tmp/Python.pkg', '-target', '/'])
# patch open ssl
if config.version == '3.5':
call(['curl', '-fsSLo', '/tmp/python-patch.tar.gz', 'https://github.com/mayeut/patch-macos-python-openssl/releases/download/v1.0.2t/patch-macos-python-%s-openssl-v1.0.2t.tar.gz' % config.version])
call(['sudo', 'tar', '-C', '/Library/Frameworks/Python.framework/Versions/%s/' % config.version, '-xmf', '/tmp/python-patch.tar.gz'])
installation_bin_path = '/Library/Frameworks/Python.framework/Versions/{}/bin'.format(config.version)
# Python bin folders on Mac don't symlink python3 to python, so we do that
# so `python` and `pip` always point to the active configuration.
if os.path.exists('/tmp/cibw_bin'):
shutil.rmtree('/tmp/cibw_bin')
os.makedirs('/tmp/cibw_bin')
if config.version[0] == '3':
os.symlink(os.path.join(installation_bin_path, 'python3'), '/tmp/cibw_bin/python')
os.symlink(os.path.join(installation_bin_path, 'python3-config'), '/tmp/cibw_bin/python-config')
os.symlink(os.path.join(installation_bin_path, 'pip3'), '/tmp/cibw_bin/pip')
env = os.environ.copy()
env['PATH'] = os.pathsep.join([
'/Library/Frameworks/Python.framework/Versions/%s/bin' % config.version,
'/tmp/cibw_bin',
installation_bin_path,
env['PATH'],
])
python = 'python3' if config.version[0] == '3' else 'python2'
pip = 'pip3' if config.version[0] == '3' else 'pip2'
env = environment.as_dictionary(prev_environment=env)
# check what version we're on
shell(['which', python], env=env)
shell([python, '--version'], env=env)
call(['which', 'python'], env=env)
call(['python', '--version'], env=env)
# install pip & wheel
shell([python, '-m', 'ensurepip', '--upgrade'], env=env)
shell([pip, '--version'])
shell([pip, 'install', 'wheel'], env=env)
shell([pip, 'install', 'delocate'], env=env)
call(['python', get_pip_script, '--no-setuptools', '--no-wheel'], env=env)
call(['pip', '--version'], env=env)
call(['pip', 'install', '--upgrade', 'setuptools'], env=env)
call(['pip', 'install', 'wheel'], env=env)
call(['pip', 'install', 'delocate'], env=env)
# build the wheel to temp dir
temp_wheel_dir = '/tmp/tmpwheel%s' % config.version
shell([pip, 'wheel', project_dir, '-w', temp_wheel_dir], env=env)
temp_wheel = glob(temp_wheel_dir+'/*.whl')[0]
# setup dirs
if os.path.exists('/tmp/built_wheel'):
shutil.rmtree('/tmp/built_wheel')
os.makedirs('/tmp/built_wheel')
if os.path.exists('/tmp/delocated_wheel'):
shutil.rmtree('/tmp/delocated_wheel')
os.makedirs('/tmp/delocated_wheel')
# list the dependencies
shell(['delocate-listdeps', temp_wheel], env=env)
# rebuild the wheel with shared libraries included and place in output dir
shell(['delocate-wheel', '-w', output_dir, temp_wheel], env=env)
# run the before_build command
if before_build:
before_build_prepared = prepare_command(before_build, project=abs_project_dir)
call(before_build_prepared, env=env, shell=True)
# install the wheel
shell([pip, 'install', package_name, '--no-index', '--find-links', output_dir], env=env)
# build the wheel
call(['pip', 'wheel', abs_project_dir, '-w', '/tmp/built_wheel', '--no-deps'] + get_build_verbosity_extra_flags(build_verbosity), env=env)
built_wheel = glob('/tmp/built_wheel/*.whl')[0]
if built_wheel.endswith('none-any.whl'):
# pure python wheel - just move
shutil.move(built_wheel, '/tmp/delocated_wheel')
else:
# list the dependencies
call(['delocate-listdeps', built_wheel], env=env)
# rebuild the wheel with shared libraries included and place in output dir
call(['delocate-wheel', '-w', '/tmp/delocated_wheel', built_wheel], env=env)
delocated_wheel = glob('/tmp/delocated_wheel/*.whl')[0]
# test the wheel
if test_requires:
shell([pip, 'install'] + test_requires, env=env)
if test_command:
# set up a virtual environment to install and test from, to make sure
# there are no dependencies that were pulled in at build time.
call(['pip', 'install', 'virtualenv'], env=env)
venv_dir = tempfile.mkdtemp()
call(['python', '-m', 'virtualenv', venv_dir], env=env)
virtualenv_env = env.copy()
virtualenv_env['PATH'] = os.pathsep.join([
os.path.join(venv_dir, 'bin'),
virtualenv_env['PATH'],
])
# Fix some weird issue with the shebang of installed scripts
# See https://github.com/theacodes/nox/issues/44 and https://github.com/pypa/virtualenv/issues/620
virtualenv_env.pop('__PYVENV_LAUNCHER__', None)
# check that we are using the Python from the virtual environment
call(['which', 'python'], env=virtualenv_env)
# install the wheel
call(['pip', 'install', delocated_wheel + test_extras], env=virtualenv_env)
# test the wheel
if test_requires:
call(['pip', 'install'] + test_requires, env=virtualenv_env)
# run the tests from $HOME, with an absolute path in the command
# (this ensures that Python runs the tests against the installed wheel
# and not the repo code)
abs_project_dir = os.path.abspath(project_dir)
test_command_absolute = test_command.format(project=abs_project_dir)
shell(shlex.split(test_command_absolute), cwd=os.environ['HOME'], env=env)
test_command_prepared = prepare_command(test_command, project=abs_project_dir)
call(test_command_prepared, cwd=os.environ['HOME'], env=virtualenv_env, shell=True)
# clean up
shutil.rmtree(venv_dir)
# we're all done here; move it to output (overwrite existing)
dst = os.path.join(output_dir, os.path.basename(delocated_wheel))
shutil.move(delocated_wheel, dst)
@@ -0,0 +1,88 @@
:: To build extensions for 64 bit Python 3, we need to configure environment
:: variables to use the MSVC 2010 C++ compilers from GRMSDKX_EN_DVD.iso of:
:: MS Windows SDK for Windows 7 and .NET Framework 4 (SDK v7.1)
::
:: To build extensions for 64 bit Python 2, we need to configure environment
:: variables to use the MSVC 2008 C++ compilers from GRMSDKX_EN_DVD.iso of:
:: MS Windows SDK for Windows 7 and .NET Framework 3.5 (SDK v7.0)
::
:: 32 bit builds, and 64-bit builds for 3.5 and beyond, do not require specific
:: environment configurations.
::
:: Note: this script needs to be run with the /E:ON and /V:ON flags for the
:: cmd interpreter, at least for (SDK v7.0)
::
:: More details at:
:: https://github.com/cython/cython/wiki/64BitCythonExtensionsOnWindows
:: http://stackoverflow.com/a/13751649/163740
::
:: Author: Olivier Grisel
:: License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/
::
:: Notes about batch files for Python people:
::
:: Quotes in values are literally part of the values:
:: SET FOO="bar"
:: FOO is now five characters long: " b a r "
:: If you don't want quotes, don't include them on the right-hand side.
::
:: The CALL lines at the end of this file look redundant, but if you move them
:: outside of the IF clauses, they do not run properly in the SET_SDK_64==Y
:: case, I don't know why.
@ECHO OFF
SET COMMAND_TO_RUN=%*
SET WIN_SDK_ROOT=C:\Program Files\Microsoft SDKs\Windows
SET WIN_WDK=c:\Program Files (x86)\Windows Kits\10\Include\wdf
:: Extract the major and minor versions, and allow for the minor version to be
:: more than 9. This requires the version number to have two dots in it.
SET MAJOR_PYTHON_VERSION=%PYTHON_VERSION:~0,1%
IF "%PYTHON_VERSION:~3,1%" == "." (
SET MINOR_PYTHON_VERSION=%PYTHON_VERSION:~2,1%
) ELSE (
SET MINOR_PYTHON_VERSION=%PYTHON_VERSION:~2,2%
)
:: Based on the Python version, determine what SDK version to use, and whether
:: to set the SDK for 64-bit.
IF %MAJOR_PYTHON_VERSION% == 2 (
SET WINDOWS_SDK_VERSION="v7.0"
SET SET_SDK_64=Y
) ELSE (
IF %MAJOR_PYTHON_VERSION% == 3 (
SET WINDOWS_SDK_VERSION="v7.1"
IF %MINOR_PYTHON_VERSION% LEQ 4 (
SET SET_SDK_64=Y
) ELSE (
SET SET_SDK_64=N
IF EXIST "%WIN_WDK%" (
:: See: https://connect.microsoft.com/VisualStudio/feedback/details/1610302/
REN "%WIN_WDK%" 0wdf
)
)
) ELSE (
ECHO Unsupported Python version: "%MAJOR_PYTHON_VERSION%"
EXIT 1
)
)
IF %PYTHON_ARCH% == 64 (
IF %SET_SDK_64% == Y (
ECHO Configuring Windows SDK %WINDOWS_SDK_VERSION% for Python %MAJOR_PYTHON_VERSION% on a 64 bit architecture
SET DISTUTILS_USE_SDK=1
SET MSSdk=1
"%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Setup\WindowsSdkVer.exe" -q -version:%WINDOWS_SDK_VERSION%
"%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Bin\SetEnv.cmd" /x64 /release
ECHO Executing: %COMMAND_TO_RUN%
call %COMMAND_TO_RUN% || EXIT 1
) ELSE (
ECHO Using default MSVC build environment for 64 bit architecture
ECHO Executing: %COMMAND_TO_RUN%
call %COMMAND_TO_RUN% || EXIT 1
)
) ELSE (
ECHO Using default MSVC build environment for 32 bit architecture
ECHO Executing: %COMMAND_TO_RUN%
call %COMMAND_TO_RUN% || EXIT 1
)
+52
View File
@@ -0,0 +1,52 @@
from fnmatch import fnmatch
import warnings
def prepare_command(command, project):
'''
Preprocesses a command by expanding variables like {project}.
For example, used in the test_command option, to specify the path to the
tests directory.
'''
return command.format(python='python', pip='pip', project=project)
def get_build_verbosity_extra_flags(level):
if level > 0:
return ['-' + level * 'v']
elif level < 0:
return ['-' + -level * 'q']
else:
return []
class BuildSelector(object):
def __init__(self, build_config, skip_config):
self.build_patterns = build_config.split()
self.skip_patterns = skip_config.split()
def __call__(self, build_id):
def match_any(patterns):
return any(fnmatch(build_id, pattern) for pattern in patterns)
return match_any(self.build_patterns) and not match_any(self.skip_patterns)
def __repr__(self):
return 'BuildSelector({!r} - {!r})'.format(' '.join(self.build_patterns), ' '.join(self.skip_patterns))
# Taken from https://stackoverflow.com/a/107717
class Unbuffered(object):
def __init__(self, stream):
self.stream = stream
def write(self, data):
self.stream.write(data)
self.stream.flush()
def writelines(self, datas):
self.stream.writelines(datas)
self.stream.flush()
def __getattr__(self, attr):
return getattr(self.stream, attr)
+151 -38
View File
@@ -1,69 +1,182 @@
from __future__ import print_function
import os, tempfile, subprocess, urllib2
import os, tempfile, subprocess, shutil, sys
from collections import namedtuple
from glob import glob
try:
from shlex import quote as shlex_quote
except ImportError:
from pipes import quote as shlex_quote
try:
from urllib.request import urlopen
except ImportError:
from urllib2 import urlopen
from .util import prepare_command, get_build_verbosity_extra_flags
def build(project_dir, package_name, output_dir, test_command, test_requires):
# run_with_env is a cmd file that sets the right environment variables to
run_with_env = os.path.join(tempfile.gettempdir(), 'appveyor_run_with_env.cmd')
if not os.path.exists(run_with_env):
with open(run_with_env, 'wb') as f:
request = urllib2.urlopen('https://github.com/ogrisel/python-appveyor-demo/raw/09a1c8672e5015a74d8f69d07add6ee803c176ec/appveyor/run_with_env.cmd')
f.write(request.read())
IS_RUNNING_ON_AZURE = os.path.exists('C:\\hostedtoolcache')
IS_RUNNING_ON_TRAVIS = os.environ.get('TRAVIS_OS_NAME') == 'windows'
def shell(args, env=None, cwd=None):
# print the command executing for the logs
print('+ ' + ' '.join(args))
args = ['cmd', '/E:ON', '/V:ON', '/C', run_with_env] + args
return subprocess.check_call(' '.join(args), env=env, cwd=cwd)
PythonConfiguration = namedtuple('PythonConfiguration', ['version', 'arch', 'path'])
def get_python_path(config):
nuget_args = get_nuget_args(config)
return os.path.join(nuget_args[-1], nuget_args[0] + "." + config.version, "tools")
def get_nuget_args(configuration):
python_name = "python" if configuration.version[0] == '3' else "python2"
if configuration.arch == "32":
python_name = python_name + "x86"
return [python_name, "-Version", configuration.version, "-OutputDirectory", "C:/cibw/python"]
def get_python_configurations(build_selector):
PythonConfiguration = namedtuple('PythonConfiguration', ['version', 'arch', 'identifier'])
python_configurations = [
PythonConfiguration(version='2.7.x', arch="32", path='C:\Python27'),
PythonConfiguration(version='2.7.x', arch="64", path='C:\Python27-x64'),
PythonConfiguration(version='3.3.x', arch="32", path='C:\Python33'),
PythonConfiguration(version='3.3.x', arch="64", path='C:\Python33-x64'),
PythonConfiguration(version='3.4.x', arch="32", path='C:\Python34'),
PythonConfiguration(version='3.4.x', arch="64", path='C:\Python34-x64'),
PythonConfiguration(version='3.5.x', arch="32", path='C:\Python35'),
PythonConfiguration(version='3.5.x', arch="64", path='C:\Python35-x64'),
PythonConfiguration(version='3.6.x', arch="32", path='C:\Python36'),
PythonConfiguration(version='3.6.x', arch="64", path='C:\Python36-x64'),
PythonConfiguration(version='2.7.17', arch="32", identifier='cp27-win32'),
PythonConfiguration(version='2.7.17', arch="64", identifier='cp27-win_amd64'),
PythonConfiguration(version='3.5.4', arch="32", identifier='cp35-win32'),
PythonConfiguration(version='3.5.4', arch="64", identifier='cp35-win_amd64'),
PythonConfiguration(version='3.6.8', arch="32", identifier='cp36-win32'),
PythonConfiguration(version='3.6.8', arch="64", identifier='cp36-win_amd64'),
PythonConfiguration(version='3.7.5', arch="32", identifier='cp37-win32'),
PythonConfiguration(version='3.7.5', arch="64", identifier='cp37-win_amd64'),
PythonConfiguration(version='3.8.0', arch="32", identifier='cp38-win32'),
PythonConfiguration(version='3.8.0', arch="64", identifier='cp38-win_amd64'),
]
if IS_RUNNING_ON_TRAVIS:
# cannot install VCForPython27.msi which is needed for compiling C software
# try with (and similar): msiexec /i VCForPython27.msi ALLUSERS=1 ACCEPT=YES /passive
python_configurations = [c for c in python_configurations if not c.version.startswith('2.7.')]
# skip builds as required
python_configurations = [c for c in python_configurations if build_selector(c.identifier)]
return python_configurations
def build(project_dir, output_dir, test_command, test_requires, test_extras, before_build, build_verbosity, build_selector, environment):
def simple_shell(args, env=None, cwd=None):
print('+ ' + ' '.join(args))
args = ['cmd', '/E:ON', '/V:ON', '/C'] + args
return subprocess.check_call(' '.join(args), env=env, cwd=cwd)
def download(url, dest):
print('+ Download ' + url + ' to ' + dest)
dest_dir = os.path.dirname(dest)
if not os.path.exists(dest_dir):
os.makedirs(dest_dir)
response = urlopen(url)
try:
with open(dest, 'wb') as file:
file.write(response.read())
finally:
response.close()
if IS_RUNNING_ON_AZURE or IS_RUNNING_ON_TRAVIS:
shell = simple_shell
else:
run_with_env = os.path.abspath(os.path.join(os.path.dirname(__file__), 'resources', 'appveyor_run_with_env.cmd'))
# run_with_env is a cmd file that sets the right environment variables
# to build on AppVeyor.
def shell(args, env=None, cwd=None):
# print the command executing for the logs
print('+ ' + ' '.join(args))
args = ['cmd', '/E:ON', '/V:ON', '/C', run_with_env] + args
return subprocess.check_call(' '.join(args), env=env, cwd=cwd)
abs_project_dir = os.path.abspath(project_dir)
temp_dir = tempfile.mkdtemp(prefix='cibuildwheel')
built_wheel_dir = os.path.join(temp_dir, 'built_wheel')
# install nuget as best way to provide python
nuget = 'C:\\cibw\\nuget.exe'
download('https://dist.nuget.org/win-x86-commandline/latest/nuget.exe', nuget)
# get pip fo this installation which not have.
get_pip_script = 'C:\\cibw\\get-pip.py'
download('https://bootstrap.pypa.io/get-pip.py', get_pip_script)
python_configurations = get_python_configurations(build_selector)
for config in python_configurations:
config_python_path = get_python_path(config)
simple_shell([nuget, "install"] + get_nuget_args(config))
if not os.path.exists(os.path.join(config_python_path, 'Scripts', 'pip.exe')):
simple_shell([os.path.join(config_python_path, 'python.exe'), get_pip_script ])
# check python & pip exist for this configuration
assert os.path.exists(os.path.join(config_python_path, 'python.exe'))
assert os.path.exists(os.path.join(config_python_path, 'Scripts', 'pip.exe'))
# setup dirs
if os.path.exists(built_wheel_dir):
shutil.rmtree(built_wheel_dir)
os.makedirs(built_wheel_dir)
env = os.environ.copy()
# set up environment variables for run_with_env
env['PYTHON_VERSION'] = config.version
env['PYTHON_ARCH'] = config.arch
env['PATH'] = os.pathsep.join([
config.path,
os.path.join(config.path, 'Scripts'),
config_python_path,
os.path.join(config_python_path, 'Scripts'),
env['PATH']
])
env = environment.as_dictionary(prev_environment=env)
# for the logs - check we're running the right version of python
shell(['python', '--version'], env=env)
shell(['python', '-c', '"import struct; print(struct.calcsize(\'P\') * 8)\"'], env=env)
# prepare the Python environment
shell(['pip', 'install', '--disable-pip-version-check', '--user', '--upgrade', 'pip'],
env=env)
shell(['python', '-m', 'pip', 'install', '--upgrade', 'pip'], env=env)
shell(['pip', 'install', '--upgrade', 'setuptools'], env=env)
shell(['pip', 'install', 'wheel'], env=env)
# run the before_build command
if before_build:
before_build_prepared = prepare_command(before_build, project=abs_project_dir)
shell([before_build_prepared], env=env)
# build the wheel
shell(['pip', 'wheel', project_dir, '-w', output_dir], env=env)
shell(['pip', 'wheel', abs_project_dir, '-w', built_wheel_dir, '--no-deps'] + get_build_verbosity_extra_flags(build_verbosity), env=env)
built_wheel = glob(built_wheel_dir+'/*.whl')[0]
# install the wheel
shell(['pip', 'install', package_name, '--no-index', '-f', output_dir], env=env)
# test the wheel
if test_requires:
shell(['pip', 'install'] + test_requires, env=env)
if test_command:
# set up a virtual environment to install and test from, to make sure
# there are no dependencies that were pulled in at build time.
shell(['pip', 'install', 'virtualenv'], env=env)
venv_dir = tempfile.mkdtemp()
shell(['python', '-m', 'virtualenv', venv_dir], env=env)
virtualenv_env = env.copy()
virtualenv_env['PATH'] = os.pathsep.join([
os.path.join(venv_dir, 'Scripts'),
virtualenv_env['PATH'],
])
# check that we are using the Python from the virtual environment
shell(['which', 'python'], env=virtualenv_env)
# install the wheel
shell(['pip', 'install', built_wheel + test_extras], env=virtualenv_env)
# test the wheel
if test_requires:
shell(['pip', 'install'] + test_requires, env=virtualenv_env)
# run the tests from c:\, with an absolute path in the command
# (this ensures that Python runs the tests against the installed wheel
# and not the repo code)
abs_project_dir = os.path.abspath(project_dir)
test_command_absolute = test_command.format(project=abs_project_dir)
shell([test_command_absolute], cwd='c:\\', env=env)
test_command_prepared = prepare_command(test_command, project=abs_project_dir)
shell([test_command_prepared], cwd='c:\\', env=virtualenv_env)
# clean up
shutil.rmtree(venv_dir)
# we're all done here; move it to output (remove if already exists)
dst = os.path.join(output_dir, os.path.basename(built_wheel))
if os.path.isfile(dst):
os.remove(dst)
shutil.move(built_wheel, dst)
+30
View File
@@ -0,0 +1,30 @@
---
title: Contributing
---
Wheel-building can be pretty complex. I expect users to find many edge-cases - please help the rest of the community out by documenting these, adding features to support them, and reporting bugs.
I plan to be pretty liberal in accepting pull requests, as long as they align with the design goals below.
`cibuildwheel` is indie open source. We're not paid to work on this.
Design Goals
------------
- `cibuildwheel` should wrap the complexity of wheel building.
- The user interface to `cibuildwheel` is the build script (e.g. `.travis.yml`). Feature additions should not increase the complexity of this script.
- Options should be environment variables (these lend themselves better to YML config files). They should be prefixed with `CIBW_`.
- Options should be generalise to all platforms. If platform-specific options are required, they should be namespaced e.g. `CIBW_TEST_COMMAND_MACOS`
Other notes:
- The platforms are very similar, until they're not. I'd rather have straight-forward code than totally DRY code, so let's keep airy platfrom abstractions to a minimum.
- I might want to break the options into a shared config file one day, so that config is more easily shared. That has motivated some of the design decisions.
### cibuildwheel's relationship with build errors
cibuildwheel doesn't really do anything itself - it's always deferring to other tools (pip, wheel, auditwheel, delocate, docker). Without cibuildwheel, the process is really fragmented. Different tools, across different OSs need to be stitched together in just the right way to make it work.
We're not responsible for errors in those tools, for fixing errors/crashes there. But cibuildwheel's job is providing users with an 'integrated' user experience across those tools. We provide an abstraction. The user says 'build me some wheels', not 'open the docker container, build a wheel with pip, fix up the symbols with auditwheel' etc. However, errors have a habit of breaking abstractions. And this is where users get confused, because the mechanism of cibuildwheel is laid bare, and they must understand a little bit how it works to debug.
So, if we can, I'd like to improve the experience on errors as well. In [this](https://github.com/joerick/cibuildwheel/issues/139) case, it takes a bit of knowledge to understand that the linux builds are happening in a totally different OS via docker, that the linked symbols won't match, that auditwheel will fail because of this. A problem with how the tools fit together, instead of the tools themselves.
+36
View File
@@ -0,0 +1,36 @@
---
title: Delivering to PyPI
---
After you've built your wheels, you'll probably want to deliver them to PyPI.
### Manual method
On your development machine, do the following...
```bash
# Clear out your 'dist' folder.
rm -rf dist
# Make a source distribution
python setup.py sdist
# 🏃🏻
# Go and download your wheel files from wherever you put them. e.g. your CI
# provider can be configured to store them for you. Put them all into the
# 'dist' folder.
# Upload using 'twine' (you may need to 'pip install twine')
twine upload dist/*
```
### Semi-automatic method using wheelhouse-uploader
Obviously, manual steps are for chumps, so we can automate this a little by using [wheelhouse-uploader](https://github.com/ogrisel/wheelhouse-uploader).
> Quick note from me - using S3 as a storage didn't work due to a [bug](https://issues.apache.org/jira/browse/LIBCLOUD-792) in libcloud. Feel free to use my fork of that package that fixes the bug `pip install https://github.com/joerick/libcloud/archive/v1.5.0-s3fix.zip`
### Automatic method
If you don't need much control over the release of a package, you can set up cibuildwheel to deliver the wheels straight to PyPI. This doesn't require anycloud storage to work - you just need to bump the version and tag it.
Check out [this example repo](https://github.com/joerick/cibuildwheel-autopypi-example) for instructions on how to set this up.
+88
View File
@@ -0,0 +1,88 @@
/* Global styles */
p {
margin-bottom: 12px;
}
code {
font-size: 85%;
background-color: rgba(27,31,35,.05);
border-radius: 3px;
padding: .2em .4em;
color: inherit;
border: none;
margin: 0 1px;
}
code, pre, tt {
font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
}
.hljs {
padding: 1em;
background-color: #f6f8fa;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 2em;
border-bottom: 1px solid #e1e4e5;
margin-bottom: 0.8em;
padding-bottom: 0.2em;
}
.rst-content blockquote {
margin-bottom: 14px;
}
.rst-content th {
white-space: normal;
}
/*
Code block filename style
Use by putting a quote before a code block e.g.
> filename.txt
```
code here
```
JS adds the relevant classes to make the following selectors work.
*/
.rst-content .code-block-filename {
margin: 0;
padding: 2px 1em;
background-color: #eff1f3;
font-size: 85%;
font-weight: bold;
border-top-left-radius: 3px;
border-top-right-radius: 3px;
border-bottom: 1px solid #e6e8e9;
color: #444;
}
.rst-content .code-block-filename * {
font-size: inherit;
}
.rst-content .code-block-filename :last-child {
margin-bottom: 0;
}
.code-block-filename + pre {
margin-top: 0;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.code-block-filename + pre code {
padding-top: 0.9em;
}
/* import font awesome 4 for icons */
@import url(https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css);
+5
View File
@@ -0,0 +1,5 @@
$('.rst-content pre')
.prev('blockquote')
.addClass('code-block-filename');
+39
View File
@@ -0,0 +1,39 @@
---
title: Tips and tricks
---
### Troubleshooting
If your wheel didn't compile, check the list below for some debugging tips.
- A mistake in your config. To quickly test your config without doing a git push and waiting for your code to build on CI, you can test the Linux build in a Docker container. On Mac or Linux, with Docker running, try `cibuildwheel --platform linux`. You'll have to bring your config into the current environment first.
- Missing dependency. You might need to install something on the build machine. You can do this in `.travis.yml`, `appveyor.yml`, or `.circleci/config.yml`, with apt-get, brew or choco. Given how the Linux build works, you'll need to use the [`CIBW_BEFORE_BUILD`](options.md#before-build) option.
- Windows: missing C feature. The Windows C compiler doesn't support C language features invented after 1990, so you'll have to backport your C code to C90. For me, this mostly involved putting my variable declarations at the top of the function like an animal.
- MacOS: calling cibuildwheel from a python3 script and getting a `ModuleNotFoundError`? Due to a [bug](https://bugs.python.org/issue22490) in CPython, you'll need to [unset the `__PYVENV_LAUNCHER__` variable](https://github.com/joerick/cibuildwheel/issues/133#issuecomment-478288597) before activating a venv.
### Linux builds on Docker
Linux wheels are built in the [`manylinux` docker images](https://github.com/pypa/manylinux) to provide binary compatible wheels on Linux, according to [PEP 571](https://www.python.org/dev/peps/pep-0571/). Because of this, when building with `cibuildwheel` on Linux, a few things should be taken into account:
- Programs and libraries cannot be installed on the Travis CI Ubuntu host with `apt-get`, but can be installed inside of the Docker image using `yum` or manually. The same goes for environment variables that are potentially needed to customize the wheel building. `cibuildwheel` supports this by providing the `CIBW_ENVIRONMENT` and `CIBW_BEFORE_BUILD` options to setup the build environment inside the running Docker image. See [the options docs](options.md#build-environment) for details on these options.
- The project directory is mounted in the running Docker instance as `/project`, the output directory for the wheels as `/output`. In general, this is handled transparently by `cibuildwheel`. For a more finegrained level of control however, the root of the host file system is mounted as `/host`, allowing for example to access shared files, caches, etc. on the host file system. Note that this is not available on CircleCI due to their Docker policies.
- Alternative dockers images can be specified with the `CIBW_MANYLINUX_X86_64_IMAGE` and `CIBW_MANYLINUX_I686_IMAGE` options to allow for a custom, preconfigured build environment for the Linux builds. See [options](options.md#manylinux-image) for more details.
### Building packages with optional C extensions
`cibuildwheel` defines the environment variable `CIBUILDWHEEL` to the value `1` allowing projects for which the C extension is optional to make it mandatory when building wheels.
An easy way to do it in Python 3 is through the `optional` named argument of `Extension` constructor in your `setup.py`:
```python
myextension = Extension(
"myextension",
["myextension.c"],
optional=os.environ.get('CIBUILDWHEEL', '0') != '1',
)
```
+11
View File
@@ -0,0 +1,11 @@
---
title: Home
---
{%
includemarkdown "../README.md"
start="<!--intro-start-->"
end="<!--intro-end-->"
%}
To get started, head over to the [setup guide](setup.md).
@@ -0,0 +1,51 @@
import mkdocs, re, os, io, cgi
TAG_REGEX_PATTERN = re.compile(
r'''
{% # opening tag
\s*
includemarkdown # directive name
\s+
"(?P<filename>[^"]+)" # "filename"
(?:\s+start="(?P<start>[^"]+)")? # optional start expression
(?:\s+end="(?P<end>[^"]+)")? # optional end expression
\s*
%} # closing tag
''',
flags=re.VERBOSE,
)
class ImportMarkdownPlugin(mkdocs.plugins.BasePlugin):
def on_page_markdown(self, markdown, page, **kwargs):
page_src_path = page.file.abs_src_path
def found_import_markdown_tag(match):
filename = match.group('filename')
start = match.group('start')
end = match.group('end')
file_path_abs = os.path.join(os.path.dirname(page_src_path), filename)
if not os.path.exists(file_path_abs):
raise ValueError('file not found', filename)
with io.open(file_path_abs, encoding='utf8') as f:
text_to_include = f.read()
if start:
_, _, text_to_include = text_to_include.partition(start)
if end:
text_to_include, _, _ = text_to_include.partition(end)
return (
'<!-- BEGIN INCLUDE %s %s %s -->' % (
filename, cgi.escape(start), cgi.escape(end)
)
+ text_to_include
+ '<!-- END INCLUDE -->'
)
markdown = re.sub(TAG_REGEX_PATTERN, found_import_markdown_tag, markdown)
return markdown
@@ -0,0 +1,15 @@
from setuptools import setup
setup(
name='mkdocs_include_markdown_plugin',
version='1.0',
author='Joe Rickerby',
license='Apache 2',
packages=['mkdocs_include_markdown_plugin'],
entry_points={
'mkdocs.plugins': [
'importmarkdown = mkdocs_include_markdown_plugin.plugin:ImportMarkdownPlugin',
]
},
zip_safe=False
)
+451
View File
@@ -0,0 +1,451 @@
## Options summary
<div class="options-toc"></div>
## Setting options
cibuildwheel is configured using environment variables, that can be set using
your CI config.
For example, to configure cibuildwheel to run tests, add the following YAML to
your CI config file:
> .travis.yml ([docs](https://docs.travis-ci.com/user/environment-variables/))
```yaml
env:
global:
- CIBW_TEST_REQUIRES=nose
- CIBW_TEST_COMMAND="nosetests {project}/tests"
```
> appveyor.yml ([docs](https://www.appveyor.com/docs/build-configuration/#environment-variables))
```yaml
environment:
global:
CIBW_TEST_REQUIRES: nose
CIBW_TEST_COMMAND: "nosetests {project}\\tests"
```
> .circleci/config.yml ([docs](https://circleci.com/docs/2.0/configuration-reference/#environment))
```yaml
jobs:
job_name:
environment:
CIBW_TEST_REQUIRES: nose
CIBW_TEST_COMMAND: "nosetests {project}/tests"
```
> azure-pipelines.yml ([docs](https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables))
```yaml
variables:
CIBW_TEST_REQUIRES: nose
CIBW_TEST_COMMAND: "nosetests {project}/tests"
```
## Build selection
### `CIBW_PLATFORM` {: #platform}
> Override the auto-detected target platform
Options: `auto` `linux` `macos` `windows`
Default: `auto`
`auto` will auto-detect platform using environment variables, such as `TRAVIS_OS_NAME`/`APPVEYOR`/`CIRCLECI`.
For `linux` you need Docker running, on Mac or Linux. For `macos`, you need a Mac machine, and note that this script is going to automatically install MacPython on your system, so don't run on your development machine. For `windows`, you need to run in Windows, and it will build and test for all versions of Python at `C:\PythonXX[-x64]`.
This option can also be set using the command-line option `--platform`.
### `CIBW_BUILD`, `CIBW_SKIP` {: #build-skip}
> Choose the Python versions to build
Space-separated list of builds to build and skip. Each build has an identifier like `cp27-manylinux_x86_64` or `cp35-macosx_10_6_intel` - you can list specific ones to build and `cibuildwheel` will only build those, and/or list ones to skip and `cibuildwheel` won't try to build them.
When both options are specified, both conditions are applied and only builds with a tag that matches `CIBW_BUILD` and does not match `CIBW_SKIP` will be built.
When setting the options, you can use shell-style globbing syntax (as per `fnmatch`). All the build identifiers supported by cibuildwheel are shown below:
<div class="build-id-table-marker"></div>
| | macOS 64bit | macOS 32/64bit | Manylinux 64bit | Manylinux 32bit | Windows 64bit | Windows 32bit |
|------------|-------------------------|------------------------|------------------------|----------------------|-----------------|----------------|
| Python 2.7 | | cp27-macosx_10_6_intel | cp27-manylinux_x86_64 | cp27-manylinux_i686 | cp27-win_amd64 | cp27-win32 |
| Python 3.5 | | cp35-macosx_10_6_intel | cp35-manylinux_x86_64 | cp35-manylinux_i686 | cp35-win_amd64 | cp35-win32 |
| Python 3.6 | | cp36-macosx_10_6_intel | cp36-manylinux_x86_64 | cp36-manylinux_i686 | cp36-win_amd64 | cp36-win32 |
| Python 3.7 | | cp37-macosx_10_6_intel | cp37-manylinux_x86_64 | cp37-manylinux_i686 | cp37-win_amd64 | cp37-win32 |
| Python 3.8 | cp38-macosx_10_9_x86_64 | | cp38-manylinux_x86_64 | cp38-manylinux_i686 | cp38-win_amd64 | cp38-win32 |
The list of supported and currently selected build identifiers can also be retrieved by passing the `--print-build-identifiers` flag to `cibuildwheel`.
The format is `python_tag-platform_tag`, with tags similar to those in [PEP 425](https://www.python.org/dev/peps/pep-0425/#details).
#### Examples
```yaml
# Only build on Python 3.6
CIBW_BUILD: cp36-*
# Skip building on Python 2.7 on the Mac
CIBW_SKIP: cp27-macosx_10_6_intel
# Skip building on Python 3.8 on the Mac
CIBW_SKIP: cp38-macosx_10_9_x86_64
# Skip building on Python 2.7 on all platforms
CIBW_SKIP: cp27-*
# Skip Python 2.7 on Windows
CIBW_SKIP: cp27-win*
# Skip Python 2.7 on 32-bit Windows
CIBW_SKIP: cp27-win32
# Skip Python 2.7 and Python 3.5
CIBW_SKIP: cp27-* cp35-*
# Skip Python 3.6 on Linux
CIBW_SKIP: cp36-manylinux*
# Only build on Python 3 and skip 32-bit builds
CIBW_BUILD: cp3?-*
CIBW_SKIP: "*-win32 *-manylinux_i686"
```
<style>
.build-id-table-marker + table {
font-size: 90%;
white-space: nowrap;
}
.rst-content .build-id-table-marker + table td,
.rst-content .build-id-table-marker + table th {
padding: 4px 4px;
}
.build-id-table-marker + table td:not(:first-child) {
font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
font-size: 85%;
}
dt code {
font-size: 100%;
background-color: rgba(41, 128, 185, 0.1);
padding: 0;
}
</style>
## Build customization
### `CIBW_ENVIRONMENT` {: #environment}
> Set environment variables needed during the build
A space-separated list of environment variables to set during the build. Bash syntax should be used, even on Windows.
You must set this variable to pass variables to Linux builds (since they execute in a Docker container). It also works for the other platforms.
You can use `$PATH` syntax to insert other variables, or the `$(pwd)` syntax to insert the output of other shell commands.
#### Examples
```yaml
# Set some compiler flags
CIBW_ENVIRONMENT: "CFLAGS='-g -Wall' CXXFLAGS='-Wall'"
# Append a directory to the PATH variable (this is expanded in the build environment)
CIBW_ENVIRONMENT: "PATH=$PATH:/usr/local/bin"
# Set BUILD_TIME to the output of the `date` command
CIBW_ENVIRONMENT: "BUILD_TIME=$(date)"
# Supply options to `pip` to affect how it downloads dependencies
CIBW_ENVIRONMENT: "PIP_EXTRA_INDEX_URL=https://pypi.myorg.com/simple"
```
Platform-specific variants also available:
`CIBW_ENVIRONMENT_MACOS` | `CIBW_ENVIRONMENT_WINDOWS` | `CIBW_ENVIRONMENT_LINUX`
!!! note
`cibuildwheel` always defines the environment variable `CIBUILDWHEEL=1`. This can be useful for [building wheels with optional extensions](faq.md#building-packages-with-optional-c-extensions).
### `CIBW_BEFORE_BUILD` {: #before-build}
> Execute a shell command preparing each wheel's build
A shell command to run before building the wheel. This option allows you to run a command in **each** Python environment before the `pip wheel` command. This is useful if you need to set up some dependency so it's available during the build.
If dependencies are required to build your wheel (for example if you include a header from a Python module), set this to `pip install .`, and the dependencies will be installed automatically by pip. However, this means your package will be built twice - if your package takes a long time to build, you might wish to manually list the dependencies here instead.
The active Python binary can be accessed using `python`, and pip with `pip`; `cibuildwheel` makes sure the right version of Python and pip will be executed. `{project}` can be used as a placeholder for the absolute path to the project's root.
#### Examples
```yaml
# install your project and dependencies before building
CIBW_BEFORE_BUILD: pip install .
# install something required for the build
CIBW_BEFORE_BUILD: pip install pybind11
# chain commands using &&
CIBW_BEFORE_BUILD: yum install -y libffi-dev && pip install .
```
Platform-specific variants also available:
`CIBW_BEFORE_BUILD_MACOS` | `CIBW_BEFORE_BUILD_WINDOWS` | `CIBW_BEFORE_BUILD_LINUX`
### `CIBW_MANYLINUX_X86_64_IMAGE`, `CIBW_MANYLINUX_I686_IMAGE` {: #manylinux-image}
> Specify alternative manylinux docker images
An alternative Docker image to be used for building [`manylinux`](https://github.com/pypa/manylinux) wheels. `cibuildwheel` will then pull these instead of the default images, [`quay.io/pypa/manylinux2010_x86_64`](https://quay.io/pypa/manylinux2010_x86_64) and [`quay.io/pypa/manylinux2010_i686`](https://quay.io/pypa/manylinux2010_i686).
The value of this option can either be set to `manylinux1` or `manylinux2010` to use the [official `manylinux` images](https://github.com/pypa/manylinux), or any other valid Docker image name.
Beware to specify a valid Docker image that can be used in the same way as the official, default Docker images: all necessary Python and pip versions need to be present in `/opt/python/`, and the `auditwheel` tool needs to be present for `cibuildwheel` to work. Apart from that, the architecture and relevant shared system libraries need to be manylinux1- or manylinux2010-compatible in order to produce valid `manylinux1`/`manylinux2010` wheels (see https://github.com/pypa/manylinux, [PEP 513](https://www.python.org/dev/peps/pep-0513/), and [PEP 571](https://www.python.org/dev/peps/pep-0571/) for more details).
Note that `auditwheel` detects the version of the `manylinux` standard in the Docker image through the `AUDITWHEEL_PLAT` environment variable, as `cibuildwheel` has no way of detecting the correct `--plat` command line argument to pass to `auditwheel` for a custom image. If a Docker image does not correctly set this `AUDITWHEEL_PLAT` environment variable, the `CIBW_ENVIRONMENT` option can be used to do so (e.g., `CIBW_ENVIRONMENT="manylinux2010_$(uname -m)"`).
#### Examples
```yaml
# build using the manylinux1 image to ensure manylinux1 wheels are produced
CIBW_MANYLINUX_X86_64_IMAGE: manylinux1
CIBW_MANYLINUX_I686_IMAGE: manylinux1
# build using a different image from the docker registry
CIBW_MANYLINUX_X86_64_IMAGE: dockcross/manylinux-x64
CIBW_MANYLINUX_I686_IMAGE: dockcross/manylinux-x86
```
## Testing
### `CIBW_TEST_COMMAND` {: #test-command}
> Execute a shell command to test all built wheels
Shell command to run tests after the build. The wheel will be installed automatically and available for import from the tests. `{project}` can be used as a placeholder for the absolute path to the project's root and will be replaced by `cibuildwheel`.
On Linux and Mac, the command runs in a shell, so you can write things like `cmd1 && cmd2`.
#### Examples
```yaml
# run the project tests against the installed wheel using `nose`
CIBW_TEST_COMMAND: nosetests {project}/tests
# run the project tests using `pytest`
CIBW_TEST_COMMAND: nosetests {project}/tests
```
Platform-specific variants also available:
`CIBW_TEST_COMMAND_MACOS` | `CIBW_TEST_COMMAND_WINDOWS` | `CIBW_TEST_COMMAND_LINUX`
### `CIBW_TEST_REQUIRES` {: #test-requires}
> Install Python dependencies before running the tests
Space-separated list of dependencies required for running the tests.
#### Examples
```yaml
# install pytest before running CIBW_TEST_COMMAND
CIBW_TEST_REQUIRES: pytest
# install specific versions of test dependencies
CIBW_TEST_REQUIRES: nose==1.3.7 moto==0.4.31
```
Platform-specific variants also available:
`CIBW_TEST_REQUIRES_MACOS` | `CIBW_TEST_REQUIRES_WINDOWS` | `CIBW_TEST_REQUIRES_LINUX`
### `CIBW_TEST_EXTRAS` {: #test-extras}
> Install your wheel for testing using `extras_require`
Comma-separated list of
[extras_require](https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies)
options that should be included when installing the wheel prior to running the
tests. This can be used to avoid having to redefine test dependencies in
`CIBW_TEST_REQUIRES` if they are already defined in `setup.py` or
`setup.cfg`.
#### Examples
```yaml
# will cause the wheel to be installed with `pip install <wheel_file>[test,qt]`
CIBW_TEST_EXTRAS: test,qt
```
Platform-specific variants also available:
`CIBW_TEST_EXTRAS_MACOS` | `CIBW_TEST_EXTRAS_WINDOWS` | `CIBW_TEST_EXTRAS_LINUX`
## Other
### `CIBW_BUILD_VERBOSITY` {: #build-verbosity}
> Increase/decrease the output of pip wheel
An number from 1 to 3 to increase the level of verbosity (corresponding to invoking pip with `-v`, `-vv`, and `-vvv`), between -1 and -3 (`-q`, `-qq`, and `-qqq`), or just 0 (default verbosity). These flags are useful while debugging a build when the output of the actual build invoked by `pip wheel` is required.
#### Examples
```yaml
# increase pip debugging output
CIBW_BUILD_VERBOSITY: 1
```
Platform-specific variants also available:
`CIBW_BUILD_VERBOSITY_MACOS` | `CIBW_BUILD_VERBOSITY_WINDOWS` | `CIBW_BUILD_VERBOSITY_LINUX`
## Command line options
```text
usage: cibuildwheel [-h] [--platform {auto,linux,macos,windows}]
[--output-dir OUTPUT_DIR] [--print-build-identifiers]
[project_dir]
Build wheels for all the platforms.
positional arguments:
project_dir Path to the project that you want wheels for.
Default: the current directory.
optional arguments:
-h, --help show this help message and exit
--platform {auto,linux,macos,windows}
Platform to build for. For "linux" you need docker
running, on Mac or Linux. For "macos", you need a Mac
machine, and note that this script is going to
automatically install MacPython on your system, so
don't run on your development machine. For "windows",
you need to run in Windows, and it will build and test
for all versions of Python at C:\PythonXX[-x64].
--output-dir OUTPUT_DIR
Destination folder for the wheels.
--print-build-identifiers
Print the build identifiers matched by the current
invocation and exit.
```
<style>
.toctree-l3 {
border-left: 10px solid transparent;
}
.options-toc {
display: grid;
grid-auto-columns: fit-content(20%) 1fr;
grid-gap: 16px 32px;
gap: 16px 32px;
font-size: 90%;
margin-bottom: 28px;
margin-top: 28px;
}
.options-toc .header {
grid-column: 1 / 3;
font-weight: bold;
}
.options-toc .header:first-child {
margin-top: 0;
}
.options-toc a.option {
display: block;
margin-bottom: 5px;
}
h3 code {
font-size: 100%;
}
</style>
<script>
document.addEventListener('DOMContentLoaded', function() {
// gather the options data
var options = {}
var headers = []
$('.rst-content h3')
.filter(function (i, el) {
return !!$(el).text().match(/(^([A-Z0-9, _]| and )+)¶$/);
})
.each(function (i, el) {
var optionName = $(el).text().replace('¶', '');
var description = $(el).next('blockquote').text()
var header = $(el).prevAll('h2').first().text().replace('¶', '')
var id = el.id;
if (options[header] === undefined) {
options[header] = [];
headers.push(header);
}
console.log(optionName, description, header);
options[header].push({name: optionName, description, id});
});
// write the table of contents
var tocTable = $('.options-toc');
for (var i = 0; i < headers.length; i += 1) {
var header = headers[i];
var headerOptions = options[header];
$('<div class="header">').text(header).appendTo(tocTable);
for (var j = 0; j < headerOptions.length; j += 1) {
var option = headerOptions[j];
var optionNames = option.name.split(', ')
$('<div class="name">')
.append($.map(optionNames, function (name) {
return $('<a class="option">')
.append(
$('<code>').text(name)
)
.attr('href', '#'+option.id)
}
))
.appendTo(tocTable);
$('<div class="description">')
.text(option.description)
.appendTo(tocTable);
}
}
// write the markdown table for the README
var markdown = ''
markdown += '| | Option | Description |\n'
markdown += '|---|--------|-------------|\n'
var prevHeader = null
for (var i = 0; i < headers.length; i += 1) {
var header = headers[i];
var headerOptions = options[header];
for (var j = 0; j < headerOptions.length; j += 1) {
var option = headerOptions[j];
if (j == 0) {
markdown += '| **'+header+'** '
} else {
markdown += '| '
}
var optionNames = option.name.trim().split(', ')
var url = 'https://cibuildwheel.readthedocs.io/en/stable/options/#'+option.id;
var namesMarkdown = $.map(optionNames, function(n) {
return '[`'+n+'`]('+url+') '
}).join(' ')
markdown += '| '+namesMarkdown+' '
markdown += '| '+option.description.trim()+' '
markdown += '|\n'
}
}
console.log('readme options markdown\n', markdown)
});
</script>
+194
View File
@@ -0,0 +1,194 @@
---
title: 'Setup'
---
# Azure Pipelines [linux/mac/windows] {: #azure-pipelines}
Using Azure pipelines, you can build all three platforms on the same service. Create a `azure-pipelines.yml` file in your repo.
> azure-pipelines.yml
```yaml
jobs:
- job: linux
pool: {vmImage: 'Ubuntu-16.04'}
steps:
- task: UsePythonVersion@0
- bash: |
python -m pip install --upgrade pip
pip install cibuildwheel==1.0.0
cibuildwheel --output-dir wheelhouse .
- task: PublishBuildArtifacts@1
inputs: {pathtoPublish: 'wheelhouse'}
- job: macos
pool: {vmImage: 'macOS-10.13'}
steps:
- task: UsePythonVersion@0
- bash: |
python -m pip install --upgrade pip
pip install cibuildwheel==1.0.0
cibuildwheel --output-dir wheelhouse .
- task: PublishBuildArtifacts@1
inputs: {pathtoPublish: 'wheelhouse'}
- job: windows
pool: {vmImage: 'vs2017-win2016'}
steps:
- task: UsePythonVersion@0
- script: choco install vcpython27 -f -y
displayName: Install Visual C++ for Python 2.7
- bash: |
python -m pip install --upgrade pip
pip install cibuildwheel==1.0.0
cibuildwheel --output-dir wheelhouse .
- task: PublishBuildArtifacts@1
inputs: {pathtoPublish: 'wheelhouse'}
```
Commit this file, enable building of your repo on Azure Pipelines, and push.
Wheels will be stored for you and available through the Pipelines interface. For more info on this file, check out the [docs](https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema).
# Travis CI [linux/mac] {: #travis-ci}
To build Linux and Mac wheels on Travis CI, create a `.travis.yml` file in your repo.
> .travis.yml
```yaml
language: python
matrix:
include:
- sudo: required
services:
- docker
env: PIP=pip
- os: osx
language: generic
env: PIP=pip2
script:
- $PIP install cibuildwheel==1.0.0
- cibuildwheel --output-dir wheelhouse
```
To build on Windows too, add this matrix entry:
```yaml
- os: windows
language: shell
before_install:
- choco install python3 --version 3.6.8 --no-progress -y
env:
- PATH=/c/Python36:/c/Python36/Scripts:$PATH
```
Note that building Windows Python 2.7 wheels on Travis is unsupported.
Commit this file, enable building of your repo on Travis CI, and push.
Then setup a deployment method by following the [Travis CI deployment docs](https://docs.travis-ci.com/user/deployment/), or see [Delivering to PyPI](deliver-to-pypi.md). For more info on `.travis.yml`, check out the [docs](https://docs.travis-ci.com/).
# CircleCI [linux/mac] {: #circleci}
To build Linux and Mac wheels on CircleCI, create a `.circleci/config.yml` file in your repo,
> .circleci/config.yml
```yaml
version: 2
jobs:
linux-wheels:
working_directory: ~/linux-wheels
docker:
- image: circleci/python:3.6
steps:
- checkout
- setup_remote_docker
- run:
name: Build the Linux wheels.
command: |
pip install --user cibuildwheel==1.0.0
cibuildwheel --output-dir wheelhouse
- store_artifacts:
path: wheelhouse/
osx-wheels:
working_directory: ~/osx-wheels
macos:
xcode: "10.0.0"
steps:
- checkout
- run:
name: Build the OS X wheels.
command: |
pip install --user cibuildwheel==1.0.0
cibuildwheel --output-dir wheelhouse
- store_artifacts:
path: wheelhouse/
workflows:
version: 2
all-tests:
jobs:
- linux-wheels
- osx-wheels
```
Commit this file, enable building of your repo on CircleCI, and push.
!!! note
CircleCI doesn't enable free macOS containers for open source by default, but you can ask for access. See [here](https://circleci.com/docs/2.0/oss/#overview) for more information.
CircleCI will store the built wheels for you - you can access them from the project console. Check out the CircleCI [docs](https://circleci.com/docs/2.0/configuration-reference/#section=configuration) for more info on this config file.
# AppVeyor [windows] {: #appveyor}
To build Windows wheels on AppVeyor, create an `appveyor.yml` file in your repo.
> appveyor.yml
```yaml
build_script:
- pip install cibuildwheel==1.0.0
- cibuildwheel --output-dir wheelhouse
artifacts:
- path: "wheelhouse\\*.whl"
name: Wheels
```
Commit this file, enable building of your repo on AppVeyor, and push.
AppVeyor will store the built wheels for you - you can access them from the project console. Alternatively, you may want to store them in the same place as the Travis CI build. See [AppVeyor deployment docs](https://www.appveyor.com/docs/deployment/) for more info, or see [Delivering to PyPI](deliver-to-pypi.md) below.
For more info on this config file, check out the [docs](https://www.appveyor.com/docs/).
> ⚠️ Got an error? Check the [FAQ](faq.md).
<script>
document.addEventListener('DOMContentLoaded', function() {
$('.toctree-l2 a, .rst-content h1').each(function(i, el) {
var text = $(el).text()
var match = text.match(/(.*) \[([a-z/]+)\]/);
if (match) {
var iconHTML = $.map(match[2].split('/'), function(ident) {
switch (ident) {
case 'linux':
return '<i class="fa fa-linux" aria-hidden="true"></i>'
case 'windows':
return '<i class="fa fa-windows" aria-hidden="true"></i>'
case 'mac':
return '<i class="fa fa-apple" aria-hidden="true"></i>'
}
}).join(' ');
$(el).append(
$('<div>')
.append(iconHTML)
.css({float: 'right'})
)
$(el).contents()
.filter(function(){ return this.nodeType == 3; }).first()
.replaceWith(match[1]);
}
});
});
</script>
+32
View File
@@ -0,0 +1,32 @@
site_name: cibuildwheel
docs_dir: docs
theme:
name: readthedocs
highlightjs: true
hljs_languages:
- yaml
repo_url: https://github.com/joerick/cibuildwheel
extra_css:
- extra.css
extra_javascript:
- extra.js
nav:
- Home: index.md
- setup.md
- options.md
- deliver-to-pypi.md
- faq.md
- contributing.md
markdown_extensions:
- fenced_code
- toc:
permalink: True
- attr_list
- admonition
plugins:
- importmarkdown
+4
View File
@@ -0,0 +1,4 @@
-e .
-e ./docs/mkdocs_include_markdown_plugin
pytest
mkdocs==1.0.4
-39
View File
@@ -1,39 +0,0 @@
from __future__ import print_function
import os, sys, subprocess, shutil, json
from glob import glob
# move cwd to the project root
os.chdir(os.path.dirname(os.path.abspath(__file__)))
test_projects = glob('test/??_*')
if len(test_projects) == 0:
print('No test projects found. Aborting.', file=sys.stderr)
exit(2)
print('Testing projects:', test_projects)
for project_path in test_projects:
# load project settings into environment
env_file = os.path.join(project_path, 'environment.json')
project_env = {}
if os.path.exists(env_file):
with open(env_file) as f:
project_env = json.load(f)
# run the build
env = os.environ.copy()
project_env = {str(k): str(v) for k, v in project_env.items()} # unicode not allowed in env
env.update(project_env)
print('Building %s with environment %s' % (project_path, project_env))
subprocess.check_call(['cibuildwheel', project_path], env=env)
wheels = glob('wheelhouse/*.whl')
print('%s built successfully. %i wheels built.' % (project_path, len(wheels)))
# check some wheels were actually built
assert len(wheels) >= 4
# clean up
shutil.rmtree('wheelhouse')
print('%d projects built successfully.' % len(test_projects))
+10 -1
View File
@@ -1,12 +1,21 @@
[bumpversion]
current_version = 0.1.3
current_version = 1.0.0
commit = True
tag = True
message = Bump version
[bumpversion:file:setup.py]
[bumpversion:file:cibuildwheel/__init__.py]
[bumpversion:file:README.md]
search = cibuildwheel=={current_version}
replace = cibuildwheel=={new_version}
[bumpversion:file:docs/setup.md]
search = cibuildwheel=={current_version}
replace = cibuildwheel=={new_version}
[bdist_wheel]
universal = 1
+7 -1
View File
@@ -8,7 +8,8 @@ except ImportError:
setup(
name='cibuildwheel',
version='0.1.3',
version='1.0.0',
install_requires=['bashlex!=0.13'],
description="Build Python wheels on CI with minimal configuration.",
long_description='For readme please see http://github.com/joerick/cibuildwheel',
author="Joe Rickerby",
@@ -17,6 +18,11 @@ setup(
packages=['cibuildwheel',],
license="BSD",
zip_safe=False,
package_data={
'cibuildwheel': ['resources/*'],
},
# Supported python versions
python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*',
keywords='ci wheel packaging pypi travis appveyor macos linux windows',
classifiers=[
'Intended Audience :: Developers',
+26
View File
@@ -0,0 +1,26 @@
import os
import utils
project_dir = os.path.dirname(__file__)
def test():
# build the wheels
utils.cibuildwheel_run(project_dir)
# check that the expected wheels are produced
expected_wheels = utils.expected_wheels('spam', '0.1.0')
actual_wheels = os.listdir('wheelhouse')
assert set(actual_wheels) == set(expected_wheels)
def test_build_identifiers():
# check that the number of expected wheels matches the number of build
# identifiers
# after adding CIBW_MANYLINUX_IMAGE to support manylinux2010, there
# can be multiple wheels for each wheel, though, so we need to limit
# the expected wheels
expected_wheels = [w for w in utils.expected_wheels('spam', '0.1.0')
if not '-manylinux' in w or '-manylinux1' in w]
build_identifiers = utils.cibuildwheel_get_build_identifiers(project_dir)
assert len(expected_wheels) == len(build_identifiers)
+5
View File
@@ -1,5 +1,10 @@
import os
from setuptools import setup, Extension
if os.environ.get('CIBUILDWHEEL', '0') != '1':
raise Exception('CIBUILDWHEEL environment variable is not set to 1')
setup(
name="spam",
ext_modules=[Extension('spam', sources=['spam.c'])],
+55
View File
@@ -0,0 +1,55 @@
import os, subprocess
import pytest
import utils
def test():
project_dir = os.path.dirname(__file__)
# build and test the wheels
utils.cibuildwheel_run(project_dir, add_env={
'CIBW_TEST_REQUIRES': 'nose',
# the 'false ||' bit is to ensure this command runs in a shell on
# mac/linux.
'CIBW_TEST_COMMAND': 'false || nosetests {project}/test',
'CIBW_TEST_COMMAND_WINDOWS': 'nosetests {project}/test',
})
# also check that we got the right wheels
expected_wheels = utils.expected_wheels('spam', '0.1.0')
actual_wheels = os.listdir('wheelhouse')
assert set(actual_wheels) == set(expected_wheels)
def test_extras_require():
project_dir = os.path.dirname(__file__)
# build and test the wheels
utils.cibuildwheel_run(project_dir, add_env={
'CIBW_TEST_EXTRAS': 'test',
# the 'false ||' bit is to ensure this command runs in a shell on
# mac/linux.
'CIBW_TEST_COMMAND': 'false || nosetests {project}/test',
'CIBW_TEST_COMMAND_WINDOWS': 'nosetests {project}/test',
})
# also check that we got the right wheels
expected_wheels = utils.expected_wheels('spam', '0.1.0')
actual_wheels = os.listdir('wheelhouse')
assert set(actual_wheels) == set(expected_wheels)
def test_failing_test():
'''Ensure a failing test causes cibuildwheel to error out and exit'''
project_dir = os.path.dirname(__file__)
with pytest.raises(subprocess.CalledProcessError):
utils.cibuildwheel_run(project_dir, add_env={
'CIBW_TEST_COMMAND': 'false',
# manylinux1 has a version of bash that's been shown to have
# problems with this, so let's check that.
'CIBW_MANYLINUX_I686_IMAGE': 'manylinux1',
'CIBW_MANYLINUX_X86_64_IMAGE': 'manylinux1',
})
assert len(os.listdir('wheelhouse'))
-4
View File
@@ -1,4 +0,0 @@
{
"CIBW_TEST_REQUIRES": "nose",
"CIBW_TEST_COMMAND": "nosetests {project}/test"
}
+1
View File
@@ -3,5 +3,6 @@ from setuptools import setup, Extension
setup(
name="spam",
ext_modules=[Extension('spam', sources=['spam.c'])],
extras_require={'test': ['nose']},
version="0.1.0",
)
+18
View File
@@ -0,0 +1,18 @@
import os
import utils
def test():
project_dir = os.path.dirname(__file__)
# build the wheels
utils.cibuildwheel_run(project_dir, add_env={
# write python version information to a temporary file, this is
# checked in setup.py
'CIBW_BEFORE_BUILD': '''python -c "import sys; open('/tmp/pythonversion.txt', 'w').write(sys.version)" && python -c "import sys; open('/tmp/pythonexecutable.txt', 'w').write(sys.executable)"''',
'CIBW_BEFORE_BUILD_WINDOWS': '''python -c "import sys; open('c:\\pythonversion.txt', 'w').write(sys.version)" && python -c "import sys; open('c:\\pythonexecutable.txt', 'w').write(sys.executable)"''',
})
# also check that we got the right wheels
expected_wheels = utils.expected_wheels('spam', '0.1.0')
actual_wheels = os.listdir('wheelhouse')
assert set(actual_wheels) == set(expected_wheels)
+26
View File
@@ -0,0 +1,26 @@
from setuptools import setup, Extension
import sys, os
# assert that the Python version as written to pythonversion.txt in the CIBW_BEFORE_BUILD step
# is the same one as is currently running.
version_file = 'c:\\pythonversion.txt' if sys.platform == 'win32' else '/tmp/pythonversion.txt'
with open(version_file) as f:
stored_version = f.read()
print('stored_version', stored_version)
print('sys.version', sys.version)
assert stored_version == sys.version
# check that the executable also was written
executable_file = 'c:\\pythonexecutable.txt' if sys.platform == 'win32' else '/tmp/pythonexecutable.txt'
with open(executable_file) as f:
stored_executable = f.read()
print('stored_executable', stored_executable)
print('sys.executable', sys.executable)
# windows/mac are case insensitive
assert os.path.realpath(stored_executable).lower() == os.path.realpath(sys.executable).lower()
setup(
name="spam",
ext_modules=[Extension('spam', sources=['spam.c'])],
version="0.1.0",
)
+48
View File
@@ -0,0 +1,48 @@
#include <Python.h>
static PyObject *
spam_system(PyObject *self, PyObject *args)
{
const char *command;
int sts;
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
sts = system(command);
return PyLong_FromLong(sts);
}
/* Module initialization */
#if PY_MAJOR_VERSION >= 3
#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void)
#define MOD_DEF(m, name, doc, methods, module_state_size) \
static struct PyModuleDef moduledef = { \
PyModuleDef_HEAD_INIT, name, doc, module_state_size, methods, }; \
m = PyModule_Create(&moduledef);
#define MOD_RETURN(m) return m;
#else
#define MOD_INIT(name) PyMODINIT_FUNC init##name(void)
#define MOD_DEF(m, name, doc, methods, module_state_size) \
m = Py_InitModule3(name, methods, doc);
#define MOD_RETURN(m) return;
#endif
static PyMethodDef module_methods[] = {
{"system", (PyCFunction)spam_system, METH_VARARGS,
"Execute a shell command."},
{NULL} /* Sentinel */
};
MOD_INIT(spam)
{
PyObject* m;
MOD_DEF(m,
"spam",
"Example module",
module_methods,
-1)
MOD_RETURN(m)
}
+17
View File
@@ -0,0 +1,17 @@
import os
import utils
def test():
project_dir = os.path.dirname(__file__)
# build the wheels
utils.cibuildwheel_run(project_dir, add_env={
'CIBW_BUILD': 'cp3?-*',
'CIBW_SKIP': 'cp37-*',
})
# check that we got the right wheels. There should be no 2.7 or 3.7.
expected_wheels = [w for w in utils.expected_wheels('spam', '0.1.0')
if ('-cp3' in w) and ('-cp37' not in w)]
actual_wheels = os.listdir('wheelhouse')
assert set(actual_wheels) == set(expected_wheels)
+14
View File
@@ -0,0 +1,14 @@
from setuptools import setup, Extension
import sys
# explode if run on Python 2.7 or Python 3.4 (these should be skipped)
if sys.version_info[0:2] == (2, 7):
raise Exception('Python 2.7 should not be built')
if sys.version_info[0:2] == (3, 4):
raise Exception('Python 3.4 should be skipped')
setup(
name="spam",
ext_modules=[Extension('spam', sources=['spam.c'])],
version="0.1.0",
)
+48
View File
@@ -0,0 +1,48 @@
#include <Python.h>
static PyObject *
spam_system(PyObject *self, PyObject *args)
{
const char *command;
int sts;
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
sts = system(command);
return PyLong_FromLong(sts);
}
/* Module initialization */
#if PY_MAJOR_VERSION >= 3
#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void)
#define MOD_DEF(m, name, doc, methods, module_state_size) \
static struct PyModuleDef moduledef = { \
PyModuleDef_HEAD_INIT, name, doc, module_state_size, methods, }; \
m = PyModule_Create(&moduledef);
#define MOD_RETURN(m) return m;
#else
#define MOD_INIT(name) PyMODINIT_FUNC init##name(void)
#define MOD_DEF(m, name, doc, methods, module_state_size) \
m = Py_InitModule3(name, methods, doc);
#define MOD_RETURN(m) return;
#endif
static PyMethodDef module_methods[] = {
{"system", (PyCFunction)spam_system, METH_VARARGS,
"Execute a shell command."},
{NULL} /* Sentinel */
};
MOD_INIT(spam)
{
PyObject* m;
MOD_DEF(m,
"spam",
"Example module",
module_methods,
-1)
MOD_RETURN(m)
}
+18
View File
@@ -0,0 +1,18 @@
import os
import utils
def test():
project_dir = os.path.dirname(__file__)
# write some information into the CIBW_ENVIRONMENT, for expansion and
# insertion into the environment by cibuildwheel. This is checked
# in setup.py
utils.cibuildwheel_run(project_dir, add_env={
'CIBW_ENVIRONMENT': '''CIBW_TEST_VAR="a b c" CIBW_TEST_VAR_2=1 CIBW_TEST_VAR_3="$(echo 'test string 3')" PATH=$PATH:/opt/cibw_test_path''',
'CIBW_ENVIRONMENT_WINDOWS': '''CIBW_TEST_VAR="a b c" CIBW_TEST_VAR_2=1 CIBW_TEST_VAR_3="$(echo 'test string 3')" PATH="$PATH;/opt/cibw_test_path"''',
})
# also check that we got the right wheels built
expected_wheels = utils.expected_wheels('spam', '0.1.0')
actual_wheels = os.listdir('wheelhouse')
assert set(actual_wheels) == set(expected_wheels)
+23
View File
@@ -0,0 +1,23 @@
from setuptools import setup, Extension
import sys, os
# explode if environment isn't correct, as set in CIBW_ENVIRONMENT
CIBW_TEST_VAR = os.environ.get('CIBW_TEST_VAR')
CIBW_TEST_VAR_2 = os.environ.get('CIBW_TEST_VAR_2')
PATH = os.environ.get('PATH')
if CIBW_TEST_VAR != 'a b c':
raise Exception('CIBW_TEST_VAR should equal "a b c". It was "%s"' % CIBW_TEST_VAR)
if CIBW_TEST_VAR_2 != '1':
raise Exception('CIBW_TEST_VAR_2 should equal "1". It was "%s"' % CIBW_TEST_VAR_2)
if '/opt/cibw_test_path' not in PATH:
raise Exception('PATH should contain "/opt/cibw_test_path". It was "%s"' % PATH)
if '$PATH' in PATH:
raise Exception('$PATH should be expanded in PATH. It was "%s"' % PATH)
setup(
name="spam",
ext_modules=[Extension('spam', sources=['spam.c'])],
version="0.1.0",
)
+48
View File
@@ -0,0 +1,48 @@
#include <Python.h>
static PyObject *
spam_system(PyObject *self, PyObject *args)
{
const char *command;
int sts;
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
sts = system(command);
return PyLong_FromLong(sts);
}
/* Module initialization */
#if PY_MAJOR_VERSION >= 3
#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void)
#define MOD_DEF(m, name, doc, methods, module_state_size) \
static struct PyModuleDef moduledef = { \
PyModuleDef_HEAD_INIT, name, doc, module_state_size, methods, }; \
m = PyModule_Create(&moduledef);
#define MOD_RETURN(m) return m;
#else
#define MOD_INIT(name) PyMODINIT_FUNC init##name(void)
#define MOD_DEF(m, name, doc, methods, module_state_size) \
m = Py_InitModule3(name, methods, doc);
#define MOD_RETURN(m) return;
#endif
static PyMethodDef module_methods[] = {
{"system", (PyCFunction)spam_system, METH_VARARGS,
"Execute a shell command."},
{NULL} /* Sentinel */
};
MOD_INIT(spam)
{
PyObject* m;
MOD_DEF(m,
"spam",
"Example module",
module_methods,
-1)
MOD_RETURN(m)
}
@@ -0,0 +1,21 @@
import os, pytest
import utils
def test():
project_dir = os.path.dirname(__file__)
if utils.platform != 'linux':
pytest.skip('the test is only relevant to the linux build')
utils.cibuildwheel_run(project_dir, add_env={
'CIBW_MANYLINUX_X86_64_IMAGE': 'dockcross/manylinux2010-x64',
'CIBW_MANYLINUX_I686_IMAGE': 'dockcross/manylinux1-x86',
'CIBW_BEFORE_BUILD': '/opt/python/cp36-cp36m/bin/pip install -U auditwheel', # Currently necessary on dockcross images to get auditwheel 2.1 supporting AUDITWHEEL_PLAT
'CIBW_ENVIRONMENT': 'AUDITWHEEL_PLAT=`if [ $(uname -i) == "x86_64" ]; then echo "manylinux2010_x86_64"; else echo "manylinux1_i686"; fi`',
})
# also check that we got the right wheels built
expected_wheels = [w for w in utils.expected_wheels('spam', '0.1.0')
if '-manylinux2010_i686' not in w]
actual_wheels = os.listdir('wheelhouse')
assert set(actual_wheels) == set(expected_wheels)
+14
View File
@@ -0,0 +1,14 @@
import os, sys
from setuptools import setup, Extension
# check that we're running in the correct docker image as specified in the
# environment options CIBW_MANYLINUX1_*_IMAGE
if 'linux' in sys.platform and not os.path.exists('/dockcross'):
raise Exception('/dockcross directory not found. Is this test running in the correct docker image?')
setup(
name="spam",
ext_modules=[Extension('spam', sources=['spam.c'])],
version="0.1.0",
)
+48
View File
@@ -0,0 +1,48 @@
#include <Python.h>
static PyObject *
spam_system(PyObject *self, PyObject *args)
{
const char *command;
int sts;
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
sts = system(command);
return PyLong_FromLong(sts);
}
/* Module initialization */
#if PY_MAJOR_VERSION >= 3
#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void)
#define MOD_DEF(m, name, doc, methods, module_state_size) \
static struct PyModuleDef moduledef = { \
PyModuleDef_HEAD_INIT, name, doc, module_state_size, methods, }; \
m = PyModule_Create(&moduledef);
#define MOD_RETURN(m) return m;
#else
#define MOD_INIT(name) PyMODINIT_FUNC init##name(void)
#define MOD_DEF(m, name, doc, methods, module_state_size) \
m = Py_InitModule3(name, methods, doc);
#define MOD_RETURN(m) return;
#endif
static PyMethodDef module_methods[] = {
{"system", (PyCFunction)spam_system, METH_VARARGS,
"Execute a shell command."},
{NULL} /* Sentinel */
};
MOD_INIT(spam)
{
PyObject* m;
MOD_DEF(m,
"spam",
"Example module",
module_methods,
-1)
MOD_RETURN(m)
}
+9
View File
@@ -0,0 +1,9 @@
import os
import utils
def test():
project_dir = os.path.dirname(__file__)
# this test checks that SSL is working in the build environment using
# some checks in setup.py.
utils.cibuildwheel_run(project_dir)
+20
View File
@@ -0,0 +1,20 @@
import ssl
import sys
from setuptools import setup, Extension
if sys.version_info[0] == 2:
from urllib2 import urlopen
else:
from urllib.request import urlopen
if sys.version_info[0:2] == (3, 3):
data = urlopen('https://www.nist.gov')
else:
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
data = urlopen('https://www.nist.gov', context=context)
setup(
name="spam",
ext_modules=[Extension('spam', sources=['spam.c'])],
version="0.1.0",
)
+48
View File
@@ -0,0 +1,48 @@
#include <Python.h>
static PyObject *
spam_system(PyObject *self, PyObject *args)
{
const char *command;
int sts;
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
sts = system(command);
return PyLong_FromLong(sts);
}
/* Module initialization */
#if PY_MAJOR_VERSION >= 3
#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void)
#define MOD_DEF(m, name, doc, methods, module_state_size) \
static struct PyModuleDef moduledef = { \
PyModuleDef_HEAD_INIT, name, doc, module_state_size, methods, }; \
m = PyModule_Create(&moduledef);
#define MOD_RETURN(m) return m;
#else
#define MOD_INIT(name) PyMODINIT_FUNC init##name(void)
#define MOD_DEF(m, name, doc, methods, module_state_size) \
m = Py_InitModule3(name, methods, doc);
#define MOD_RETURN(m) return;
#endif
static PyMethodDef module_methods[] = {
{"system", (PyCFunction)spam_system, METH_VARARGS,
"Execute a shell command."},
{NULL} /* Sentinel */
};
MOD_INIT(spam)
{
PyObject* m;
MOD_DEF(m,
"spam",
"Example module",
module_methods,
-1)
MOD_RETURN(m)
}
@@ -0,0 +1,21 @@
import os, pytest
import utils
def test():
project_dir = os.path.dirname(__file__)
if utils.platform != 'linux':
pytest.skip('the docker test is only relevant to the linux build')
# build the wheels
# CFLAGS environment veriable is ecessary to fail on 'malloc_info' (on manylinux1) during compilation/linking,
# rather than when dynamically loading the Python
utils.cibuildwheel_run(project_dir, add_env={
'CIBW_ENVIRONMENT': 'CFLAGS="$CFLAGS -Werror=implicit-function-declaration"',
})
# also check that we got the right wheels
expected_wheels = [w for w in utils.expected_wheels('spam', '0.1.0')
if not '-manylinux' in w or '-manylinux2010' in w]
actual_wheels = os.listdir('wheelhouse')
assert set(actual_wheels) == set(expected_wheels)
+7
View File
@@ -0,0 +1,7 @@
from setuptools import setup, Extension
setup(
name="spam",
ext_modules=[Extension('spam', sources=['spam.c'])],
version="0.1.0",
)
+57
View File
@@ -0,0 +1,57 @@
#include <Python.h>
#if defined(__linux__)
#include <malloc.h>
#endif
static PyObject *
spam_system(PyObject *self, PyObject *args)
{
const char *command;
int sts = 0;
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
#if defined(__linux__)
sts = malloc_info(0, stdout);
#endif
if (sts == 0) {
sts = system(command);
}
return PyLong_FromLong(sts);
}
/* Module initialization */
#if PY_MAJOR_VERSION >= 3
#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void)
#define MOD_DEF(m, name, doc, methods, module_state_size) \
static struct PyModuleDef moduledef = { \
PyModuleDef_HEAD_INIT, name, doc, module_state_size, methods, }; \
m = PyModule_Create(&moduledef);
#define MOD_RETURN(m) return m;
#else
#define MOD_INIT(name) PyMODINIT_FUNC init##name(void)
#define MOD_DEF(m, name, doc, methods, module_state_size) \
m = Py_InitModule3(name, methods, doc);
#define MOD_RETURN(m) return;
#endif
static PyMethodDef module_methods[] = {
{"system", (PyCFunction)spam_system, METH_VARARGS,
"Execute a shell command."},
{NULL} /* Sentinel */
};
MOD_INIT(spam)
{
PyObject* m;
MOD_DEF(m,
"spam",
"Example module",
module_methods,
-1)
MOD_RETURN(m)
}
+119
View File
@@ -0,0 +1,119 @@
'''
Utility functions used by the cibuildwheel tests.
This file is added to the PYTHONPATH in the test runner at bin/run_test.py.
'''
import subprocess, sys, os
IS_WINDOWS_RUNNING_ON_AZURE = os.path.exists('C:\\hostedtoolcache')
IS_WINDOWS_RUNNING_ON_TRAVIS = os.environ.get('TRAVIS_OS_NAME') == 'windows'
def cibuildwheel_get_build_identifiers(project_path, env=None):
'''
Returns the list of build identifiers that cibuildwheel will try to build
for the current platform.
'''
cmd_output = subprocess.check_output(
[sys.executable, '-m', 'cibuildwheel', '--print-build-identifiers', project_path],
universal_newlines=True,
env=env,
)
return cmd_output.strip().split('\n')
def cibuildwheel_run(project_path, env=None, add_env=None):
'''
Runs cibuildwheel as a subprocess, building the project at project_path.
Uses the current Python interpreter.
Configure settings using env.
'''
if env is None:
env = os.environ.copy()
if add_env is not None:
env.update(add_env)
subprocess.check_call(
[sys.executable, '-m', 'cibuildwheel', project_path],
env=env,
)
def expected_wheels(package_name, package_version):
'''
Returns a list of expected wheels from a run of cibuildwheel.
'''
if platform == 'linux':
templates = [
'{package_name}-{package_version}-cp27-cp27m-manylinux1_x86_64.whl',
'{package_name}-{package_version}-cp27-cp27mu-manylinux1_x86_64.whl',
'{package_name}-{package_version}-cp35-cp35m-manylinux1_x86_64.whl',
'{package_name}-{package_version}-cp36-cp36m-manylinux1_x86_64.whl',
'{package_name}-{package_version}-cp37-cp37m-manylinux1_x86_64.whl',
'{package_name}-{package_version}-cp38-cp38-manylinux1_x86_64.whl',
'{package_name}-{package_version}-cp27-cp27m-manylinux2010_x86_64.whl',
'{package_name}-{package_version}-cp27-cp27mu-manylinux2010_x86_64.whl',
'{package_name}-{package_version}-cp35-cp35m-manylinux2010_x86_64.whl',
'{package_name}-{package_version}-cp36-cp36m-manylinux2010_x86_64.whl',
'{package_name}-{package_version}-cp37-cp37m-manylinux2010_x86_64.whl',
'{package_name}-{package_version}-cp38-cp38-manylinux2010_x86_64.whl',
'{package_name}-{package_version}-cp27-cp27m-manylinux1_i686.whl',
'{package_name}-{package_version}-cp27-cp27mu-manylinux1_i686.whl',
'{package_name}-{package_version}-cp35-cp35m-manylinux1_i686.whl',
'{package_name}-{package_version}-cp36-cp36m-manylinux1_i686.whl',
'{package_name}-{package_version}-cp37-cp37m-manylinux1_i686.whl',
'{package_name}-{package_version}-cp38-cp38-manylinux1_i686.whl',
'{package_name}-{package_version}-cp27-cp27m-manylinux2010_i686.whl',
'{package_name}-{package_version}-cp27-cp27mu-manylinux2010_i686.whl',
'{package_name}-{package_version}-cp35-cp35m-manylinux2010_i686.whl',
'{package_name}-{package_version}-cp36-cp36m-manylinux2010_i686.whl',
'{package_name}-{package_version}-cp37-cp37m-manylinux2010_i686.whl',
'{package_name}-{package_version}-cp38-cp38-manylinux2010_i686.whl',
]
elif platform == 'windows':
templates = [
'{package_name}-{package_version}-cp27-cp27m-win32.whl',
'{package_name}-{package_version}-cp35-cp35m-win32.whl',
'{package_name}-{package_version}-cp36-cp36m-win32.whl',
'{package_name}-{package_version}-cp37-cp37m-win32.whl',
'{package_name}-{package_version}-cp38-cp38-win32.whl',
'{package_name}-{package_version}-cp27-cp27m-win_amd64.whl',
'{package_name}-{package_version}-cp35-cp35m-win_amd64.whl',
'{package_name}-{package_version}-cp36-cp36m-win_amd64.whl',
'{package_name}-{package_version}-cp37-cp37m-win_amd64.whl',
'{package_name}-{package_version}-cp38-cp38-win_amd64.whl',
]
elif platform == 'macos':
templates = [
'{package_name}-{package_version}-cp27-cp27m-macosx_10_6_intel.whl',
'{package_name}-{package_version}-cp35-cp35m-macosx_10_6_intel.whl',
'{package_name}-{package_version}-cp36-cp36m-macosx_10_6_intel.whl',
'{package_name}-{package_version}-cp37-cp37m-macosx_10_6_intel.whl',
'{package_name}-{package_version}-cp38-cp38-macosx_10_9_x86_64.whl',
]
else:
raise Exception('unsupported platform')
if IS_WINDOWS_RUNNING_ON_TRAVIS:
# Python 2.7 isn't supported on Travis.
templates = [t for t in templates if '-cp27-' not in t]
return [filename.format(package_name=package_name, package_version=package_version)
for filename in templates]
platform = None
if 'CIBW_PLATFORM' in os.environ:
platform = os.environ['CIBW_PLATFORM']
elif sys.platform.startswith('linux'):
platform = 'linux'
elif sys.platform.startswith('darwin'):
platform = 'macos'
elif sys.platform in ['win32', 'cygwin']:
platform = 'windows'
else:
raise Exception('Unsupported platform')
+61
View File
@@ -0,0 +1,61 @@
from cibuildwheel.util import BuildSelector
def test_build():
build_selector = BuildSelector(build_config="cp3?-* *-manylinux1*", skip_config="")
assert build_selector('cp27-manylinux1_x86_64')
assert build_selector('cp36-manylinux1_x86_64')
assert build_selector('cp37-manylinux1_x86_64')
assert build_selector('cp27-manylinux1_i686')
assert build_selector('cp36-manylinux1_i686')
assert build_selector('cp37-manylinux1_i686')
assert not build_selector('cp27-macosx_10_6_intel')
assert build_selector('cp36-macosx_10_6_intel')
assert build_selector('cp37-macosx_10_6_intel')
assert not build_selector('cp27-win32')
assert build_selector('cp36-win32')
assert build_selector('cp37-win32')
assert not build_selector('cp27-win_amd64')
assert build_selector('cp36-win_amd64')
assert build_selector('cp37-win_amd64')
def test_skip():
build_selector = BuildSelector(build_config="*", skip_config="cp27-* cp3?-manylinux1_i686 cp36-win* *-win32")
assert not build_selector('cp27-manylinux1_x86_64')
assert build_selector('cp36-manylinux1_x86_64')
assert build_selector('cp37-manylinux1_x86_64')
assert not build_selector('cp27-manylinux1_i686')
assert not build_selector('cp36-manylinux1_i686')
assert not build_selector('cp37-manylinux1_i686')
assert not build_selector('cp27-macosx_10_6_intel')
assert build_selector('cp36-macosx_10_6_intel')
assert build_selector('cp37-macosx_10_6_intel')
assert not build_selector('cp27-win32')
assert not build_selector('cp36-win32')
assert not build_selector('cp37-win32')
assert not build_selector('cp27-win_amd64')
assert not build_selector('cp36-win_amd64')
assert build_selector('cp37-win_amd64')
def test_build_and_skip():
build_selector = BuildSelector(build_config="cp36-* cp37-macosx* *-manylinux1*", skip_config="cp27-* cp37-manylinux1_i686")
assert not build_selector('cp27-manylinux1_x86_64')
assert build_selector('cp36-manylinux1_x86_64')
assert build_selector('cp37-manylinux1_x86_64')
assert not build_selector('cp27-manylinux1_i686')
assert build_selector('cp36-manylinux1_i686')
assert not build_selector('cp37-manylinux1_i686')
assert not build_selector('cp27-macosx_10_6_intel')
assert build_selector('cp36-macosx_10_6_intel')
assert build_selector('cp37-macosx_10_6_intel')
assert not build_selector('cp27-win32')
assert build_selector('cp36-win32')
assert not build_selector('cp37-win32')
assert not build_selector('cp27-win_amd64')
assert build_selector('cp36-win_amd64')
assert not build_selector('cp37-win_amd64')
+88
View File
@@ -0,0 +1,88 @@
import os
from cibuildwheel.environment import parse_environment
def test_basic_parsing():
environment_recipe = parse_environment('VAR=1 VBR=2')
environment_dict = environment_recipe.as_dictionary(
prev_environment={}
)
environment_cmds = environment_recipe.as_shell_commands()
assert environment_dict == {'VAR': '1', 'VBR': '2'}
assert environment_cmds == ['export VAR=1', 'export VBR=2']
def test_quotes():
environment_recipe = parse_environment('A=1 VAR="1 NOT_A_VAR=2" VBR=\'vbr\'')
environment_dict = environment_recipe.as_dictionary(
prev_environment={}
)
environment_cmds = environment_recipe.as_shell_commands()
assert environment_dict == {'A': '1', 'VAR': '1 NOT_A_VAR=2', 'VBR': 'vbr'}
assert environment_cmds == ['export A=1', 'export VAR="1 NOT_A_VAR=2"', 'export VBR=\'vbr\'']
def test_inheritance():
environment_recipe = parse_environment('PATH=$PATH:/usr/local/bin')
environment_dict = environment_recipe.as_dictionary(
prev_environment={'PATH': '/usr/bin'}
)
environment_cmds = environment_recipe.as_shell_commands()
assert environment_dict == {'PATH': '/usr/bin:/usr/local/bin'}
assert environment_cmds == ['export PATH=$PATH:/usr/local/bin']
def test_shell_eval():
environment_recipe = parse_environment('VAR="$(echo "a test" string)"')
env_copy = os.environ.copy()
env_copy.pop('VAR', None)
environment_dict = environment_recipe.as_dictionary(
prev_environment=env_copy
)
environment_cmds = environment_recipe.as_shell_commands()
assert environment_dict['VAR'] == 'a test string'
assert environment_cmds == ['export VAR="$(echo "a test" string)"']
def test_shell_eval_and_env():
environment_recipe = parse_environment('VAR="$(echo "$PREV_VAR" string)"')
environment_dict = environment_recipe.as_dictionary(
prev_environment={'PREV_VAR': '1 2 3'}
)
environment_cmds = environment_recipe.as_shell_commands()
assert environment_dict == {'PREV_VAR': '1 2 3', 'VAR': '1 2 3 string'}
assert environment_cmds == ['export VAR="$(echo "$PREV_VAR" string)"']
def test_empty_var():
environment_recipe = parse_environment('CFLAGS=')
environment_dict = environment_recipe.as_dictionary(
prev_environment={'CFLAGS': '-Wall'}
)
environment_cmds = environment_recipe.as_shell_commands()
assert environment_dict == {'CFLAGS': ''}
assert environment_cmds == ['export CFLAGS=']
def test_no_vars():
environment_recipe = parse_environment('')
environment_dict = environment_recipe.as_dictionary(prev_environment={})
environment_cmds = environment_recipe.as_shell_commands()
assert environment_dict == {}
assert environment_cmds == []
def test_no_vars_pass_through():
environment_recipe = parse_environment('')
environment_dict = environment_recipe.as_dictionary(prev_environment={'CIBUILDWHEEL': 'awesome'})
assert environment_dict == {'CIBUILDWHEEL': 'awesome'}