gen_libmupdf.def.py 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #!/usr/bin/env python
  2. """
  3. Generates a list of all exports from libmupdf.dll from the function lists
  4. contained in the mupdf/include/* headers (only MuPDF and MuXPS are included)
  5. and adds exports for the other libraries contained within libmupdf.dll but
  6. used by SumatraPDF-no-MuPDF.exe (unarr, libdjvu, zlib, lzma, libwebp).
  7. Python "$(ProjectDir)gen_libmupdf.def.py"
  8. Python "$(ProjectDir)modify_libmupdf_vcxproj.py"
  9. """
  10. import os, re
  11. import pathlib
  12. def generateExports(header, exclude, pattern = '/*.h'):
  13. if os.path.isdir(header):
  14. return "\r\n".join([generateExports(os.path.join(file), exclude) for file in pathlib.Path().glob(header + pattern)])
  15. data = open(header, "r").read()
  16. data = re.sub(r"(?sm)^#ifndef NDEBUG\s.*?^#endif", "", data, 0)
  17. data = re.sub(r"(?sm)^#ifdef ARCH_ARM\s.*?^#endif", "", data, 0)
  18. data = re.sub(r"(?sm)^#ifdef FITZ_DEBUG_LOCKING\s.*?^#endif", "", data, 0)
  19. data = data.replace(" FZ_NORETURN;", ";")
  20. functions = re.findall(r"(?sm)^\w+ (?:\w+ )?\*?(\w+)\(.*?\);", data)
  21. return "\r\n".join(["\t" + name for name in functions if name not in exclude])
  22. def collectFunctions(file):
  23. data = open(file, "r").read()
  24. return re.findall(r"(?sm)^\w+(?: \*\n|\n| \*| )((?:fz_|pdf_|xps_|jbig2_)\w+)\(", data)
  25. LIBMUPDF_DEF = """\
  26. ; This file is auto-generated by gen_libmupdf.def.py
  27. LIBRARY MuPDFLib
  28. EXPORTS
  29. ; Fitz exports
  30. %(fitz_exports)s
  31. ; MuPDF exports
  32. %(mupdf_exports)s
  33. ; JBIG2 exports
  34. %(jbig2_exports)s
  35. ; Leptonica exports
  36. %(leptonica_exports)s
  37. ; Tesseract exports
  38. %(tesseract_exports)s
  39. """
  40. def main():
  41. os.chdir(os.path.join(os.path.dirname(__file__), "../mupdf"))
  42. # don't include/export doc_* functions, support for additional input/output formats and form support
  43. doc_exports = collectFunctions("source/fitz/document-all.c") + ["fz_get_annot_type", "fz_log_dump_store","fz_outline_from_iterator"]
  44. more_formats = collectFunctions("source/fitz/svg-device.c") + collectFunctions("source/fitz/output-pcl.c") + collectFunctions("source/fitz/output-pwg.c")
  45. form_exports = collectFunctions("source/pdf/pdf-form.c") + collectFunctions("source/pdf/pdf-event.c") + collectFunctions("source/pdf/pdf-appearance.c") + ["pdf_access_submit_event", "pdf_init_ui_pointer_event"]
  46. misc_exports = collectFunctions("source/fitz/test-device.c") + ["fz_set_stderr", "fz_set_stdout", "fz_colorspace_name_process_colorants", "fz_getoptw", "fz_valgrind_pixmap", "fz_stderr", "track_usage", "fz_log_errorFL", "fz_log_error_printfFL", "fz_morph_errorFL", "fz_do_catchFL", "fz_rethrowFL", "fz_rethrow_ifFL", "fz_rethrow_unlessFL", "fz_throwFL", "fz_vlog_error_printfFL", "fz_vthrowFL", "fz_vwarnFL", "fz_warnFL", "HEAP_CAT"]
  47. sign_exports = ["pdf_crypt_buffer", "pdf_read_pfx", "pdf_sign_signature", "pdf_signer_designated_name", "pdf_free_designated_name"]
  48. jbig2_exclude = collectFunctions("thirdparty/jbig2dec/jbig2_image_rw.h") + ["jbig2_dump_huffman_binary", "jbig2_dump_huffman_state", "jbig2_arith_has_reached_marker"]
  49. tesseract_exclude = ["TessBaseAPIInitLangMod", "TessBaseAPIClearAdaptiveClassifier", "TessBaseAPIAdaptToWordStr", "TessBaseAPIDetectOrientationScript"]
  50. fitz_exports = generateExports("include/mupdf/fitz", doc_exports + more_formats + misc_exports)
  51. mupdf_exports = generateExports("include/mupdf/pdf", form_exports + sign_exports + ["pdf_drop_designated_name", "pdf_print_xref", "pdf_recognize", "pdf_resolve_obj", "pdf_open_compressed_stream", "pdf_finish_edit"])
  52. jbig2_exports = generateExports("thirdparty/jbig2dec", jbig2_exclude, "/jbig2*.h")
  53. leptonica_exports = generateExports("thirdparty/leptonica/src", [], "/allheaders.h")
  54. tesseract_exports = generateExports("thirdparty/tesseract/include/tesseract", tesseract_exclude, "/capi.h")
  55. list = LIBMUPDF_DEF % locals()
  56. open("../MuPDFLib/libmupdf.def", "wt").write(list.replace('\r\n', "\n"))
  57. print("generated libmupdf.def")
  58. if __name__ == "__main__":
  59. main()