# Copyright (c) 2012-2014 The CEF Python authors. All rights reserved.
# License: New BSD License.
# Website: http://code.google.com/p/cefpython/
# Create a setup package.
import sys
import os
import platform
import argparse
import re
import platform
import shutil
import glob
import shutil
import sysconfig
BITS = platform.architecture()[0]
assert (BITS == "32bit" or BITS == "64bit")
PACKAGE_NAME = "cefpython3"
README_FILE = os.getcwd()+r"/README.txt"
INIT_TEMPLATE = os.getcwd()+r"/__init__.py.template"
SETUP_TEMPLATE = os.getcwd()+r"/setup.py.template"
SETUP_CFG_TEMPLATE = os.getcwd()+r"/setup.cfg.template"
def glob_remove(pathname):
filelist = glob.glob(pathname)
for f in filelist:
os.remove(f)
def glob_copy(src_glob, dst_folder):
for fname in glob.iglob(src_glob):
print("Copying %s to %s" % (fname, dst_folder))
if os.path.isdir(fname):
shutil.copytree(fname,
os.path.join(dst_folder, os.path.basename(fname)))
else:
shutil.copy(fname,
os.path.join(dst_folder, os.path.basename(fname)))
def glob_move(src_glob, dst_folder):
if not os.path.exists(dst_folder):
os.mkdir(dst_folder)
for fname in glob.iglob(src_glob):
shutil.move(fname,
os.path.join(dst_folder, os.path.basename(fname)))
def str_format(string, dictionary):
orig_string = string
for key, value in dictionary.iteritems():
string = string.replace("%("+key+")s", value)
if string == orig_string:
raise Exception("Nothing to format")
if re.search(r"%\([a-zA-Z0-9_]+\)s", string):
raise Exception("Not all strings formatted")
return string
def main():
parser = argparse.ArgumentParser(usage="%(prog)s [options]")
parser.add_argument("-v", "--version", help="cefpython version",
required=True)
args = parser.parse_args()
assert re.search(r"^\d+\.\d+$", args.version), (
"Invalid version string")
vars = {}
vars["APP_VERSION"] = args.version
vars["PLATFORM"] = sysconfig.get_platform()
vars["PY_VERSION_DIGITS_ONLY"] = (str(sys.version_info.major) + ""
+ str(sys.version_info.minor)) # "27" or "34"
print("Reading template: %s" % README_FILE)
f = open(README_FILE)
README_CONTENT = f.read()
f.close()
print("Reading template: %s" % INIT_TEMPLATE)
f = open(INIT_TEMPLATE)
INIT_CONTENT = str_format(f.read(), vars)
f.close()
print("Reading template: %s" % SETUP_TEMPLATE)
f = open(SETUP_TEMPLATE)
SETUP_CONTENT = str_format(f.read(), vars)
f.close()
print("Reading template: %s" % SETUP_CFG_TEMPLATE)
f = open(SETUP_CFG_TEMPLATE)
SETUP_CFG_CONTENT = str_format(f.read(), vars)
f.close()
installer_dir = os.path.dirname(os.path.abspath(__file__))
pyVersion = str(sys.version_info.major) +"."+ str(sys.version_info.minor)
setup_dir = installer_dir+"/"+PACKAGE_NAME+"-"+vars["APP_VERSION"]\
+"."+BITS+"-py"+pyVersion+"-setup"
print("Creating setup dir: "+setup_dir)
os.mkdir(setup_dir)
package_dir = setup_dir+"/"+PACKAGE_NAME
#print("Creating package dir")
#os.mkdir(package_dir)
print("Creating README.txt from template")
with open(setup_dir+"/README.txt", "w") as f:
f.write(README_CONTENT)
print("Creating setup.py from template")
with open(setup_dir+"/setup.py", "w") as f:
f.write(SETUP_CONTENT)
print("Creating setup.cfg from template")
with open(setup_dir+"/setup.cfg", "w") as f:
f.write(SETUP_CFG_CONTENT)
binaries_dir = os.path.abspath(installer_dir+"/../binaries_"+BITS+"/")
print("Copying binaries to package dir")
shutil.copytree(binaries_dir, package_dir)
os.chdir(package_dir)
print("Removing .log .pyc .pdb files from the package dir")
glob_remove("*.log")
glob_remove("*.pyc")
glob_remove("*.pdb")
os.chdir(installer_dir)
print("Creating __init__.py from template")
with open(package_dir+"/__init__.py", "w") as f:
f.write(INIT_CONTENT)
print("Creating examples dir in package dir")
os.mkdir(package_dir+"/examples/")
print("Creating wx dir in package dir")
os.mkdir(package_dir+"/wx/")
print("Moving example scripts from package dir to examples dir")
examples = glob.glob(package_dir+"/*.py")
for example in examples:
# Ignore: cefpython_py27.py - dummy API script
if os.path.basename(example).startswith("cefpython_"):
continue
# Ignore: __init__.py
if os.path.basename(example).startswith("__"):
continue
os.rename(example, package_dir+"/examples/"+os.path.basename(example))
glob_move(package_dir+"/*.html", package_dir+"/examples/")
glob_move(package_dir+"/*.css", package_dir+"/examples/")
glob_move(package_dir+"/*.js", package_dir+"/examples/")
print("Copying wx/ to package dir")
wx_subpackage_dir = os.path.abspath(installer_dir+"/../../wx/")
glob_copy(wx_subpackage_dir+"/*", package_dir+"/wx/")
print("Moving wx examples from wx/examples to examples/wx")
glob_move(package_dir+"/wx/examples/*", package_dir+"/examples/wx/")
os.rmdir(package_dir+"/wx/examples/")
print("Copying package dir examples to setup dir")
glob_copy(package_dir+"/examples/", setup_dir+"/examples/")
# Create empty debug.log files so that package uninstalls cleanly
# in case examples were launched. Issue 149.
debug_log_dirs = [package_dir,
package_dir+"/examples/",
package_dir+"/examples/wx/"]
for dir in debug_log_dirs:
print("Creating empty debug.log in %s" % dir)
with open(dir+"/debug.log", "w") as f:
f.write("")
print("Setup Package created successfully.")
if __name__ == "__main__":
main()