116 lines
3.5 KiB
Python
116 lines
3.5 KiB
Python
"""
|
|
prepare_ghostscript.py
|
|
Finds the system GhostScript installation and copies the files needed for
|
|
bundling into conf\ghostscript\
|
|
|
|
Files copied:
|
|
conf\ghostscript\bin\gswin64c.exe (or gswin32c.exe)
|
|
conf\ghostscript\bin\gsdll64.dll (or gsdll32.dll)
|
|
conf\ghostscript\lib\*.ps (PostScript init files)
|
|
|
|
Run this ONCE before building the exe with build_windows.bat.
|
|
"""
|
|
|
|
import os
|
|
import shutil
|
|
import glob
|
|
import sys
|
|
|
|
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
DEST_BIN = os.path.join(SCRIPT_DIR, "conf", "ghostscript", "bin")
|
|
DEST_LIB = os.path.join(SCRIPT_DIR, "conf", "ghostscript", "lib")
|
|
|
|
SEARCH_ROOTS = [
|
|
os.environ.get("ProgramFiles", r"C:\Program Files"),
|
|
os.environ.get("ProgramFiles(x86)", r"C:\Program Files (x86)"),
|
|
os.environ.get("ProgramW6432", r"C:\Program Files"),
|
|
]
|
|
|
|
FLAVOURS = [
|
|
("gswin64c.exe", "gsdll64.dll"),
|
|
("gswin32c.exe", "gsdll32.dll"),
|
|
]
|
|
|
|
print()
|
|
print("=" * 60)
|
|
print(" GhostScript Bundle Preparation")
|
|
print("=" * 60)
|
|
print()
|
|
|
|
|
|
def find_ghostscript():
|
|
"""Return (bin_dir, lib_dir, exe_name, dll_name) or None."""
|
|
for root in dict.fromkeys(r for r in SEARCH_ROOTS if r): # unique, preserve order
|
|
gs_root = os.path.join(root, "gs")
|
|
if not os.path.isdir(gs_root):
|
|
continue
|
|
# Each versioned sub-folder, newest first
|
|
versions = sorted(
|
|
[d for d in glob.glob(os.path.join(gs_root, "gs*")) if os.path.isdir(d)],
|
|
reverse=True,
|
|
)
|
|
for ver_dir in versions:
|
|
bin_dir = os.path.join(ver_dir, "bin")
|
|
lib_dir = os.path.join(ver_dir, "lib")
|
|
for exe, dll in FLAVOURS:
|
|
if os.path.isfile(os.path.join(bin_dir, exe)):
|
|
print(f"Found GhostScript: {ver_dir}")
|
|
return bin_dir, lib_dir, exe, dll
|
|
return None
|
|
|
|
|
|
result = find_ghostscript()
|
|
|
|
if result is None:
|
|
print("WARNING: GhostScript is NOT installed on this machine.")
|
|
print()
|
|
print(" The exe will still build successfully, but GhostScript will")
|
|
print(" NOT be bundled. On the target machine the app will fall back")
|
|
print(" to SumatraPDF for printing (which may produce dotted output).")
|
|
print()
|
|
print(" To get sharp vector-quality printing, install GhostScript:")
|
|
print(" https://ghostscript.com/releases/gsdnld.html")
|
|
print(" Then re-run this script before building.")
|
|
print()
|
|
sys.exit(0)
|
|
|
|
src_bin, src_lib, exe_name, dll_name = result
|
|
|
|
# Create destination folders
|
|
os.makedirs(DEST_BIN, exist_ok=True)
|
|
os.makedirs(DEST_LIB, exist_ok=True)
|
|
|
|
# Copy executable and DLL
|
|
print("Copying GhostScript binaries...")
|
|
for fname in (exe_name, dll_name):
|
|
src = os.path.join(src_bin, fname)
|
|
dst = os.path.join(DEST_BIN, fname)
|
|
if os.path.isfile(src):
|
|
shutil.copy2(src, dst)
|
|
print(f" + {fname}")
|
|
else:
|
|
print(f" WARNING: {fname} not found in {src_bin}")
|
|
|
|
# Copy lib/ (PostScript init files .ps)
|
|
print()
|
|
print("Copying GhostScript lib (PostScript init files)...")
|
|
ps_files = glob.glob(os.path.join(src_lib, "*.ps"))
|
|
for ps in ps_files:
|
|
shutil.copy2(ps, DEST_LIB)
|
|
print(f" + {len(ps_files)} .ps files copied from {src_lib}")
|
|
|
|
# Report
|
|
bin_count = len(os.listdir(DEST_BIN))
|
|
lib_count = len(os.listdir(DEST_LIB))
|
|
|
|
print()
|
|
print("=" * 60)
|
|
print(" GhostScript prepared successfully in conf\\ghostscript\\")
|
|
print("=" * 60)
|
|
print()
|
|
print(f" bin\\ : {bin_count} file(s)")
|
|
print(f" lib\\ : {lib_count} file(s)")
|
|
print()
|
|
print("GhostScript will be embedded into LabelPrinter.exe at build time.")
|
|
print()
|