mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-01 01:07:51 -04:00
deploy-ng: fix failure to include libpython (particularly on macOS)
This commit is contained in:
parent
f703fd51ed
commit
58917e6746
@ -1619,17 +1619,15 @@ class Freezer:
|
|||||||
|
|
||||||
return target
|
return target
|
||||||
|
|
||||||
def generateRuntimeFromStub(self, basename, stub_file, fields={}):
|
def generateRuntimeFromStub(self, target, stub_file, fields={}):
|
||||||
# We must have a __main__ module to make an exe file.
|
# We must have a __main__ module to make an exe file.
|
||||||
if not self.__writingModule('__main__'):
|
if not self.__writingModule('__main__'):
|
||||||
message = "Can't generate an executable without a __main__ module."
|
message = "Can't generate an executable without a __main__ module."
|
||||||
raise Exception(message)
|
raise Exception(message)
|
||||||
|
|
||||||
if self.platform.startswith('win'):
|
if self.platform.startswith('win'):
|
||||||
target = basename + '.exe'
|
|
||||||
modext = '.pyd'
|
modext = '.pyd'
|
||||||
else:
|
else:
|
||||||
target = basename
|
|
||||||
modext = '.so'
|
modext = '.so'
|
||||||
|
|
||||||
# First gather up the strings and code for all the module names, and
|
# First gather up the strings and code for all the module names, and
|
||||||
|
@ -280,11 +280,16 @@ class build_apps(distutils.core.Command):
|
|||||||
freezer.excludeModule(exmod)
|
freezer.excludeModule(exmod)
|
||||||
freezer.done(addStartupModules=True)
|
freezer.done(addStartupModules=True)
|
||||||
|
|
||||||
|
target_path = os.path.join(builddir, appname)
|
||||||
|
|
||||||
stub_name = 'deploy-stub'
|
stub_name = 'deploy-stub'
|
||||||
if platform.startswith('win'):
|
if platform.startswith('win'):
|
||||||
if not use_console:
|
if not use_console:
|
||||||
stub_name = 'deploy-stubw'
|
stub_name = 'deploy-stubw'
|
||||||
|
|
||||||
|
if platform.startswith('win'):
|
||||||
stub_name += '.exe'
|
stub_name += '.exe'
|
||||||
|
target_path += '.exe'
|
||||||
|
|
||||||
if use_wheels:
|
if use_wheels:
|
||||||
stub_file = p3dwhl.open('panda3d_tools/{0}'.format(stub_name))
|
stub_file = p3dwhl.open('panda3d_tools/{0}'.format(stub_name))
|
||||||
@ -293,7 +298,7 @@ class build_apps(distutils.core.Command):
|
|||||||
stub_path = os.path.join(os.path.dirname(dtool_path), '..', 'bin', stub_name)
|
stub_path = os.path.join(os.path.dirname(dtool_path), '..', 'bin', stub_name)
|
||||||
stub_file = open(stub_path, 'rb')
|
stub_file = open(stub_path, 'rb')
|
||||||
|
|
||||||
freezer.generateRuntimeFromStub(os.path.join(builddir, appname), stub_file, {
|
freezer.generateRuntimeFromStub(target_path, stub_file, {
|
||||||
'prc_data': None,
|
'prc_data': None,
|
||||||
'default_prc_dir': None,
|
'default_prc_dir': None,
|
||||||
'prc_dir_envvars': None,
|
'prc_dir_envvars': None,
|
||||||
@ -306,6 +311,12 @@ class build_apps(distutils.core.Command):
|
|||||||
})
|
})
|
||||||
stub_file.close()
|
stub_file.close()
|
||||||
|
|
||||||
|
# Copy the dependencies.
|
||||||
|
search_path = [builddir]
|
||||||
|
if use_wheels:
|
||||||
|
search_path.append(os.path.join(p3dwhlfn, 'deploy_libs'))
|
||||||
|
self.copy_dependencies(open(target_path, 'rb'), builddir, search_path, stub_name)
|
||||||
|
|
||||||
freezer_extras.update(freezer.extras)
|
freezer_extras.update(freezer.extras)
|
||||||
freezer_modules.update(freezer.getAllModuleNames())
|
freezer_modules.update(freezer.getAllModuleNames())
|
||||||
|
|
||||||
@ -556,6 +567,13 @@ class build_apps(distutils.core.Command):
|
|||||||
shutil.copyfile(source_path, target_path)
|
shutil.copyfile(source_path, target_path)
|
||||||
fp = open(target_path, 'rb')
|
fp = open(target_path, 'rb')
|
||||||
|
|
||||||
|
target_dir = os.path.dirname(target_path)
|
||||||
|
base = os.path.basename(target_path)
|
||||||
|
self.copy_dependencies(fp, target_dir, search_path, base)
|
||||||
|
|
||||||
|
def copy_dependencies(self, fp, target_dir, search_path, referenced_by):
|
||||||
|
""" Copies the dependencies of the given open file. """
|
||||||
|
|
||||||
# What kind of magic does the file contain?
|
# What kind of magic does the file contain?
|
||||||
deps = []
|
deps = []
|
||||||
magic = fp.read(4)
|
magic = fp.read(4)
|
||||||
@ -589,11 +607,8 @@ class build_apps(distutils.core.Command):
|
|||||||
deps = self._read_dependencies_fat(fp, True)
|
deps = self._read_dependencies_fat(fp, True)
|
||||||
|
|
||||||
# If we discovered any dependencies, recursively add those.
|
# If we discovered any dependencies, recursively add those.
|
||||||
if deps:
|
for dep in deps:
|
||||||
target_dir = os.path.dirname(target_path)
|
self.add_dependency(dep, target_dir, search_path, referenced_by)
|
||||||
base = os.path.basename(target_path)
|
|
||||||
for dep in deps:
|
|
||||||
self.add_dependency(dep, target_dir, search_path, base)
|
|
||||||
|
|
||||||
def _read_dependencies_elf(self, elf, origin, search_path):
|
def _read_dependencies_elf(self, elf, origin, search_path):
|
||||||
""" Having read the first 4 bytes of the ELF file, fetches the
|
""" Having read the first 4 bytes of the ELF file, fetches the
|
||||||
|
@ -350,19 +350,25 @@ class WheelFile(object):
|
|||||||
|
|
||||||
# Fix things like @loader_path/../lib references
|
# Fix things like @loader_path/../lib references
|
||||||
if sys.platform == "darwin":
|
if sys.platform == "darwin":
|
||||||
|
deps_path = '@loader_path'
|
||||||
loader_path = [os.path.dirname(source_path)]
|
loader_path = [os.path.dirname(source_path)]
|
||||||
for dep in deps:
|
for dep in deps:
|
||||||
if '@loader_path' not in dep:
|
if dep.endswith('/Python'):
|
||||||
continue
|
# If this references the Python framework, change it
|
||||||
|
# to reference libpython instead.
|
||||||
|
new_dep = deps_path + '/libpython{0}.{1}.dylib'.format(*sys.version_info)
|
||||||
|
else:
|
||||||
|
if '@loader_path' not in dep:
|
||||||
|
continue
|
||||||
|
|
||||||
dep_path = dep.replace('@loader_path', '.')
|
dep_path = dep.replace('@loader_path', '.')
|
||||||
target_dep = os.path.dirname(target_path) + '/' + os.path.basename(dep)
|
target_dep = os.path.dirname(target_path) + '/' + os.path.basename(dep)
|
||||||
target_dep = self.consider_add_dependency(target_dep, dep_path, loader_path)
|
target_dep = self.consider_add_dependency(target_dep, dep_path, loader_path)
|
||||||
if not target_dep:
|
if not target_dep:
|
||||||
# It won't be included, so no use adjusting the path.
|
# It won't be included, so no use adjusting the path.
|
||||||
continue
|
continue
|
||||||
|
new_dep = os.path.join(deps_path, os.path.relpath(target_dep, os.path.dirname(target_path)))
|
||||||
|
|
||||||
new_dep = os.path.join('@loader_path', os.path.relpath(target_dep, os.path.dirname(target_path)))
|
|
||||||
subprocess.call(["install_name_tool", "-change", dep, new_dep, temp.name])
|
subprocess.call(["install_name_tool", "-change", dep, new_dep, temp.name])
|
||||||
else:
|
else:
|
||||||
subprocess.call(["strip", "-s", temp.name])
|
subprocess.call(["strip", "-s", temp.name])
|
||||||
@ -600,7 +606,7 @@ def makewheel(version, output_dir, platform=None):
|
|||||||
else:
|
else:
|
||||||
pylib_name = get_config_var('LDLIBRARY')
|
pylib_name = get_config_var('LDLIBRARY')
|
||||||
pylib_path = os.path.join(get_config_var('LIBDIR'), pylib_name)
|
pylib_path = os.path.join(get_config_var('LIBDIR'), pylib_name)
|
||||||
whl.write_file('/deploy_libs/' + pylib_name, pylib_path)
|
whl.write_file('deploy_libs/' + pylib_name, pylib_path)
|
||||||
|
|
||||||
whl.close()
|
whl.close()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user