#!/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())