def assemble(self): if _check_path_overlap(self.name) and os.path.isdir(self.name): _rmtree(self.name) logger.info("Building COLLECT %s", self.tocbasename) os.makedirs(self.name) toc = add_suffix_to_extensions(self.toc) for inm, fnm, typ in toc: if not os.path.exists(fnm) or not os.path.isfile(fnm) and is_path_to_egg(fnm): # file is contained within python egg, it is added with the egg continue if os.pardir in os.path.normpath(inm) or os.path.isabs(inm): raise SystemExit('Security-Alert: try to store file outside ' 'of dist-directory. Aborting. %r' % inm) tofnm = os.path.join(self.name, inm) todir = os.path.dirname(tofnm) if not os.path.exists(todir): os.makedirs(todir) if typ in ('EXTENSION', 'BINARY'): fnm = checkCache(fnm, strip=self.strip_binaries, upx=(self.upx_binaries and (is_win or is_cygwin)), dist_nm=inm) if typ != 'DEPENDENCY': shutil.copy(fnm, tofnm) try: shutil.copystat(fnm, tofnm) except OSError: logger.warn("failed to copy flags of %s", fnm) if typ in ('EXTENSION', 'BINARY'): os.chmod(tofnm, 0o755)
def assemble(self): _make_clean_directory(self.name) logger.info("Building COLLECT %s", self.tocbasename) for inm, fnm, typ in self.toc: # Adjust name for extensions, if applicable inm, fnm, typ = add_suffix_to_extension(inm, fnm, typ) if not os.path.exists( fnm) or not os.path.isfile(fnm) and is_path_to_egg(fnm): # file is contained within python egg, it is added with the egg continue if os.pardir in os.path.normpath(inm).split(os.sep) \ or os.path.isabs(inm): raise SystemExit('Security-Alert: try to store file outside ' 'of dist-directory. Aborting. %r' % inm) tofnm = os.path.join(self.name, inm) todir = os.path.dirname(tofnm) if not os.path.exists(todir): os.makedirs(todir) elif not os.path.isdir(todir): raise SystemExit( "Pyinstaller needs to make a directory, but there " "already is a file at that path. " "The file at issue is {!r}".format(todir)) if typ in ('EXTENSION', 'BINARY'): fnm = checkCache(fnm, strip=self.strip_binaries, upx=self.upx_binaries, upx_exclude=self.upx_exclude, dist_nm=inm, target_arch=self.target_arch, codesign_identity=self.codesign_identity, entitlements_file=self.entitlements_file) if typ != 'DEPENDENCY': if os.path.isdir(fnm): # beacuse shutil.copy2() is the default copy function # for shutil.copytree, this will also copy file metadata shutil.copytree(fnm, tofnm) else: shutil.copy(fnm, tofnm) try: shutil.copystat(fnm, tofnm) except OSError: logger.warning("failed to copy flags of %s", fnm) if typ in ('EXTENSION', 'BINARY'): os.chmod(tofnm, 0o755) logger.info("Building COLLECT %s completed successfully.", self.tocbasename)
def assemble(self): _make_clean_directory(self.name) logger.info("Building COLLECT %s", self.tocbasename) toc = add_suffix_to_extensions(self.toc) for inm, fnm, typ in toc: if not os.path.exists( fnm) or not os.path.isfile(fnm) and is_path_to_egg(fnm): # file is contained within python egg, it is added with the egg continue if os.pardir in os.path.normpath(inm).split(os.sep) \ or os.path.isabs(inm): raise SystemExit('Security-Alert: try to store file outside ' 'of dist-directory. Aborting. %r' % inm) tofnm = os.path.join(self.name, inm) todir = os.path.dirname(tofnm) if not os.path.exists(todir): os.makedirs(todir) if typ in ('EXTENSION', 'BINARY'): fnm = checkCache(fnm, strip=self.strip_binaries, upx=(self.upx_binaries and (is_win or is_cygwin)), dist_nm=inm) if typ != 'DEPENDENCY': if os.path.isdir(fnm): # beacuse shutil.copy2() is the default copy function # for shutil.copytree, this will also copy file metadata shutil.copytree(fnm, tofnm) else: shutil.copy(fnm, tofnm) try: shutil.copystat(fnm, tofnm) except OSError: logger.warning("failed to copy flags of %s", fnm) if typ in ('EXTENSION', 'BINARY'): os.chmod(tofnm, 0o755) logger.info("Building COLLECT %s completed successfully.", self.tocbasename)
def assemble(self): logger.info("Building PKG (CArchive) %s", os.path.basename(self.name)) trash = [] mytoc = [] srctoc = [] seenInms = {} seenFnms = {} seenFnms_typ = {} toc = add_suffix_to_extensions(self.toc) # 'inm' - relative filename inside a CArchive # 'fnm' - absolute filename as it is on the file system. for inm, fnm, typ in toc: # Ensure filename 'fnm' is not None or empty string. Otherwise # it will fail in case of 'typ' being type OPTION. if fnm and not os.path.isfile(fnm) and is_path_to_egg(fnm): # file is contained within python egg, it is added with the egg continue if typ in ('BINARY', 'EXTENSION', 'DEPENDENCY'): if self.exclude_binaries and typ != 'DEPENDENCY': self.dependencies.append((inm, fnm, typ)) else: if typ == 'BINARY': # Avoid importing the same binary extension twice. This might # happen if they come from different sources (eg. once from # binary dependence, and once from direct import). if inm in seenInms: logger.warning( 'Two binaries added with the same internal name.' ) logger.warning(pprint.pformat((inm, fnm, typ))) logger.warning('was placed previously at') logger.warning( pprint.pformat((inm, seenInms[inm], seenFnms_typ[seenInms[inm]]))) logger.warning('Skipping %s.' % fnm) continue # Warn if the same binary extension was included # with multiple internal names if fnm in seenFnms: logger.warning( 'One binary added with two internal names.') logger.warning(pprint.pformat((inm, fnm, typ))) logger.warning('was placed previously at') logger.warning( pprint.pformat( (seenFnms[fnm], fnm, seenFnms_typ[fnm]))) seenInms[inm] = fnm seenFnms[fnm] = inm seenFnms_typ[fnm] = typ fnm = checkCache(fnm, strip=self.strip_binaries, upx=(self.upx_binaries and (is_win or is_cygwin)), dist_nm=inm) mytoc.append((inm, fnm, self.cdict.get(typ, 0), self.xformdict.get(typ, 'b'))) elif typ == 'OPTION': mytoc.append((inm, '', 0, 'o')) elif typ in ('PYSOURCE', 'PYMODULE'): # collect sourcefiles and module in a toc of it's own # which will not be sorted. srctoc.append((inm, fnm, self.cdict[typ], self.xformdict[typ])) else: mytoc.append((inm, fnm, self.cdict.get(typ, 0), self.xformdict.get(typ, 'b'))) # Bootloader has to know the name of Python library. Pass python libname to CArchive. pylib_name = os.path.basename(bindepend.get_python_library_path()) # Sort content alphabetically by type and name to support # reproducible builds. mytoc.sort(key=itemgetter(3, 0)) # Do *not* sort modules and scripts, as their order is important. # TODO: Think about having all modules first and then all scripts. archive = CArchiveWriter(self.name, srctoc + mytoc, pylib_name=pylib_name) for item in trash: os.remove(item) logger.info("Building PKG (CArchive) %s completed successfully.", os.path.basename(self.name))
def assemble(self): logger.info("Building PKG (CArchive) %s", os.path.basename(self.name)) trash = [] mytoc = [] seenInms = {} seenFnms = {} seenFnms_typ = {} toc = add_suffix_to_extensions(self.toc) # 'inm' - relative filename inside a CArchive # 'fnm' - absolute filename as it is on the file system. for inm, fnm, typ in toc: # Ensure filename 'fnm' is not None or empty string. Otherwise # it will fail in case of 'typ' being type OPTION. if fnm and not os.path.isfile(fnm) and is_path_to_egg(fnm): # file is contained within python egg, it is added with the egg continue if typ in ('BINARY', 'EXTENSION', 'DEPENDENCY'): if self.exclude_binaries and typ != 'DEPENDENCY': self.dependencies.append((inm, fnm, typ)) else: if typ == 'BINARY': # Avoid importing the same binary extension twice. This might # happen if they come from different sources (eg. once from # binary dependence, and once from direct import). if inm in seenInms: logger.warn('Two binaries added with the same internal name.') logger.warn(pprint.pformat((inm, fnm, typ))) logger.warn('was placed previously at') logger.warn(pprint.pformat((inm, seenInms[inm], seenFnms_typ[seenInms[inm]]))) logger.warn('Skipping %s.' % fnm) continue # Warn if the same binary extension was included # with multiple internal names if fnm in seenFnms: logger.warn('One binary added with two internal names.') logger.warn(pprint.pformat((inm, fnm, typ))) logger.warn('was placed previously at') logger.warn(pprint.pformat((seenFnms[fnm], fnm, seenFnms_typ[fnm]))) seenInms[inm] = fnm seenFnms[fnm] = inm seenFnms_typ[fnm] = typ fnm = checkCache(fnm, strip=self.strip_binaries, upx=(self.upx_binaries and (is_win or is_cygwin)), dist_nm=inm) mytoc.append((inm, fnm, self.cdict.get(typ, 0), self.xformdict.get(typ, 'b'))) elif typ == 'OPTION': mytoc.append((inm, '', 0, 'o')) else: mytoc.append((inm, fnm, self.cdict.get(typ, 0), self.xformdict.get(typ, 'b'))) # Bootloader has to know the name of Python library. Pass python libname to CArchive. pylib_name = os.path.basename(bindepend.get_python_library_path()) archive = CArchiveWriter(pylib_name=pylib_name) archive.build(self.name, mytoc) for item in trash: os.remove(item)
def assemble(self): logger.info("Building PKG (CArchive) %s", os.path.basename(self.name)) trash = [] mytoc = [] srctoc = [] seenInms = {} seenFnms = {} seenFnms_typ = {} toc = add_suffix_to_extensions(self.toc) # 'inm' - relative filename inside a CArchive # 'fnm' - absolute filename as it is on the file system. for inm, fnm, typ in toc: # Ensure filename 'fnm' is not None or empty string. Otherwise # it will fail in case of 'typ' being type OPTION. if fnm and not os.path.isfile(fnm) and is_path_to_egg(fnm): # file is contained within python egg, it is added with the egg continue if typ in ('BINARY', 'EXTENSION', 'DEPENDENCY'): if self.exclude_binaries and typ != 'DEPENDENCY': self.dependencies.append((inm, fnm, typ)) else: if typ == 'BINARY': # Avoid importing the same binary extension twice. This might # happen if they come from different sources (eg. once from # binary dependence, and once from direct import). if inm in seenInms: logger.warning('Two binaries added with the same internal name.') logger.warning(pprint.pformat((inm, fnm, typ))) logger.warning('was placed previously at') logger.warning(pprint.pformat((inm, seenInms[inm], seenFnms_typ[seenInms[inm]]))) logger.warning('Skipping %s.' % fnm) continue # Warn if the same binary extension was included # with multiple internal names if fnm in seenFnms: logger.warning('One binary added with two internal names.') logger.warning(pprint.pformat((inm, fnm, typ))) logger.warning('was placed previously at') logger.warning(pprint.pformat((seenFnms[fnm], fnm, seenFnms_typ[fnm]))) seenInms[inm] = fnm seenFnms[fnm] = inm seenFnms_typ[fnm] = typ fnm = checkCache(fnm, strip=self.strip_binaries, upx=(self.upx_binaries and (is_win or is_cygwin)), dist_nm=inm) mytoc.append((inm, fnm, self.cdict.get(typ, 0), self.xformdict.get(typ, 'b'))) elif typ == 'OPTION': mytoc.append((inm, '', 0, 'o')) elif typ in ('PYSOURCE', 'PYMODULE'): # collect sourcefiles and module in a toc of it's own # which will not be sorted. srctoc.append((inm, fnm, self.cdict[typ], self.xformdict[typ])) else: mytoc.append((inm, fnm, self.cdict.get(typ, 0), self.xformdict.get(typ, 'b'))) # Bootloader has to know the name of Python library. Pass python libname to CArchive. pylib_name = os.path.basename(bindepend.get_python_library_path()) # Sort content alphabetically by type and name to support # reproducible builds. mytoc.sort(key=itemgetter(3, 0)) # Do *not* sort modules and scripts, as their order is important. # TODO: Think about having all modules first and then all scripts. archive = CArchiveWriter(self.name, srctoc + mytoc, pylib_name=pylib_name) for item in trash: os.remove(item) logger.info("Building PKG (CArchive) %s completed successfully.", os.path.basename(self.name))