# syntax=docker/dockerfile:1 # # libmspub (Microsoft Publisher) and libcdr (CorelDRAW), with librevenge, compiled # to one WebAssembly module for johnmcm.com's /pub-viewer and /cdr-viewer. # # Reproducible: the Emscripten image is pinned by version and digest, and every # source tarball by version and SHA-256, downloaded from the projects' own # release locations. Built from the OpenImprenta libmspub-wasm spike # (https://github.com/RicardoNigrelli/libmspub-wasm, MPL-2.0), with libcdr # and lcms2 added. # # ./build.ps1 (or) docker build --target export --output type=local,dest=dist . # # Licences: librevenge, libmspub and libcdr are MPL-2.0; lcms2 is MIT; zlib # zlib; ICU Unicode-DFS-2016; Boost headers BSL-1.0. The sources of the MPL # libraries, and these build files, are published at /source/revenge/. ARG EMSDK_IMAGE=emscripten/emsdk:6.0.10@sha256:e077d54e2b8970575ebc4f185ac1de0b95c05f2b266134d4ba27449af7aebf65 FROM ${EMSDK_IMAGE} AS deps ARG LIBREVENGE_VERSION=0.0.5 ARG LIBREVENGE_SHA256=5892ca6796f7a2a93d580832e907e849b19d980b40d326a283b18877ab6de0c5 ARG LIBMSPUB_VERSION=0.1.5 ARG LIBMSPUB_SHA256=3671095f5a10bee8a755052a30576952c5b16d8b0f2ba9f2fb998338c18cb119 ARG LIBCDR_VERSION=0.1.9 ARG LIBCDR_SHA256=f7bb6abdd7f226820f288a93dd8d07759833c0250d9e202af90f9b312c4665a3 ARG LCMS2_VERSION=2.19.1 ARG LCMS2_SHA256=bfc54f7bab59fbc921012014a8032e4cba4abd46db47d46b76416a8c0b2815c8 # libmspub and libcdr use C++ exceptions for ordinary control flow, so # exceptions stay on, as native WebAssembly exceptions, everywhere. ENV EH_FLAGS="-fwasm-exceptions" ENV PREFIX=/opt/rv ENV PORT_FLAGS="-sUSE_ZLIB=1 -sUSE_ICU=1 -sUSE_BOOST_HEADERS=1" RUN embuilder build icu boost_headers zlib WORKDIR /src RUN curl -fsSL -o librevenge.tar.bz2 https://dev-www.libreoffice.org/src/librevenge-${LIBREVENGE_VERSION}.tar.bz2 \ && echo "${LIBREVENGE_SHA256} librevenge.tar.bz2" | sha256sum -c - \ && curl -fsSL -o libmspub.tar.xz https://dev-www.libreoffice.org/src/libmspub/libmspub-${LIBMSPUB_VERSION}.tar.xz \ && echo "${LIBMSPUB_SHA256} libmspub.tar.xz" | sha256sum -c - \ && curl -fsSL -o libcdr.tar.xz https://dev-www.libreoffice.org/src/libcdr/libcdr-${LIBCDR_VERSION}.tar.xz \ && echo "${LIBCDR_SHA256} libcdr.tar.xz" | sha256sum -c - \ && curl -fsSL -o lcms2.tar.gz https://github.com/mm2/Little-CMS/releases/download/lcms${LCMS2_VERSION}/lcms2-${LCMS2_VERSION}.tar.gz \ && echo "${LCMS2_SHA256} lcms2.tar.gz" | sha256sum -c - \ && tar xjf librevenge.tar.bz2 && tar xJf libmspub.tar.xz && tar xJf libcdr.tar.xz && tar xzf lcms2.tar.gz # librevenge: core and streams (the generators are not needed: ours is in src/). WORKDIR /src/librevenge-${LIBREVENGE_VERSION} RUN emconfigure ./configure --prefix=${PREFIX} \ --disable-shared --enable-static \ --disable-tests --without-docs --disable-werror --disable-weffc \ --enable-streams --disable-generators \ CFLAGS="-Oz ${EH_FLAGS}" CXXFLAGS="-Oz ${EH_FLAGS} ${PORT_FLAGS}" CPPFLAGS="${PORT_FLAGS}" \ LDFLAGS="${PORT_FLAGS} ${EH_FLAGS}" \ ZLIB_CFLAGS=" " ZLIB_LIBS="-sUSE_ZLIB=1" \ && emmake make -j"$(nproc)" && emmake make install # lcms2 (colour management, used by libcdr for CMYK and spot colours). WORKDIR /src/lcms2-${LCMS2_VERSION} RUN emconfigure ./configure --prefix=${PREFIX} --disable-shared --enable-static \ --without-jpeg --without-tiff --without-zlib CFLAGS="-Oz" \ && emmake make -j"$(nproc)" -C src && emmake make -C src install && emmake make -C include install # libmspub, with the spike's three patches. COPY patches/libmspub/ /patches/libmspub/ WORKDIR /src/libmspub-${LIBMSPUB_VERSION} RUN for p in /patches/libmspub/*.patch; do echo "applying $p"; git apply --verbose "$p"; done \ && emconfigure ./configure --prefix=${PREFIX} \ --disable-shared --enable-static \ --disable-tools --disable-fuzzers --without-docs --disable-werror --disable-weffc \ CFLAGS="-Oz ${EH_FLAGS}" CXXFLAGS="-Oz ${EH_FLAGS} ${PORT_FLAGS}" CPPFLAGS="${PORT_FLAGS}" \ LDFLAGS="${PORT_FLAGS} ${EH_FLAGS}" \ REVENGE_CFLAGS="-I${PREFIX}/include/librevenge-0.0" REVENGE_LIBS="-L${PREFIX}/lib -lrevenge-0.0" \ ZLIB_CFLAGS=" " ZLIB_LIBS="-sUSE_ZLIB=1" ICU_CFLAGS=" " ICU_LIBS="-sUSE_ICU=1" \ && emmake make -j"$(nproc)" && emmake make install # libcdr. WORKDIR /src/libcdr-${LIBCDR_VERSION} RUN emconfigure ./configure --prefix=${PREFIX} \ --disable-shared --enable-static \ --disable-tools --disable-fuzzers --disable-tests --without-docs --disable-werror --disable-weffc \ CFLAGS="-Oz ${EH_FLAGS}" CXXFLAGS="-Oz ${EH_FLAGS} ${PORT_FLAGS}" CPPFLAGS="${PORT_FLAGS} -I${PREFIX}/include" \ LDFLAGS="${PORT_FLAGS} ${EH_FLAGS} -L${PREFIX}/lib" \ REVENGE_CFLAGS="-I${PREFIX}/include/librevenge-0.0" REVENGE_LIBS="-L${PREFIX}/lib -lrevenge-0.0" \ LCMS2_CFLAGS="-I${PREFIX}/include" LCMS2_LIBS="-L${PREFIX}/lib -llcms2" \ ZLIB_CFLAGS=" " ZLIB_LIBS="-sUSE_ZLIB=1" ICU_CFLAGS=" " ICU_LIBS="-sUSE_ICU=1" \ && emmake make -j"$(nproc)" && emmake make install # Filtered ICU data: only the codepage converters the libraries ask for. FROM deps AS icudata RUN apt-get update && apt-get install -y --no-install-recommends icu-devtools=74.2-1ubuntu3.1 && rm -rf /var/lib/apt/lists/* COPY icu/make-icudata.sh /icu/make-icudata.sh RUN bash /icu/make-icudata.sh /opt/icudata FROM deps AS wasm WORKDIR /binding COPY --from=icudata /opt/icudata/icudata_subset.c ./ COPY src/ ./ RUN bash ./compile.sh /out FROM scratch AS export COPY --from=wasm /out/ /