elytra_client/build_wheel.py

152 lines
4.1 KiB
Python

#!/usr/bin/env python
"""Build wheel distribution for Elytra PIM Client.
This script builds wheel and source distributions for the Elytra PIM Client package.
It requires setuptools and wheel to be installed.
Usage:
python build_wheel.py
Output:
- Wheels saved to dist/ directory
- Source distribution (sdist) also created for reference
"""
import shutil
import subprocess
import sys
from pathlib import Path
def main() -> int:
"""Build wheel distribution.
Returns:
Exit code (0 for success, 1 for failure)
"""
project_root = Path(__file__).parent
dist_dir = project_root / "dist"
print("=" * 70)
print("Elytra PIM Client - Wheel Builder")
print("=" * 70)
# Clean previous builds
print("\nCleaning previous builds...")
if dist_dir.exists():
try:
shutil.rmtree(dist_dir)
print(f"✓ Removed {dist_dir}")
except OSError as e:
print(f"✗ Failed to remove {dist_dir}: {e}")
return 1
build_dir = project_root / "build"
if build_dir.exists():
try:
shutil.rmtree(build_dir)
print(f"✓ Removed {build_dir}")
except OSError as e:
print(f"✗ Failed to remove {build_dir}: {e}")
return 1
egg_info_dir = project_root / "elytra_pim_client.egg-info"
if egg_info_dir.exists():
try:
shutil.rmtree(egg_info_dir)
print(f"✓ Removed {egg_info_dir}")
except OSError as e:
print(f"✗ Failed to remove {egg_info_dir}: {e}")
return 1
# Build wheel and sdist
print("\n" + "-" * 70)
print("Building distributions...")
print("-" * 70 + "\n")
try:
# Use python -m build for modern approach
result = subprocess.run(
[sys.executable, "-m", "build"],
cwd=project_root,
check=False
)
if result.returncode != 0:
print("\n✗ Build failed")
print("\nTrying alternative build method...")
# Fallback to direct setuptools invocation
result = subprocess.run(
[sys.executable, "setup.py", "sdist", "bdist_wheel"],
cwd=project_root,
check=False
)
if result.returncode != 0:
print("\n✗ Build failed with fallback method")
return 1
except FileNotFoundError:
# If 'build' module not available, use setup.py
print("Using setuptools directly...\n")
result = subprocess.run(
[sys.executable, "setup.py", "sdist", "bdist_wheel"],
cwd=project_root,
check=False
)
if result.returncode != 0:
print("\n✗ Build failed")
return 1
# Verify build output
print("\n" + "-" * 70)
print("Build Results")
print("-" * 70 + "\n")
if not dist_dir.exists():
print("✗ dist directory not created")
return 1
wheels = list(dist_dir.glob("*.whl"))
sdists = list(dist_dir.glob("*.tar.gz"))
if not wheels and not sdists:
print("✗ No distributions created")
return 1
print("✓ Build successful!\n")
if wheels:
print("Wheels:")
for wheel in wheels:
size_mb = wheel.stat().st_size / (1024 * 1024)
print(f"{wheel.name} ({size_mb:.2f} MB)")
if sdists:
print("\nSource Distributions:")
for sdist in sdists:
size_mb = sdist.stat().st_size / (1024 * 1024)
print(f"{sdist.name} ({size_mb:.2f} MB)")
print(f"\n✓ Distributions saved to: {dist_dir}")
# Installation instructions
print("\n" + "-" * 70)
print("Installation Instructions")
print("-" * 70 + "\n")
if wheels:
wheel = wheels[0]
print(f"Install the wheel locally:\n")
print(f" pip install {dist_dir / wheel.name}\n")
print(f"Or upload to PyPI:\n")
print(f" pip install twine")
print(f" twine upload dist/*\n")
return 0
if __name__ == "__main__":
sys.exit(main())