I was able to reproduce the problem by renaming a series with a link to an existing series then running Manage Series. I can't guarantee that this fixes all cases, but it does fix this one.
I'd observe a difference in the debuginfo data for the plugins in rebuilds.
Various /usr/lib64/calibre/calibre/plugins/*.so files would be different, but
the source of the difference was in the link to debuginfo data, which in turn
appears to be caused by differences in sort order in various tables, caused by
the object files being listed in different order. setup/build.py writes out
pyproject.toml, which is turned into *.pro, which is turned into a Makefile.
Sorting the object files by name seems to fix this particular issue. This
makes local rebuilds reproducible for me.
Set ordering is unstable (uses the hash for ordering), so the output file
would be different every time. Sort the sets into lists before writing. In
various places there were unnecessary "conversions", e.g. sorted() always
returns a list, so 'list(sorted(…))' is not useful.
In one place output is fixed to say: "Choices are: doc, ereader, ztxt" instead
of "['doc', 'ereader', 'ztxt']".
For module constants, just create the object directly. The code is easier to
read/edit when the list is constructed directly with items that are ordered in
the same way that is shown in various outputs (instead of being sorted
dynamically).
There is some more syntax confusion in src/calibre/linux.py. For example,
'"%s" % (x)' is the same as '"%s" % x', because just putting something in
parentheses does not create a tuple. It'd be nice to clean up this whole file
to use f-strings and not the error-prone %-formatting, but that's a separate
issue.
In a test build of the Fedora package, the generated file is now stable.
Google discontinued its webcache and Wayback machine's webcache is
currently broken. And lots of google search result URLs are not indexed
in the bing web cache. So search using bing instead.
A new, dedicated PDF Input engine for calibre that implements
automatic detection of headers and footers based on document analysis.
The new engine is the default to go back to using the old engine, select
it in the PDF Input section of the Conversion dialog. See #2076346 (PDF conversion new engine does not work)