Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

how to build mupdf static library in window platform #87

Closed
guoquanlebytedance opened this issue Jun 26, 2023 · 10 comments
Closed

how to build mupdf static library in window platform #87

guoquanlebytedance opened this issue Jun 26, 2023 · 10 comments

Comments

@guoquanlebytedance
Copy link

I saw that there is a libmupdf_windows_386.a file under the libs folder in this project, but the build tutorial on the mupdf web is using visual studio. So how did you build the file libmupdf_windows_386.a?

@guoquanlebytedance
Copy link
Author

As a supplement, I am solving this problem #83. I can not get a mupdf static library.

@gen2brain
Copy link
Owner

All static libraries are cross compiled on Linux. Mingw toolchain for Windows and Osxcross for macOS. For me it is much easier to build everything in Linux, I don't even know how to build something in Windows.

@gen2brain
Copy link
Owner

I guess you can use WSL and install Mingw there, instead of using the VS.

@guoquanlebytedance
Copy link
Author

May I ask how to cross-compile mupdf on linux, where files need to be changed?

@gen2brain
Copy link
Owner

#!/usr/bin/env bash

MINGW_x86_32="/usr/i686-w64-mingw32"
MINGW_x86_64="/usr/x86_64-w64-mingw32"
LINUX_ARM_32="/usr/armv7a-hardfloat-linux-gnueabi"
LINUX_ARM_64="/usr/aarch64-unknown-linux-gnu"
ANDROID_ARM_32="/usr/arm-linux-androideabi"
ANDROID_ARM_64="/usr/aarch64-linux-android"
APPLE_x86_64="/usr/x86_64-apple-darwin"
APPLE_ARM_64="/usr/aarch64-apple-darwin"

OPTS="HAVE_X11=no HAVE_GLFW=no HAVE_GLUT=no WANT_OPENSSL=no WANT_CURL=no HAVE_MUJS=yes HAVE_JSCORE=no HAVE_V8=no"

export CROSS=""
CROSS="" \
    CC=${CROSS}gcc CXX=${CROSS}g++ \
    LD=${CROSS}ld AR=${CROSS}ar \
    CROSSCOMPILE=yes `eval "${OPTS}"` make -j$(nproc) libs HAVE_OBJCOPY=no && ${CROSS}objcopy -w -L hb_* build/release/libmupdf-third.a; ${CROSS}ranlib build/release/libmupdf-third.a; mkdir -p build/linux-x86_64; mv build/release build/linux-x86_64/
    cp build/linux-x86_64/release/libmupdf.a build/libmupdf_linux_amd64.a; cp build/linux-x86_64/release/libmupdf-third.a build/libmupdfthird_linux_amd64.a

export CROSS=""
CROSS="" \
    CC="${CROSS}gcc -m32" CXX="${CROSS}g++ -m32" \
    LD=${CROSS}ld AR=${CROSS}ar \
    CROSSCOMPILE=yes `eval "${OPTS}"` make -j$(nproc) libs HAVE_OBJCOPY=no && ${CROSS}objcopy -w -L hb_* build/release/libmupdf-third.a; ${CROSS}ranlib build/release/libmupdf-third.a; mkdir -p build/linux-386; mv build/release build/linux-386/
    cp build/linux-386/release/libmupdf.a build/libmupdf_linux_386.a; cp build/linux-386/release/libmupdf-third.a build/libmupdfthird_linux_386.a

export CROSS="x86_64-pc-linux-musl-"
CROSS="x86_64-pc-linux-musl-" \
    CC=${CROSS}gcc CXX=${CROSS}g++ \
    LD=${CROSS}ld AR=${CROSS}ar \
    CROSSCOMPILE=yes `eval "${OPTS}"` make -j$(nproc) libs HAVE_OBJCOPY=no && ${CROSS}ranlib build/release/libmupdf-third.a; mkdir -p build/linux-x86_64-musl; mv build/release build/linux-x86_64-musl/
    cp build/linux-x86_64-musl/release/libmupdf.a build/libmupdf_linux_amd64_musl.a; cp build/linux-x86_64-musl/release/libmupdf-third.a build/libmupdfthird_linux_amd64_musl.a

export CROSS="aarch64-unknown-linux-gnu-"
CROSS="aarch64-unknown-linux-gnu-" \
PKG_CONFIG_LIBDIR=${LINUX_ARM_64}/usr/lib/pkgconfig \
    CC=${CROSS}gcc CXX=${CROSS}g++ \
    LD=${CROSS}ld AR=${CROSS}ar \
    CROSSCOMPILE=yes `eval "${OPTS}"` make -j$(nproc) libs HAVE_OBJCOPY=no && ${CROSS}ranlib build/release/libmupdf-third.a; mkdir -p build/linux-aarch64; mv build/release build/linux-aarch64/
    cp build/linux-aarch64/release/libmupdf.a build/libmupdf_linux_arm64.a; cp build/linux-aarch64/release/libmupdf-third.a build/libmupdfthird_linux_arm64.a

export CROSS="aarch64-pc-linux-musl-"
CROSS="aarch64-pc-linux-musl-" \
    CC=${CROSS}gcc CXX=${CROSS}g++ \
    LD=${CROSS}ld AR=${CROSS}ar \
    CROSSCOMPILE=yes `eval "${OPTS}"` make -j$(nproc) libs HAVE_OBJCOPY=no && ${CROSS}ranlib build/release/libmupdf-third.a; mkdir -p build/linux-aarch64-musl; mv build/release build/linux-aarch64-musl/
    cp build/linux-aarch64-musl/release/libmupdf.a build/libmupdf_linux_arm64_musl.a; cp build/linux-aarch64-musl/release/libmupdf-third.a build/libmupdfthird_linux_arm64_musl.a

export CROSS="armv7a-hardfloat-linux-gnueabi-"
CROSS="armv7a-hardfloat-linux-gnueabi-" \
PKG_CONFIG_LIBDIR=${LINUX_ARM_32}/usr/lib/pkgconfig \
    CC=${CROSS}gcc CXX=${CROSS}g++ \
    LD=${CROSS}ld AR=${CROSS}ar \
    CROSSCOMPILE=yes `eval "${OPTS}"` make -j$(nproc) libs HAVE_OBJCOPY=no && ${CROSS}ranlib build/release/libmupdf-third.a; mkdir -p build/linux-armv7a; mv build/release build/linux-armv7a/
    cp build/linux-armv7a/release/libmupdf.a build/libmupdf_linux_arm.a; cp build/linux-armv7a/release/libmupdf-third.a build/libmupdfthird_linux_arm.a

CROSS="i686-w64-mingw32-" \
PKG_CONFIG_LIBDIR=${MINGW_X86_32}/usr/lib/pkgconfig \
    CC=${CROSS}gcc CXX=${CROSS}g++ \
    LD=${CROSS}ld AR=${CROSS}ar \
    CROSSCOMPILE=yes `eval "${OPTS}"` make -j$(nproc) libs OS=mingw32-cross
    cp build/mingw32-cross/release/libmupdf.a build/libmupdf_windows_386.a; cp build/mingw32-cross/release/libmupdf-third.a build/libmupdfthird_windows_386.a

CROSS="x86_64-w64-mingw32-" \
PKG_CONFIG_LIBDIR=${MINGW_X86_64}/usr/lib/pkgconfig \
    CC=${CROSS}gcc CXX=${CROSS}g++ \
    LD=${CROSS}ld AR=${CROSS}ar \
    CROSSCOMPILE=yes `eval "${OPTS}"` make -j$(nproc) libs OS=mingw64-cross
    cp build/mingw64-cross/release/libmupdf.a build/libmupdf_windows_amd64.a; cp build/mingw64-cross/release/libmupdf-third.a build/libmupdfthird_windows_amd64.a

export PATH=${PATH}:${APPLE_x86_64}/bin
CROSS="x86_64-apple-darwin21.1-" \
PKG_CONFIG_LIBDIR=${APPLE_x86_64}/usr/lib/pkgconfig \
    CC=${CROSS}clang CXX=${CROSS}clang++ \
    LD=${CROSS}ld AR=${CROSS}ar \
    RANLIB=${CROSS}ranlib \
    CROSSCOMPILE=yes `eval "${OPTS}"` make -j$(nproc) libs OS=MACOS && mkdir -p build/darwin-x86_64; mv build/release build/darwin-x86_64/
    cp build/darwin-x86_64/release/libmupdf.a build/libmupdf_darwin_amd64.a; cp build/darwin-x86_64/release/libmupdf-third.a build/libmupdfthird_darwin_amd64.a

export PATH=${PATH}:${APPLE_ARM_64}/bin
CROSS="aarch64-apple-darwin21.1-" \
PKG_CONFIG_LIBDIR=${APPLE_ARM_64}/usr/lib/pkgconfig \
    CC=${CROSS}clang CXX=${CROSS}clang++ \
    LD=${CROSS}ld AR=${CROSS}ar \
    RANLIB=${CROSS}ranlib \
    CROSSCOMPILE=yes `eval "${OPTS}"` make -j$(nproc) libs OS=MACOS && mkdir -p build/darwin-ARM_64; mv build/release build/darwin-ARM_64/
    cp build/darwin-ARM_64/release/libmupdf.a build/libmupdf_darwin_arm64.a; cp build/darwin-ARM_64/release/libmupdf-third.a build/libmupdfthird_darwin_arm64.a

export PATH=${PATH}:${ANDROID_ARM_32}/bin
CROSS="armv7a-linux-androideabi21-" \
PKG_CONFIG_LIBDIR=${ANDROID_ARM_32}/usr/lib/pkgconfig \
    CC=${CROSS}clang CXX=${CROSS}clang++ \
    CROSSCOMPILE=yes `eval "${OPTS}"` make -j$(nproc) libs HAVE_OBJCOPY=no && mkdir -p build/android-armv7a; mv build/release build/android-armv7a/
    cp build/android-armv7a/release/libmupdf.a build/libmupdf_android_arm.a; cp build/android-armv7a/release/libmupdf-third.a build/libmupdfthird_android_arm.a

export PATH=${PATH}:${ANDROID_ARM_64}/bin
CROSS="aarch64-linux-android21-" \
PKG_CONFIG_LIBDIR=${ANDROID_ARM_64}/usr/lib/pkgconfig \
    CC=${CROSS}clang CXX=${CROSS}clang++ \
    CROSSCOMPILE=yes `eval "${OPTS}"` make -j$(nproc) libs HAVE_OBJCOPY=no && mkdir -p build/android-aarch64; mv build/release build/android-aarch64/
    cp build/android-aarch64/release/libmupdf.a build/libmupdf_android_arm64.a; cp build/android-aarch64/release/libmupdf-third.a build/libmupdfthird_android_arm64.a

This is the bash script I am using to build everything, hope it can help you.

@gen2brain
Copy link
Owner

Of course, I have a patch that disables CJK fonts, static library is by default 50M, and without CJK fonts is 5M.

@guoquanlebytedance
Copy link
Author

Thank you very much.
I'll try this script.
And How can this patch be used?

@gen2brain
Copy link
Owner

If your goal is to build with CJK fonts, you don't need the patch, it just modifies Makefile/Makerules and some define in the header file. The default build should work for you.

@guoquanlebytedance
Copy link
Author

I'm sorry I didn't understand what you mean, I'm directly referencing the latest go-fitz in go.mod now, but I still have CJK problems. Do you mean that the go-fitz default version can solve this problem, or do you mean that I just need to compile the default build of the mupdf static library.

@gen2brain
Copy link
Owner

It is not related to go-fitz. For CJK, all you need is extlib tag. That will use external library, whether it is dynamic/shared or static library is up to user. If you don't want a requirement that your users need to install mupdf, static library is a must.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants