From: YOKOTA Hiroshi <yokota.hgml@gmail.com>
Date: Sun, 7 Nov 2021 16:31:16 +0900
Subject: Sort object lists for reproducible build

Forwarded: not-needed
---
 setup/build.py       |  8 ++++----
 src/calibre/linux.py | 18 +++++++++---------
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/setup/build.py b/setup/build.py
index 2b1154e..a3e49f3 100644
--- a/setup/build.py
+++ b/setup/build.py
@@ -566,8 +566,8 @@ class Build(Command):
             compiler = env.cxx if ext.needs_cxx else env.cc
             linker = env.linker or compiler
             cmd = [linker]
-            elib = env.lib_dirs_to_ldflags(ext.lib_dirs)
-            xlib = env.libraries_to_ldflags(ext.libraries)
+            elib = env.lib_dirs_to_ldflags(sorted(ext.lib_dirs))
+            xlib = env.libraries_to_ldflags(sorted(ext.libraries))
             if iswindows or env is self.windows_cross_env:
                 pre_ld_flags = []
                 if ext.uses_icu:
@@ -576,7 +576,7 @@ class Build(Command):
                 cmd += pre_ld_flags + env.ldflags + ext.ldflags + elib + xlib + \
                     ['/EXPORT:' + init_symbol_name(ext.name)] + objects + ext.extra_objs + ['/OUT:'+dest]
             else:
-                cmd += objects + ext.extra_objs + ['-o', dest] + env.ldflags + ext.ldflags + elib + xlib
+                cmd += sorted(objects) + ext.extra_objs + ['-o', dest] + env.ldflags + ext.ldflags + elib + xlib
             return LinkCommand(cmd, objects, dest)
 
         env = self.env_for_compilation_db(ext)
@@ -679,7 +679,7 @@ sip-include-dirs = ["/usr/lib/python3/dist-packages/PyQt6/bindings"]
 
 [tool.sip.bindings.{ext.name}]
 headers = {ext.headers}
-sources = {ext.sources}
+sources = {sorted(ext.sources)}
 exceptions = {needs_exceptions}
 include-dirs = {ext.inc_dirs}
 qmake-QT = {ext.qt_modules}
diff --git a/src/calibre/linux.py b/src/calibre/linux.py
index 265532b..b7b7915 100644
--- a/src/calibre/linux.py
+++ b/src/calibre/linux.py
@@ -286,7 +286,7 @@ class ZshCompleter:  # {{{
                 if opt.dest in {'extract_to', 'debug_pipeline', 'to_dir', 'outbox', 'with_library', 'library_path'}:
                     arg += "'_path_files -/'"
                 elif opt.choices:
-                    arg += "(%s)"%'|'.join(opt.choices)
+                    arg += "(%s)"%'|'.join(sorted(opt.choices))
                 elif set(file_map).intersection(set(opt._long_opts)):
                     k = set(file_map).intersection(set(opt._long_opts))
                     exts = file_map[tuple(k)[0]]
@@ -331,10 +331,10 @@ class ZshCompleter:  # {{{
         from calibre.ebooks.conversion.plumber import supported_input_formats
         from calibre.utils.logging import DevNull
         from calibre.web.feeds.recipes.collection import get_builtin_recipe_titles
-        input_fmts = set(supported_input_formats())
-        output_fmts = set(available_output_formats())
-        iexts = {x.upper() for x in input_fmts}.union(input_fmts)
-        oexts = {x.upper() for x in output_fmts}.union(output_fmts)
+        input_fmts = sorted(set(supported_input_formats()))
+        output_fmts = sorted(set(available_output_formats()))
+        iexts = sorted({x.upper() for x in input_fmts}.union(input_fmts))
+        oexts = sorted({x.upper() for x in output_fmts}.union(output_fmts))
         w = polyglot_write(f)
         # Arg 1
         w('\n_ebc_input_args() {')
@@ -469,7 +469,7 @@ _ebook_edit() {{
 
     return 1
 }}
-'''.format(opt_lines, '|'.join(tweakable_fmts)) + '\n\n')
+'''.format(opt_lines, '|'.join(sorted(tweakable_fmts))) + '\n\n')
 
     def do_calibredb(self, f):
         from calibre.customize.ui import available_catalog_formats
@@ -500,7 +500,7 @@ _ebook_edit() {{
                 exts = ['opf']
             exts = set(exts).union(x.upper() for x in exts)
             pats = ('*.%s'%x for x in exts)
-            extra = ("'*:filename:_files -g \"%s\"' "%' '.join(pats),) if exts else ()
+            extra = ("'*:filename:_files -g \"%s\"' "%' '.join(sorted(pats)),) if exts else ()
             if command in {'add', 'add_format'}:
                 extra = ("'*:filename:_files' ",)
             opts = '\\\n        '.join(tuple(self.get_options(
@@ -918,7 +918,7 @@ class PostInstall:
         mimetypes.discard('application/octet-stream')
 
         def write_mimetypes(f, extra=''):
-            line = 'MimeType={};'.format(';'.join(mimetypes))
+            line = 'MimeType={};'.format(';'.join(sorted(mimetypes)))
             if extra:
                 line += extra + ';'
             f.write(line.encode('utf-8') + b'\n')
@@ -933,7 +933,7 @@ class PostInstall:
         with open('calibre-ebook-edit.desktop', 'wb') as f:
             f.write(ETWEAK.encode('utf-8'))
             mt = {guess_type('a.' + x.lower())[0] for x in (SUPPORTED|IMPORTABLE)} - {None, 'application/octet-stream'}
-            f.write(('MimeType=%s;\n'%';'.join(mt)).encode('utf-8'))
+            f.write(('MimeType=%s;\n'%';'.join(sorted(mt))).encode('utf-8'))
         with open('calibre-gui.desktop', 'wb') as f:
             f.write(GUI.encode('utf-8'))
             write_mimetypes(f, 'x-scheme-handler/calibre')
