102 lines
3.5 KiB
Python
102 lines
3.5 KiB
Python
#!/usr/bin/env python3
|
|
import sys
|
|
import platform
|
|
from pathlib import Path
|
|
import subprocess
|
|
|
|
def check_pyinstaller():
|
|
"""Check if PyInstaller is installed and available"""
|
|
try:
|
|
subprocess.run(
|
|
[sys.executable, "-m", "PyInstaller", "--version"],
|
|
check=True,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE
|
|
)
|
|
return True
|
|
except (subprocess.CalledProcessError, FileNotFoundError):
|
|
return False
|
|
|
|
def install_pyinstaller():
|
|
"""Install PyInstaller if not already installed"""
|
|
print("PyInstaller not found. Installing now...")
|
|
try:
|
|
subprocess.check_call(
|
|
[sys.executable, "-m", "pip", "install", "--upgrade", "pyinstaller"],
|
|
stdout=subprocess.DEVNULL
|
|
)
|
|
print("PyInstaller installed successfully.")
|
|
return True
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"Failed to install PyInstaller: {e}")
|
|
return False
|
|
|
|
def main():
|
|
# Check and install PyInstaller if needed
|
|
if not check_pyinstaller():
|
|
if not install_pyinstaller():
|
|
print("Error: PyInstaller installation failed. Please install it manually:")
|
|
print("pip install pyinstaller")
|
|
sys.exit(1)
|
|
|
|
# Check if requirements.txt exists and install dependencies
|
|
req_file = Path("requirements.txt")
|
|
if req_file.exists():
|
|
print("\nInstalling dependencies from requirements.txt...")
|
|
try:
|
|
subprocess.check_call(
|
|
[sys.executable, "-m", "pip", "install", "-r", "requirements.txt"],
|
|
stdout=subprocess.DEVNULL
|
|
)
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"Warning: Failed to install some dependencies: {e}")
|
|
else:
|
|
print("\nWarning: requirements.txt not found. Installing default dependencies...")
|
|
try:
|
|
subprocess.check_call(
|
|
[sys.executable, "-m", "pip", "install", "pillow>=9.0.0", "pngmeta>=1.0.0"],
|
|
stdout=subprocess.DEVNULL
|
|
)
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"Warning: Failed to install default dependencies: {e}")
|
|
|
|
# Determine platform-specific build options
|
|
system = platform.system()
|
|
base_args = [
|
|
"--name", "PNG Metadata Editor",
|
|
"--windowed",
|
|
"--onefile"
|
|
]
|
|
|
|
# Check for version.txt
|
|
version_file = Path("version.txt")
|
|
if version_file.exists():
|
|
print(f"\nUsing version info from {version_file}")
|
|
base_args.extend(["--version-file", "version.txt"])
|
|
else:
|
|
print("\nWarning: version.txt not found. Using default version.")
|
|
|
|
if system == "Windows":
|
|
base_args.extend(["--icon", "AppIcon.ico"])
|
|
elif system == "Darwin": # macOS
|
|
base_args.extend(["--icon", "AppIcon.icns"])
|
|
else: # Linux
|
|
pass
|
|
|
|
# Build the PyInstaller command
|
|
pyinstaller_args = ["--distpath", "dist", "--workpath", "build"] + base_args
|
|
cmd = [sys.executable, "-m", "PyInstaller"] + pyinstaller_args + ["png-meta-editor.py"]
|
|
|
|
print(f"\nBuilding PNG Metadata Editor for {system}...")
|
|
try:
|
|
result = subprocess.run(cmd)
|
|
if result.returncode == 0:
|
|
print("\nBuild completed successfully!")
|
|
print(f"Your executable is in the dist/ folder")
|
|
return result.returncode
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"\nBuild failed with error: {e}")
|
|
return 1
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|