mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
198 lines
7.7 KiB
Python
Executable File
198 lines
7.7 KiB
Python
Executable File
"""
|
|
Distutils script for cx_Freeze.
|
|
"""
|
|
|
|
import distutils.command.bdist_rpm
|
|
import distutils.command.build_ext
|
|
import distutils.command.build_scripts
|
|
import distutils.command.install
|
|
import distutils.command.install_data
|
|
import distutils.sysconfig
|
|
import os
|
|
import sys
|
|
|
|
from distutils.core import setup
|
|
from distutils.extension import Extension
|
|
|
|
class bdist_rpm(distutils.command.bdist_rpm.bdist_rpm):
|
|
|
|
# rpm automatically byte compiles all Python files in a package but we
|
|
# don't want that to happen for initscripts and samples so we tell it to
|
|
# ignore those files
|
|
def _make_spec_file(self):
|
|
specFile = distutils.command.bdist_rpm.bdist_rpm._make_spec_file(self)
|
|
specFile.insert(0, "%define _unpackaged_files_terminate_build 0%{nil}")
|
|
return specFile
|
|
|
|
def run(self):
|
|
distutils.command.bdist_rpm.bdist_rpm.run(self)
|
|
specFile = os.path.join(self.rpm_base, "SPECS",
|
|
"%s.spec" % self.distribution.get_name())
|
|
queryFormat = "%{name}-%{version}-%{release}.%{arch}.rpm"
|
|
command = "rpm -q --qf '%s' --specfile %s" % (queryFormat, specFile)
|
|
origFileName = os.popen(command).read()
|
|
parts = origFileName.split("-")
|
|
parts.insert(2, "py%s%s" % sys.version_info[:2])
|
|
newFileName = "-".join(parts)
|
|
self.move_file(os.path.join("dist", origFileName),
|
|
os.path.join("dist", newFileName))
|
|
|
|
|
|
class build_ext(distutils.command.build_ext.build_ext):
|
|
|
|
def build_extension(self, ext):
|
|
if ext.name.find("bases") < 0:
|
|
distutils.command.build_ext.build_ext.build_extension(self, ext)
|
|
return
|
|
os.environ["LD_RUN_PATH"] = "${ORIGIN}:${ORIGIN}/../lib"
|
|
objects = self.compiler.compile(ext.sources,
|
|
output_dir = self.build_temp,
|
|
include_dirs = ext.include_dirs,
|
|
debug = self.debug,
|
|
depends = ext.depends)
|
|
fileName = os.path.splitext(self.get_ext_filename(ext.name))[0]
|
|
fullName = os.path.join(self.build_lib, fileName)
|
|
libraryDirs = ext.library_dirs or []
|
|
libraries = self.get_libraries(ext)
|
|
extraArgs = ext.extra_link_args or []
|
|
if sys.platform != "win32":
|
|
vars = distutils.sysconfig.get_config_vars()
|
|
libraryDirs.append(vars["LIBPL"])
|
|
libraries.append("python%s.%s" % sys.version_info[:2])
|
|
if vars["LINKFORSHARED"]:
|
|
extraArgs.extend(vars["LINKFORSHARED"].split())
|
|
if vars["LIBS"]:
|
|
extraArgs.extend(vars["LIBS"].split())
|
|
if vars["LIBM"]:
|
|
extraArgs.append(vars["LIBM"])
|
|
if vars["BASEMODLIBS"]:
|
|
extraArgs.extend(vars["BASEMODLIBS"].split())
|
|
if vars["LOCALMODLIBS"]:
|
|
extraArgs.extend(vars["LOCALMODLIBS"].split())
|
|
extraArgs.append("-s")
|
|
self.compiler.link_executable(objects, fullName,
|
|
libraries = libraries,
|
|
library_dirs = libraryDirs,
|
|
runtime_library_dirs = ext.runtime_library_dirs,
|
|
extra_postargs = extraArgs,
|
|
debug = self.debug)
|
|
|
|
def get_ext_filename(self, name):
|
|
fileName = distutils.command.build_ext.build_ext.get_ext_filename(self,
|
|
name)
|
|
if name.find("bases") < 0:
|
|
return fileName
|
|
ext = self.compiler.exe_extension or ""
|
|
return os.path.splitext(fileName)[0] + ext
|
|
|
|
|
|
class build_scripts(distutils.command.build_scripts.build_scripts):
|
|
|
|
def copy_scripts(self):
|
|
distutils.command.build_scripts.build_scripts.copy_scripts(self)
|
|
if sys.platform == "win32":
|
|
for script in self.scripts:
|
|
batFileName = os.path.join(self.build_dir, script + ".bat")
|
|
fullScriptName = r"%s\Scripts\%s" % \
|
|
(os.path.dirname(sys.executable), script)
|
|
command = "%s %s %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9" % \
|
|
(sys.executable, fullScriptName)
|
|
file(batFileName, "w").write("@echo off\n\n%s" % command)
|
|
|
|
|
|
class install(distutils.command.install.install):
|
|
|
|
def get_sub_commands(self):
|
|
subCommands = distutils.command.install.install.get_sub_commands(self)
|
|
subCommands.append("install_packagedata")
|
|
return subCommands
|
|
|
|
|
|
class install_packagedata(distutils.command.install_data.install_data):
|
|
|
|
def run(self):
|
|
installCommand = self.get_finalized_command("install")
|
|
installDir = getattr(installCommand, "install_lib")
|
|
sourceDirs = ["samples", "initscripts"]
|
|
while sourceDirs:
|
|
sourceDir = sourceDirs.pop(0)
|
|
targetDir = os.path.join(installDir, "cx_Freeze", sourceDir)
|
|
self.mkpath(targetDir)
|
|
for name in os.listdir(sourceDir):
|
|
if name == "build" or name.startswith("."):
|
|
continue
|
|
fullSourceName = os.path.join(sourceDir, name)
|
|
if os.path.isdir(fullSourceName):
|
|
sourceDirs.append(fullSourceName)
|
|
else:
|
|
fullTargetName = os.path.join(targetDir, name)
|
|
self.copy_file(fullSourceName, fullTargetName)
|
|
self.outfiles.append(fullTargetName)
|
|
|
|
|
|
commandClasses = dict(
|
|
build_ext = build_ext,
|
|
build_scripts = build_scripts,
|
|
bdist_rpm = bdist_rpm,
|
|
install = install,
|
|
install_packagedata = install_packagedata)
|
|
|
|
if sys.platform == "win32":
|
|
libraries = ["imagehlp"]
|
|
else:
|
|
libraries = []
|
|
utilModule = Extension("cx_Freeze.util", ["source/util.c"],
|
|
libraries = libraries)
|
|
depends = ["source/bases/Common.c"]
|
|
if sys.platform == "win32":
|
|
if sys.version_info[:2] >= (2, 6):
|
|
extraSources = ["source/bases/manifest.rc"]
|
|
else:
|
|
extraSources = ["source/bases/dummy.rc"]
|
|
else:
|
|
extraSources = []
|
|
console = Extension("cx_Freeze.bases.Console",
|
|
["source/bases/Console.c"] + extraSources, depends = depends)
|
|
consoleKeepPath = Extension("cx_Freeze.bases.ConsoleKeepPath",
|
|
["source/bases/ConsoleKeepPath.c"] + extraSources, depends = depends)
|
|
extensions = [utilModule, console, consoleKeepPath]
|
|
if sys.platform == "win32":
|
|
gui = Extension("cx_Freeze.bases.Win32GUI",
|
|
["source/bases/Win32GUI.c"] + extraSources,
|
|
depends = depends, extra_link_args = ["-mwindows"])
|
|
extensions.append(gui)
|
|
|
|
docFiles = "LICENSE.txt README.txt HISTORY.txt doc/cx_Freeze.html"
|
|
|
|
classifiers = [
|
|
"Development Status :: 5 - Production/Stable",
|
|
"Intended Audience :: Developers",
|
|
"License :: OSI Approved :: Python Software Foundation License",
|
|
"Natural Language :: English",
|
|
"Operating System :: OS Independent",
|
|
"Programming Language :: C",
|
|
"Programming Language :: Python",
|
|
"Topic :: Software Development :: Build Tools",
|
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
"Topic :: System :: Software Distribution",
|
|
"Topic :: Utilities"
|
|
]
|
|
|
|
setup(name = "cx_Freeze",
|
|
description = "create standalone executables from Python scripts",
|
|
long_description = "create standalone executables from Python scripts",
|
|
version = "4.0.1",
|
|
cmdclass = commandClasses,
|
|
options = dict(bdist_rpm = dict(doc_files = docFiles),
|
|
install = dict(optimize = 1)),
|
|
ext_modules = extensions,
|
|
packages = ['cx_Freeze'],
|
|
maintainer="Anthony Tuininga",
|
|
maintainer_email="anthony.tuininga@gmail.com",
|
|
url = "http://cx-freeze.sourceforge.net",
|
|
scripts = ["cxfreeze"],
|
|
classifiers = classifiers,
|
|
keywords = "freeze",
|
|
license = "Python Software Foundation License")
|
|
|