#!/usr/bin/env python """ Generates a list of all exports from libmupdf.dll from the function lists contained in the mupdf/include/* headers (only MuPDF and MuXPS are included) and adds exports for the other libraries contained within libmupdf.dll but used by SumatraPDF-no-MuPDF.exe (unarr, libdjvu, zlib, lzma, libwebp). Python "$(ProjectDir)gen_libmupdf.def.py" Python "$(ProjectDir)modify_libmupdf_vcxproj.py" """ import os, re import pathlib def generateExports(header, exclude, pattern = '/*.h'): if os.path.isdir(header): return "\r\n".join([generateExports(os.path.join(file), exclude) for file in pathlib.Path().glob(header + pattern)]) data = open(header, "r").read() data = re.sub(r"(?sm)^#ifndef NDEBUG\s.*?^#endif", "", data, 0) data = re.sub(r"(?sm)^#ifdef ARCH_ARM\s.*?^#endif", "", data, 0) data = re.sub(r"(?sm)^#ifdef FITZ_DEBUG_LOCKING\s.*?^#endif", "", data, 0) data = data.replace(" FZ_NORETURN;", ";") functions = re.findall(r"(?sm)^\w+ (?:\w+ )?\*?(\w+)\(.*?\);", data) return "\r\n".join(["\t" + name for name in functions if name not in exclude]) def collectFunctions(file): data = open(file, "r").read() return re.findall(r"(?sm)^\w+(?: \*\n|\n| \*| )((?:fz_|pdf_|xps_|jbig2_)\w+)\(", data) LIBMUPDF_DEF = """\ ; This file is auto-generated by gen_libmupdf.def.py LIBRARY MuPDFLib EXPORTS ; Fitz exports %(fitz_exports)s ; MuPDF exports %(mupdf_exports)s ; JBIG2 exports %(jbig2_exports)s ; Leptonica exports %(leptonica_exports)s ; Tesseract exports %(tesseract_exports)s """ def main(): os.chdir(os.path.join(os.path.dirname(__file__), "../mupdf")) # don't include/export doc_* functions, support for additional input/output formats and form support doc_exports = collectFunctions("source/fitz/document-all.c") + ["fz_get_annot_type", "fz_log_dump_store","fz_outline_from_iterator"] more_formats = collectFunctions("source/fitz/svg-device.c") + collectFunctions("source/fitz/output-pcl.c") + collectFunctions("source/fitz/output-pwg.c") 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"] 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"] sign_exports = ["pdf_crypt_buffer", "pdf_read_pfx", "pdf_sign_signature", "pdf_signer_designated_name", "pdf_free_designated_name"] jbig2_exclude = collectFunctions("thirdparty/jbig2dec/jbig2_image_rw.h") + ["jbig2_dump_huffman_binary", "jbig2_dump_huffman_state", "jbig2_arith_has_reached_marker"] tesseract_exclude = ["TessBaseAPIInitLangMod", "TessBaseAPIClearAdaptiveClassifier", "TessBaseAPIAdaptToWordStr", "TessBaseAPIDetectOrientationScript"] fitz_exports = generateExports("include/mupdf/fitz", doc_exports + more_formats + misc_exports) 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"]) jbig2_exports = generateExports("thirdparty/jbig2dec", jbig2_exclude, "/jbig2*.h") leptonica_exports = generateExports("thirdparty/leptonica/src", [], "/allheaders.h") tesseract_exports = generateExports("thirdparty/tesseract/include/tesseract", tesseract_exclude, "/capi.h") list = LIBMUPDF_DEF % locals() open("../MuPDFLib/libmupdf.def", "wt").write(list.replace('\r\n', "\n")) print("generated libmupdf.def") if __name__ == "__main__": main()