mirror of
https://github.com/CoolProp/CoolProp.git
synced 2026-04-23 03:00:17 -04:00
* Modernize Python build system to use scikit-build-core
This commit replaces the old setuptools-based build system with a modern
scikit-build-core + CMake build system for the Python bindings.
Key changes:
- Replace setup.py with pyproject.toml using scikit-build-core backend
- Create new CMakeLists.txt for Cython module compilation
- Add FindCython.cmake helper module
- Update README from .rst to .md format
- Enable incremental builds with proper CMake dependency tracking
- Support Python 3.8-3.14 with proper Cython directives
Benefits:
- Incremental builds work correctly (only rebuild changed files)
- Modern PEP 517/518 compliant build system
- Build artifacts cached in build/{wheel_tag} directories
- Better integration with pip and modern Python tooling
- No more need for custom _py_backend build hooks
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Add build-time file generation and ignore generated files
This commit adds the missing build-time steps from setup.py:
- Header generation from JSON files (generate_headers.py)
- Cython constants module generation (generate_constants_module.py)
- Copying headers, fmtlib, and BibTeX file to package directory
Also updates .gitignore to ignore:
- wrappers/Python/CoolProp/include/ (generated during build)
- wrappers/Python/CoolProp/CoolPropBibTeXLibrary.bib (copied during build)
Includes test script to verify wheel contents match between old and new build approaches.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Set CMAKE_POSITION_INDEPENDENT_CODE for shared library build
Enable -fPIC flag for all targets to ensure proper shared library compilation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Remove deprecated buildbot configuration
The buildbot system is deprecated and no longer in use.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Update extract_version.py to use .version file instead of setup.py
With the migration to scikit-build-core, version information is now stored
in the .version file and read by pyproject.toml. Updated the script to:
- Rename replace_setup_py() to replace_version_file()
- Update .version file instead of modifying setup.py
- Change --replace-setup-py flag to --replace-version
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Update build scripts and documentation for scikit-build-core
Changes:
- Updated documentation to show modern pip-based installation
- Updated manylinux build script to use pip wheel instead of setup.py
- Updated conda metadata generator to use pip install
- Removed deprecated PyPI preparation script (replaced by `python -m build --sdist`)
All build infrastructure now uses the new scikit-build-core build system.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Update manylinux Docker script for scikit-build-core
Removed SETUP_PY_ARGS since cmake options are no longer passed via
setup.py arguments. The new build system uses CMake directly via
scikit-build-core. Also fixed typo and updated install_root path.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Remove deprecated _py_backend custom build backend
The _py_backend was a custom setuptools build backend wrapper used
with the old setup.py build system. It's no longer needed with
scikit-build-core.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Add uv package manager documentation
Added section on using uv (Astral's fast Python package manager) to
install and work with CoolProp. Includes examples for:
- Installing in current environment
- Creating new projects with CoolProp
- Running scripts with automatic environment management
- Development installations from source
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix sdist packaging and update scikit-build-core config
Changes:
- Updated pyproject.toml to use newer scikit-build-core config syntax
- cmake.minimum-version → cmake.version
- cmake.verbose → build.verbose
- Added sdist.include to ensure .version file is in source distributions
- Added .version to MANIFEST.in for completeness
This fixes the issue where building a wheel from an sdist would fail
due to missing .version file. Now sdist → wheel builds work correctly.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Rename setup.py to deprecated_setup.py
The old setuptools-based build system has been fully replaced with
scikit-build-core. Renaming setup.py to deprecated_setup.py to:
- Clearly indicate it's no longer the primary build method
- Keep it available for reference and backward compatibility
- Prevent accidental use of the old build system
Users should now use: pip install .
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Update GitHub Actions workflows for new build system
Changes:
- Replace --replace-setup-py with --replace-version flag
- Update sdist build to use 'python -m build --sdist' instead of deprecated prepare_pypi.py
- Workflows now work with scikit-build-core build system
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix cibuildwheel to build from repository root
With scikit-build-core, the pyproject.toml is at the repository root,
not in wrappers/Python/. Updated cibuildwheel configuration:
- Changed package-dir from ./wrappers/Python/ to .
- Removed redundant CIBW_BEFORE_BUILD (dependencies are in pyproject.toml)
- Build dependencies are now automatically installed by pip from pyproject.toml
This fixes the "Multiple top-level packages discovered" error.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Set macOS deployment target to 11.0 in pyproject.toml
Configure MACOSX_DEPLOYMENT_TARGET=11.0 (Big Sur) in cibuildwheel config.
This matches the setting in GitHub Actions and ensures wheels are built
with consistent compatibility for macOS 11.0 and later.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Remove old pyproject.toml from wrappers/Python
This file was used by the old setuptools build system. With
scikit-build-core, the main pyproject.toml at the repository root
is now used for all Python packaging configuration.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Remove redundant PyPy skip selector from cibuildwheel
The 'pp*' skip selector was causing a warning because PyPy isn't enabled
in the build matrix anyway. Since we explicitly specify only CPython
versions in the build directive (cp38-*, cp39-*, etc.), the pp* skip is
unnecessary.
Fixes warning: "Invalid skip selector: 'pp*'. This selector matches a
group that wasn't enabled."
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Update fmtlib from 11.1.3 to 12.0.0
Updated the fmtlib submodule to the latest stable release (12.0.0).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Remove pdsim
---------
Co-authored-by: Claude <noreply@anthropic.com>
227 lines
5.9 KiB
Python
227 lines
5.9 KiB
Python
from jinja2 import Environment
|
|
import os, sys
|
|
import requests
|
|
import json
|
|
from distutils.version import LooseVersion # , StrictVersion
|
|
import codecs
|
|
|
|
""" A simple script to create a conda recipe and the infrastructure files for PyPI"""
|
|
|
|
first_line = "# CAUTION: This file is generated automatically, any customisation will be lost.\n"
|
|
|
|
python_dir = os.path.abspath(os.path.dirname(__file__))
|
|
target_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
|
|
|
|
pypi = False
|
|
local = not pypi
|
|
|
|
run_pkgs = ["numpy", "scipy", "matplotlib", "pandas"]
|
|
dev_pkgs = run_pkgs + ["cython"]
|
|
tst_pkgs = dev_pkgs + ["nose"]
|
|
|
|
if pypi:
|
|
# Get the additional information from PyPI
|
|
r = requests.get('https://pypi.python.org/pypi/CoolProp/json')
|
|
if(r.ok):
|
|
item = json.loads(r.text or r.content)
|
|
version = item['info']['version']
|
|
#version = sorted(item['releases'].keys())[-1]
|
|
home = item['info']['home_page']
|
|
license = 'MIT'
|
|
summary = item['info']['summary']
|
|
|
|
for u in item['urls']:
|
|
if u['python_version'] != 'source': continue
|
|
fil = u['filename']
|
|
url = u['url']
|
|
md5 = u['md5_digest']
|
|
continue
|
|
|
|
|
|
if local:
|
|
coolprop_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
|
|
sys.path.append(os.path.join(coolprop_dir, 'dev'))
|
|
import generate_headers
|
|
# Generate the headers - does nothing if up to date - but only if not pypi
|
|
generate_headers.generate()
|
|
del generate_headers
|
|
version = open(os.path.join(coolprop_dir, '.version'), 'r').read().strip()
|
|
home = "http://www.coolprop.org"
|
|
license = "MIT"
|
|
summary = "Open-source thermodynamic and transport properties database"
|
|
fil = None
|
|
url = None
|
|
md5 = None
|
|
|
|
local_info = dict(
|
|
pypi=pypi,
|
|
local=local,
|
|
version=version,
|
|
fil=fil,
|
|
url=url,
|
|
md5=md5,
|
|
run_pkgs=run_pkgs,
|
|
dev_pkgs=dev_pkgs,
|
|
tst_pkgs=tst_pkgs,
|
|
home=home,
|
|
license=license,
|
|
summary=summary
|
|
)
|
|
|
|
#######################
|
|
|
|
|
|
template = """{% for pkg in run_pkgs %}{{ pkg }}
|
|
{% endfor %}
|
|
"""
|
|
target = "requirements.txt"
|
|
template = Environment().from_string(template)
|
|
f = codecs.open(os.path.join(python_dir, target), mode='wb', encoding='utf-8')
|
|
f.write(first_line)
|
|
f.write(template.render(**local_info))
|
|
f.close()
|
|
|
|
|
|
template = """
|
|
package:
|
|
name: coolprop
|
|
version: {{ version }}
|
|
|
|
{% if pypi %}source:
|
|
fn: {{ fil }}
|
|
url: {{ url }}
|
|
md5: {{ md5 }}
|
|
{% endif %}
|
|
{% if local %}source:
|
|
path: .
|
|
{% endif %}
|
|
|
|
#build:
|
|
# script: python setup.py install [not win]
|
|
# script: "%PYTHON%" setup.py install & if errorlevel 1 exit 1 [win]
|
|
|
|
# If this is a new build for the same version, increment the build
|
|
# number. If you do not include this key, it defaults to 0.
|
|
# number: 1
|
|
|
|
requirements:
|
|
build:
|
|
- python
|
|
- setuptools{% for pkg in dev_pkgs %}
|
|
- {{ pkg -}}
|
|
{% endfor %}
|
|
|
|
run:
|
|
- python{% for pkg in run_pkgs %}
|
|
- {{ pkg -}}
|
|
{% endfor %}
|
|
|
|
test:
|
|
# Python imports
|
|
imports:
|
|
- CoolProp
|
|
# #- CoolProp.GUI
|
|
# #- CoolProp.Plots
|
|
# - CoolProp.tests
|
|
|
|
# commands:
|
|
# You can put test commands to be run here. Use this to test that the
|
|
# entry points work.
|
|
|
|
|
|
# You can also put a file called run_test.py in the recipe that will be run
|
|
# at test time.
|
|
|
|
requires:
|
|
# Put any additional test requirements here. For example
|
|
# - nose{% for pkg in tst_pkgs %}
|
|
- {{ pkg -}}
|
|
{% endfor %}
|
|
|
|
about:
|
|
home: {{ home }}
|
|
license: {{ license }}
|
|
summary: {{ summary }}
|
|
|
|
"""
|
|
target = 'meta.yaml'
|
|
template = Environment().from_string(template)
|
|
f = codecs.open(os.path.join(target_dir, target), mode='wb', encoding='utf-8')
|
|
f.write(first_line)
|
|
f.write(template.render(**local_info))
|
|
f.close()
|
|
|
|
template = """
|
|
"%PYTHON%" -m pip install . --no-deps --no-build-isolation -vv
|
|
if errorlevel 1 exit 1
|
|
|
|
:: Add more build steps here, if they are necessary.
|
|
|
|
:: See
|
|
:: http://docs.continuum.io/conda/build.html
|
|
:: for a list of environment variables that are set during the build process.
|
|
"""
|
|
target = "bld.bat"
|
|
f = codecs.open(os.path.join(target_dir, target), mode='wb', encoding='utf-8')
|
|
f.write(":: " + first_line)
|
|
f.write(template)
|
|
f.close()
|
|
|
|
template = """
|
|
$PYTHON -m pip install . --no-deps --no-build-isolation -vv
|
|
|
|
# Add more build steps here, if they are necessary.
|
|
|
|
# See
|
|
# http://docs.continuum.io/conda/build.html
|
|
# for a list of environment variables that are set during the build process.
|
|
"""
|
|
target = "build.sh"
|
|
f = codecs.open(os.path.join(target_dir, target), mode='wb', encoding='utf-8')
|
|
f.write("#!/bin/bash\n" + first_line)
|
|
f.write(template)
|
|
f.close()
|
|
|
|
|
|
template = """
|
|
from __future__ import print_function
|
|
import sys, shutil, subprocess, os, stat
|
|
#
|
|
def run_command(cmd):
|
|
'''given shell command, returns communication tuple of stdout and stderr'''
|
|
print(str(__file__)+": "+' '.join(cmd))
|
|
return subprocess.Popen(cmd,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
stdin=subprocess.PIPE).communicate()
|
|
#
|
|
tar = os.path.abspath(os.path.join(os.path.dirname(__file__),'install_root')).strip()
|
|
ver = sys.version_info
|
|
cmd = ['conda','build','--python',str(ver[0])+'.'+str(ver[1])]
|
|
print(run_command(['conda', 'clean', '-y', '-lts'])[0].decode("utf-8").strip())
|
|
filename = os.path.abspath(run_command(cmd+['--output','.'])[0].decode("utf-8").strip())
|
|
tar = os.path.join(tar,'Python_conda',os.path.basename(os.path.dirname(filename))).strip()
|
|
try:
|
|
subprocess.check_call(cmd+['.'], stdout=sys.stdout, stderr=sys.stderr)
|
|
except Exception as e:
|
|
print("conda build failed: "+str(e))
|
|
pass
|
|
try:
|
|
os.makedirs(tar)
|
|
except Exception as e:
|
|
if os.path.isdir(tar): pass
|
|
else: raise
|
|
try:
|
|
print("Copying: "+str(filename)+" to "+str(tar))
|
|
shutil.copy(filename,tar)
|
|
except Exception as e:
|
|
print("Copy operation failed: "+str(e))
|
|
pass
|
|
sys.exit(0)
|
|
"""
|
|
target = "runner.py"
|
|
f = codecs.open(os.path.join(target_dir, target), mode='wb', encoding='utf-8')
|
|
f.write(template)
|
|
f.close()
|
|
sys.exit(0)
|