Release Notes

This is the list of changes to scikit-build between each release. For full details, see the commit logs at

Next Release

Bug fixes

  • Fixed a regression that caused setuptools to complain about unknown setup option (cmake_process_manifest_hook).

  • Hide the warning that shows up when SKBUILD is unused.

  • If it applies, ensure generator toolset is used to configure the project. Thanks @YannickJadoul for the contribution. See #526.


  • Update Conda: Step-by-step release guide available in Making a release section.

  • Update links to CMake documentation pages in :doc:/generators.


  • Fix linting error F522 reported with flake8 >= 3.8.x. Thanks @benbovy for the contribution. See #494.

Scikit-build 0.11.1

Bug fixes


  • Fix link in Conda: Step-by-step release guide available in Making a release section.

Scikit-build 0.11.0

New Features

  • Add a hook to process the cmake install manifest building the wheel. The hook function can be specified as an argument to the setup() function. This can be used e.g. to prevent installing cmake configuration files, headers, or static libraries with the wheel. Thanks @SylvainCorlay for the contribution. See #473.

  • Add support for passing CMake configure options like -DFOO:STRING:bar as global setuptools or pip options.

  • Add support for building project using PyPy or PyPy3. See See #407.

  • Add support for OS/400 (now known as IBM i). Thanks @jwoehr for the contribution. See #444.

  • Display CMake command used to configure the project. Thanks @native-api for the contribution. See #443.

  • CMake modules:

    • Improve CMake module F2PY adding add_f2py_target() CMake function allowing to generate *-f2pywrappers.f and *module.c files from *.pyf files. Thanks @xoviat for the contribution.

    • Update CMake module PythonExtensions adding add_python_library() and add_python_extension(). Thanks @xoviat for the contribution.

Bug fixes

  • Fix python 2.7 installation ensuring setuptools < 45 is required. See #478.

  • Fix unclosed file resource in skbuild.cmaker.CMaker.check_for_bad_installs(). Thanks @Nic30 for the suggestion. See #429.

  • Update CMake module PythonExtensions:

    • Ensure correct suffix is used for compiled python module on windows. See #383.

    • Fix warning using EXT_SUFFIX config variable instead of deprecated SO variable. See #381.

  • Honor the MACOSX_DEPLOYMENT_TARGET environment variable if it is defined on macOS. Thanks @certik for the contribution. See #441.

  • Fix CMake module F2PY to ensure the f2py executable specific to the python version being used is found. See #449. Thanks @bnavigator for the contribution.

  • Replace platform.linux_distribution() which was removed in Python 3.8 by a call to This adds the distro package as dependency. See #458. Thanks @bnavigator for the contribution.


  • Add Notes section to the For maintainers top-level category that includes a comparison between sysconfig and distutils.sysconfig modules.

  • Remove obsolete comment in See #439. Thanks @isuruf


  • Update initialize_git_repo_and_commit() to prevent signing message on system with commit signing enabled globally.

Scikit-build 0.10.0

New Features

  • Improve message displayed when discovering a working environment for building projects. For example, instead of displaying -- Trying "Ninja" generator, it now displays a message like -- Trying "Ninja (Visual Studio 15 2017 Win64 v140)" generator.

Bug fixes

  • Checking generator candidates can now handle handle paths and binaries with spaces, so that --cmake-executable "C:/Program Files (x86)/cmake/cmake.exe" works as expected. Contributed by @jokva. See #400.

  • Fix sdist command to ensure symlinks in original source tree are maintained. Contributed by @anibali. See #401.

  • Ensure use of bdist_egg or bdist_rpm commands trigger build using cmake.

  • Fix default value returned by skbuild.constants.skbuild_plat_name() on macOS. See #417.

Internal API

  • Add



  • Introduce check_sdist_content() and fix tests that are checking content of sdist to account for changes introduced in Python 3.8 and backported to python 2.7, 3.6 and 3.7. The changes introduced in python/cpython#9419 adds directory entries to ZIP files created by distutils. Thanks @anibali for the contribution. See #404.

  • Fix check_wheel_content() to consider changes in 0.33.1 < wheel.__version__ < 0.33.4 where directory entries are included when building wheel. See pypa/wheel#294 <>.

  • Fix reporting of AssertionError raised in check_wheel_content() function by relocating the source code into a dedicated module tests.pytest_helpers and by adding a configuration file registering it for pytest assertion rewriting. See and #403.

  • Fix test_generator_selection when building with “Visual C++ for Python 2.7” installed for all users. This addresses failure associated with win_c_compilervs2008cxx_compilervs2008python2.7 when running test in scikit-build-feedstock where “Visual C++ for Python 2.7” is installed using (vcpython27 chocolatey package.

  • Continuous Integration

    • Add support for Azure Pipelines for Python 3.7 32-bit and 64-bit

    • AppVeyor: Disable test for Python 3.7 32-bit and 64-bit.

    • CircleCI: Update version of docker images from jessie to stretch. This addresses issue circleci/circleci-images#370.

    • TravisCI: Remove obsolete Python 3.4 testing. It reached end-of-life on March 18 2019.

Scikit-build 0.9.0

New Features

  • Add support for building distutils based extensions associated with ext_modules setup keyword along side skbuild based extensions. This means using build_ext command (and associated --inplace argument) is supported. Thanks @Erotemic for the contribution. See #284.

Bug fixes

  • Fix build of wheels if path includes spaces. See issue #375. Thanks @padraic-padraic for the contribution.

  • Ensure wheel platform name is correctly set when providing custom CMAKE_OSX_DEPLOYMENT_TARGET and CMAKE_OSX_ARCHITECTURES values are provided. Thanks @nonhermitian for the contribution. See #377.

  • Fix testing with recent version of pytest by updating the pytest-runner requirements expression in Thanks @mackelab for the contribution.

Scikit-build 0.8.1

Bug fixes

  • Fix bdist_wheel command to support wheel >= 0.32.0. Thanks @fbudin69500 for reporting issue #360.


  • Fix updating use of Path.files() and requiring>=11.5.0.

Scikit-build 0.8.0

New Features

  • Introduced skbuild.constants.CMAKE_DEFAULT_EXECUTABLE to facilitate distribution of scikit-build in package manager like Nixpkgs where all paths to dependencies are hardcoded. Suggested by @FRidh.

  • Setup keywords:

    • If not already set, zip_safe option is set to False. Suggested by @blowekamp.

  • Add support for --skip-generator-test when a generator is explicitly selected using --generator. This allows to speed up overall build when the build environment is known.

Bug fixes

  • Fix support for building project with CMake source directory outside of the directory. See #335 fixed by @massich.

  • Fix reading of .cmake files having any character not available in CP-1252 (the default code page on windows). See #334 fixed by @bgermann.

  • Fix parsing of macOS specific arguments like --plat-name macosx-X.Y-x86_64 and -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=X.Y and ensure that the ones specified as command line arguments override the default values or the one hard-coded in the cmake_args setup keyword. Thanks @yonip for the help addressing #342.

  • Support case where relative directory set in package_dir has an ending slash. For example, specifying package_dir={'awesome': 'src/awesome/'}, is now properly handled.

  • Fix support for isolated build environment ensuring the CMake project is reconfigured when pip install -e . is called multiple times. See #352.



  • Add check_wheel_content utility function.

  • Skip test_setup_requires_keyword_include_cmake if running in conda test environment or if is not reachable. Suggested by @Luthaf.

  • Continuous Integration

    • TravisCI:

      • Remove testing of linux now covered by CircleCI, add testing for Python 3.5, 3.6 and 3.7 on macOS.

      • Ensure system python uses latest version of pip

    • AppVeyor, CircleCI: Add testing for Python 3.7

    • Remove uses of unneeded $<RUN_ENV> command wrapper. scikit-build should already take care of setting up the expected environment.

    • Always install up-to-date scikit-ci and scikit-ci-addons.

    • Simplify release process managing versioning with python-versioneer and update Making a release documentation.

Scikit-build 0.7.1


  • Fix description and classifier list in

  • Fix link in README.

Scikit-build 0.7.0

New Features

  • Faster incremental build by re-configuring the project only if needed. This was achieved by (1) adding support to retrieve the environment mapping associated with the generator set in the CMakeCache.txt file, (2) introducing a CMake spec file storing the CMake version as well as the the CMake arguments and (3) re-configuring only if either the generator or the CMake specs change. Thanks @xoviat for the contribution. See #301.

  • CMake modules:

    • CMake module PythonExtensions: Set symbol visibility to export only the module init function. This applies to GNU and MSVC compilers. Thanks @xoviat. See #299.

    • Add CMake module F2PY useful to find the f2py executable for building Python extensions with Fortran. Thanks to @xoviat for moving forward with the integration. Concept for the module comes from the work of @scopatz done in PyNE project. See #273.

    • Update CMake module NumPy setting variables NumPy_CONV_TEMPLATE_EXECUTABLE and NumPy_FROM_TEMPLATE_EXECUTABLE. Thanks @xoviat for the contribution. See #278.

  • Setup keywords:

    • Add support for cmake_languages setup keyword.

    • Add support for include_package_data and exclude_package_data setup keywords as well as parsing of See #315. Thanks @reiver-dev for reporting the issue.

    • Add support for cmake_minimum_required_version setup keyword. See #312. Suggested by @henryiii.

    • Install cmake if found in setup_requires list. See #313. Suggested by @henryiii.

  • Add support for --cmake-executable scikit-build command line option. Thanks @henryborchers for the suggestion. See #317.

  • Use _skbuild/platform-X.Y instead of _skbuild to build package. This allows to have a different build directory for each python version. Thanks @isuruf for the suggestion and @xoviat for contributing the feature. See #283.

  • Run cmake and develop command when command test is executed.

Bug fixes

  • Fix support of --hide-listing when building wheel.

  • CMake module Cython: Fix escaping of spaces associated with CYTHON_FLAGS when provided as command line arguments to the cython executable through CMake cache entries. See #265 fixed by @neok-m4700.

  • Ensure package data files specified in the setup() function using package_data keyword are packaged and installed.

  • Support specifying a default directory for all packages not already associated with one using syntax like package_dir={'':'src'} in Thanks @benjaminjack for reporting the issue. See #274.

  • Improve --skip-cmake command line option support so that it can re-generate a source distribution or a python wheel without having to run cmake executable to re-configure and build. Thanks to @jonwoodring for reporting the issue on the mailing list.

  • Set skbuild <version> as wheel generator. See PEP-0427 and #191.

  • Ensure is considered when generating source distribution. Thanks @seanlis for reporting the problem and providing an initial patch, and thanks @henryiii for implementing the corresponding test. See #260.

  • Support generation of source distribution for git repository having submodules. This works only for version of git >= 2.11 supporting the --recurse-submodules option with ls-files command.

Python Support

  • Tests using Python 3.3.x were removed and support for this version of python is not guaranteed anymore. Support was removed following the deprecation warnings reported by version 0.31.0 of wheel package, these were causing the tests test_source_distribution and test_wheel to fail.


  • Speedup execution of tests that do not require any CMake language enabled. This is achieved by (1) introducing the test project hello-no-language, (2) updating test utility functions execute_setup_py and project_setup_py_test to accept the optional parameter disable_languages_test allowing to skip unneeded compiler detection in test project used to verify that the selected CMake generator works as expected, and (3) updating relevant tests to use the new test project and parameters.

    Overall testing time on all continuous integration services was reduced:

    • AppVeyor:

      • from ~16 to ~7 minutes for 64 and 32-bit Python 2.7 tests done using Visual Studio Express 2008

      • from more than 2 hours to ~50 minutes for 64 and 32-bit Python 3.5 tests done using Visual Studio 2015. Improvement specific to Python 3.x were obtained by caching the results of slow calls to distutils.msvc9compiler.query_vcvarsall (for Python 3.3 and 3.4) and distutils._msvccompiler._get_vc_env (for Python 3.5 and above). These functions were called multiple times to create the list of used in

    • CircleCI: from ~7 to ~5 minutes.

    • TravisCI: from ~21 to ~10 minutes.

  • Update maximum line length specified in flake8 settings from 80 to 120 characters.

  • Add prepend_sys_path utility function.

  • Ensure that the project directory is prepended to sys.path when executing test building sample project with the help of execute_setup_py function.

  • Add codecov config file for better defaults and prevent associated Pull Request checks from reporting failure when coverage only slightly changes.



  • Fix miscellaneous pylint warnings.

Scikit-build 0.6.1

Bug fixes

  • Ensure CMake arguments passed to scikit-build and starting with -DCMAKE_* are passed to the test project allowing to determine which generator to use. For example, this ensures that arguments like -DCMAKE_MAKE_PROGRAM:FILEPATH=/path/to/program are passed. See #256.


  • Update Making a release section including instructions to update README.rst with up-to-date pypi download statistics based on Google big table.

Scikit-build 0.6.0

New features

  • Improve py_modules support: Python modules generated by CMake are now properly included in binary distribution.

  • Improve developer mode support for py_modules generated by CMake.

Bug fixes

  • Do not implicitly install python modules when the beginning of their name match a package explicitly listed. For example, if a project has a package foo/ and a module, and only package foo was listed in, is not installed anymore.

  • CMake module targetLinkLibrariesWithDynamicLookup: Fix the caching of dynamic lookup variables. See #240 fixed by @blowekamp.


  • wheel: As suggested by @thewtex, unpinning version of the package by requiring >=0.29.0 instead of ==0.29.0 will avoid uninstalling a newer version of wheel package on up-to-date system.



  • Extend test_hello, test_setup, and test_sdist_hide_listing to (1) check if python modules are packaged into source and wheel distributions and (2) check if python modules are copied into the source tree when developer mode is enabled.

Internal API

Scikit-build 0.5.1

Bug fixes

  • Ensure file copied in “develop” mode have “mode bits” maintained.

Scikit-build 0.5.0

New features

  • If available, uses Ninja build system generator on all platforms. An advantages is that ninja automatically parallelizes the build based on the number of CPUs.

  • Automatically set the expected Visual Studio environment when Ninja or NMake Makefiles generators are used.

  • Support Microsoft Visual C++ Compiler for Python 2.7. See #216.

  • Update long signature: <LinkFlagsVar> is now optional

  • Add support for short signature: check_dynamic_lookup(<ResultVar>). See SimpleITK/SimpleITK#80.

Bug fixes

  • Fix scikit-build source distribution and add test. See #214 Thanks @isuruf for reporting the issue.

  • Support building extension within a virtualenv on windows. See #119.


  • hacking:


  • setuptools: As suggested by @mivade in #212, remove the hard requirement for ==28.8.0 and require version >= 28.0.0. This allows to “play” nicely with conda where it is problematic to update the version of setuptools. See pypa/pip#2751 and ContinuumIO/anaconda-issues#542.


  • Improve “push_dir” tests to not rely on build directory name. Thanks @isuruf for reporting the issue.

  • travis/install_pyenv: Improve MacOSX build time updating scikit-ci-addons

  • Add get_cmakecache_variables utility function.

Internal API


  • appveyor.yml:

  • Remove unused “on_failure: event logging” and “notifications: GitHubPullRequest”

  • Remove unused SKIP env variable

Scikit-build 0.4.0

New features

  • Add support for --hide-listing option

  • allow to build distributions without displaying files being included

  • useful when building large project on Continuous Integration service limiting the amount of log produced by the build

  • CMake module: skbuild/resources/cmake/FindPythonExtensions.cmake

  • Function python_extension_module: add support for module suffix

Bug fixes

  • Do not package python modules under “purelib” dir in non-pure wheel

  • CMake module: skbuild/resources/cmake/targetLinkLibrariesWithDynamicLookup.cmake:

  • Fix the logic checking for cross-compilation (the regression was introduced by #51 and #47

  • It configure the text project setting CMAKE_ENABLE_EXPORTS to ON. Doing so ensure the executable compiled in the test exports symbols (if supported by the underlying platform)



  • tests/samples: Simplify project removing unneeded install rules and file copy

  • Simplify continuous integration

  • Makefile:

  • Fix coverage target

  • Add docs-only target allowing to regenerate the Sphinx documentation without opening a new page in the browser.

Scikit-build 0.3.0

New features

  • Improve support for “pure”, “CMake” and “hybrid” python package

  • a “pure” package is a python package that have all files living in the project source tree

  • an “hybrid” package is a python package that have some files living in the project source tree and some files installed by CMake

  • a “CMake” package is a python package that is fully generated and installed by CMake without any of his files existing in the source tree

  • Add support for source distribution. See #84

  • Add support for setup arguments specific to scikit-build:

  • cmake_args: additional option passed to CMake

  • cmake_install_dir: relative directory where the CMake project being built should be installed

  • cmake_source_dir: location of the CMake project

  • Add CMake module FindNumPy.cmake

  • Automatically set package_dir to reasonable defaults

  • Support building project without CMakeLists.txt

Bug fixes

  • Fix dispatch of arguments to setuptools, CMake and build tool. See #118

  • Force binary wheel generation. See #106

  • Fix support for py_modules (6716723)

  • Do not raise error if calling “clean” command twice



  • Ensure each test run in a dedicated temporary directory

  • Add tests to raise coverage from 70% to 91%

  • Refactor CI testing infrastructure introducing CI drivers written in python for AppVeyor, CircleCI and TravisCI

  • Switch from nose to py.test

  • Relocate sample projects into a dedicated home:


  • Refactor commands introducing set_build_base_mixin and new_style

  • Remove unused code