GraphicsMagick: configure.ac: libbrotlidec and liblbrotlienc dep...

GraphicsMagick Commits <[email protected]> Fri, 17 Nov 2023 18:59:26 -0600
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.3436.1700269176.7940.graphicsmagick-commit@lists.sourceforge.net>
changeset 45cce7492a0d in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=45cce7492a0d
summary: configure.ac: libbrotlidec and liblbrotlienc depend on libbrotlicommon.

diffstat:

 ChangeLog                 |    3 +
 configure                 |    6 +-
 configure.ac              |    6 +-
 fuzzing/README.txt        |   21 ++
 fuzzing/oss-fuzz-build.sh |  341 ++++++++++++++++++++++++++++++++++-----------
 www/Changelog.html        |    2 +
 6 files changed, 288 insertions(+), 91 deletions(-)

diffs (truncated from 515 to 500 lines):

diff -r 8e37ef9a271c -r 45cce7492a0d ChangeLog
--- a/ChangeLog	Fri Nov 17 07:39:15 2023 -0600
+++ b/ChangeLog	Fri Nov 17 18:59:21 2023 -0600
@@ -1,5 +1,8 @@
 2023-11-17  Bob Friesenhahn  <[email protected]>
 
+	* configure.ac: libbrotlidec and liblbrotlienc depend on
+	libbrotlicommon.
+
 	* fuzzing/oss-fuzz-build.sh: Build script improvements.  Change
 	'freetype2' to 'freetype'. Add libde265, libheif, and libjxl to
 	build.
diff -r 8e37ef9a271c -r 45cce7492a0d configure
--- a/configure	Fri Nov 17 07:39:15 2023 -0600
+++ b/configure	Fri Nov 17 18:59:21 2023 -0600
@@ -27260,7 +27260,7 @@
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-ljxl -lhwy -lbrotlidec -lbrotlienc $LIBS"
+LIBS="-ljxl -lhwy -lbrotlidec -lbrotlienc -lbrotlicommon $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -27345,7 +27345,7 @@
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lbrotlidec  $LIBS"
+LIBS="-lbrotlidec -lbrotlicommon $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -27400,7 +27400,7 @@
         # JXL is a C++ Lib so requires linking with stdc++.
         # TODO: A better solution would be to tell automake to do any linking with
         # c++, but I can't figure out a way to get this working.
-        LIB_JXL='-ljxl -ljxl_threads -lhwy -lbrotlidec -lbrotlienc -lstdc++'
+        LIB_JXL='-ljxl -ljxl_threads -lhwy -lbrotlidec -lbrotlienc -lbrotlicommon -lstdc++'
         LIBS="$LIB_JXL $LIBS"
 
 $as_echo "#define HasJXL 1" >>confdefs.h
diff -r 8e37ef9a271c -r 45cce7492a0d configure.ac
--- a/configure.ac	Fri Nov 17 07:39:15 2023 -0600
+++ b/configure.ac	Fri Nov 17 18:59:21 2023 -0600
@@ -2572,10 +2572,10 @@
     AC_LANG_PUSH([C++])
     AC_CHECK_HEADER([jxl/decode.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`])
     # jxl always requires hwy/brotli no extra test needed
-    AC_CHECK_LIB([jxl],[JxlDecoderCreate],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[-lhwy -lbrotlidec -lbrotlienc])
+    AC_CHECK_LIB([jxl],[JxlDecoderCreate],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[-lhwy -lbrotlidec -lbrotlienc -lbrotlicommon])
     AC_CHECK_LIB([jxl_threads],[JxlThreadParallelRunnerCreate],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`])
     # Testing for decoder should also cover encoder
-    AC_CHECK_LIB([brotlidec],[BrotliDecoderVersion],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[])
+    AC_CHECK_LIB([brotlidec],[BrotliDecoderVersion],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],[-lbrotlicommon])
     AC_LANG_POP
     AC_MSG_CHECKING([if JXL package is complete])
     if test $passed -gt 0
@@ -2588,7 +2588,7 @@
         # JXL is a C++ Lib so requires linking with stdc++.
         # TODO: A better solution would be to tell automake to do any linking with
         # c++, but I can't figure out a way to get this working.
-        LIB_JXL='-ljxl -ljxl_threads -lhwy -lbrotlidec -lbrotlienc -lstdc++'
+        LIB_JXL='-ljxl -ljxl_threads -lhwy -lbrotlidec -lbrotlienc -lbrotlicommon -lstdc++'
         LIBS="$LIB_JXL $LIBS"
         AC_DEFINE([HasJXL],[1],[Define if you have JXL library])
         AC_MSG_RESULT([yes])
diff -r 8e37ef9a271c -r 45cce7492a0d fuzzing/README.txt
--- a/fuzzing/README.txt	Fri Nov 17 07:39:15 2023 -0600
+++ b/fuzzing/README.txt	Fri Nov 17 18:59:21 2023 -0600
@@ -7,3 +7,24 @@
 
 These are automatically run by Google's OSS-Fuzz infrastructure:
 https://github.com/google/oss-fuzz
+
+See https://google.github.io/oss-fuzz/advanced-topics/reproducing/ for instructions for building/executing oss-fuzz targets locally.
+
+Cloning OSS-Fuzz:
+
+  $ git clone --depth=1 https://github.com/google/oss-fuzz.git
+  $ cd oss-fuzz
+
+Pull the latest Docker images::
+
+  $ python infra/helper.py pull_images
+
+Build the image and the fuzzers::
+
+  $ python infra/helper.py build_image graphicsmagick
+
+  $ python infra/helper.py build_fuzzers --sanitizer <address/memory/undefined> --architecture <x86_64/i386> graphicsmagick
+
+Reproducing bugs::
+
+  $ python infra/helper.py reproduce $PROJECT_NAME <fuzz_target_name> <testcase_path>
diff -r 8e37ef9a271c -r 45cce7492a0d fuzzing/oss-fuzz-build.sh
--- a/fuzzing/oss-fuzz-build.sh	Fri Nov 17 07:39:15 2023 -0600
+++ b/fuzzing/oss-fuzz-build.sh	Fri Nov 17 18:59:21 2023 -0600
@@ -3,6 +3,9 @@
 # This is intended to be run from OSS-Fuzz's build environment. We intend to
 # eventually refactor it to be easy to run locally.
 
+rm -rf $WORK/bin/
+rm -rf $WORK/lib/
+
 # build zlib
 printf "=== Building zlib...\n"
 pushd "$SRC/zlib"
@@ -12,134 +15,286 @@
 popd
 
 # build xz
-printf "=== Building xz...\n"
+printf "=== Building ${SRC}/xz...\n"
 pushd "$SRC/xz"
 ./autogen.sh --no-po4a --no-doxygen
-PKG_CONFIG_PATH="$WORK/lib/pkgconfig" ./configure --disable-xz --disable-xzdec --disable-lzmadec --disable-lzmainfo --disable-lzma-links --disable-ifunc --disable-scripts --disable-doc --disable-shared --with-pic=yes --prefix="$WORK"
+PKG_CONFIG_PATH="$WORK/lib/pkgconfig" ./configure \
+               --disable-xz \
+               --disable-xzdec \
+               --disable-lzmadec \
+               --disable-lzmainfo \
+               --disable-lzma-links \
+               --disable-ifunc \
+               --disable-scripts \
+               --disable-doc \
+               --disable-shared \
+               --enable-static \
+               --with-pic=yes \
+               --prefix="$WORK"
 make -j$(nproc)
 make install
 popd
 
 # build zstd
-printf "==== Building zstd...\n"
+printf "==== Building ${SRC}/zstd...\n"
 pushd "$SRC/zstd"
 make -j$(nproc) lib-release
 make install PREFIX="$WORK"
 popd
 
-printf "=== Building libpng...\n"
-pushd "$SRC/libpng"
-autoreconf -fiv
-PKG_CONFIG_PATH="$WORK/lib/pkgconfig" ./configure --prefix="$WORK" CPPFLAGS="-I$WORK/include" CFLAGS="$CFLAGS" LDFLAGS="${LDFLAGS:-} -L$WORK/lib"
-make -j$(nproc)
-make install
-popd
-
-# build libjpeg-turbo
-printf "=== Building libjpeg-turbo...\n"
-pushd "$SRC/libjpeg-turbo"
-CFLAGS="$CFLAGS -fPIC" cmake . -DCMAKE_INSTALL_PREFIX="$WORK" -DENABLE_STATIC=on -DENABLE_SHARED=on -DWITH_JPEG8=1 -DWITH_SIMD=0
+printf "=== Building ${SRC}/jasper...\n"
+pushd "$SRC/jasper"
+cmake -G "Unix Makefiles" -H. -Bstaging \
+      -DJAS_ENABLE_SHARED=false \
+      -DCMAKE_INSTALL_PREFIX=$WORK \
+      -DJAS_INCLUDE_BMP_CODEC=false \
+      -DJAS_INCLUDE_JPG_CODEC=false \
+      -DJAS_INCLUDE_MIF_CODEC=false \
+      -DJAS_INCLUDE_PNM_CODEC=false \
+      -DJAS_INCLUDE_RAS_CODEC=false \
+      -DJAS_ENABLE_OPENGL=false \
+      -DJAS_ENABLE_LIBJPEG=false \
+      -DJAS_ENABLE_OPENGL=false \
+      -DJAS_ENABLE_LIBHEIF=false
+pushd staging
 make -j$(nproc)
 make install
 popd
-
-# Build webp
-printf "=== Building webp...\n"
-pushd "$SRC/libwebp"
-./autogen.sh
-PKG_CONFIG_PATH="$WORK/lib/pkgconfig" ./configure CPPFLAGS="-I$WORK/include" CFLAGS="$CFLAGS" LDFLAGS="${LDFLAGS:-} -L$WORK/lib" --enable-libwebpmux --prefix="$WORK" CFLAGS="$CFLAGS -fPIC"
-make -j$(nproc)
-make install
 popd
 
-# Build libtiff
-printf "=== Building libtiff...\n"
-pushd "$SRC/libtiff"
+printf "=== Building ${SRC}/libpng...\n"
+pushd "$SRC/libpng"
 autoreconf -fiv
-PKG_CONFIG_PATH="$WORK/lib/pkgconfig" ./configure CPPFLAGS="-I$WORK/include" CFLAGS="$CFLAGS" LDFLAGS="${LDFLAGS:-} -L$WORK/lib" --prefix="$WORK" --disable-old-jpeg
+PKG_CONFIG_PATH="$WORK/lib/pkgconfig" ./configure \
+               --prefix="$WORK" \
+               --disable-shared \
+               --enable-static \
+               CPPFLAGS="-I$WORK/include" \
+               CFLAGS="$CFLAGS" \
+               LDFLAGS="${LDFLAGS:-} -L$WORK/lib"
 make -j$(nproc)
 make install
 popd
 
-# Build liblcms2
-printf "=== Building lcms...\n"
-pushd "$SRC/Little-CMS"
-autoreconf -fiv
-PKG_CONFIG_PATH="$WORK/lib/pkgconfig" ./configure CPPFLAGS="-I$WORK/include" CFLAGS="$CFLAGS" LDFLAGS="${LDFLAGS:-} -L$WORK/lib" --prefix="$WORK"
-make -j$(nproc)
-make install
-popd
-
-# Build freetype
-printf "=== Building freetype...\n"
-pushd "$SRC/freetype"
-./autogen.sh
-PKG_CONFIG_PATH="$WORK/lib/pkgconfig" ./configure CPPFLAGS="-I$WORK/include" CFLAGS="$CFLAGS" LDFLAGS="${LDFLAGS:-} -L$WORK/lib" --prefix="$WORK" --enable-freetype-config
-make -j$(nproc)
-make install
-popd
-
-# Build libde265
-pushd "$SRC/libde265"
-./autogen.sh
-./configure --disable-shared --prefix="$WORK"
-make -j$(nproc)
-make install
-popd
-
-# Build libheif
-pushd "$SRC/libheif"
-cmake . -DCMAKE_INSTALL_PREFIX=$WORK -DBUILD_SHARED_LIBS=off -DBUILD_TESTING=off -DWITH_EXAMPLES=off -DENABLE_PLUGIN_LOADING=off -DWITH_JPEG_DECODER=off -DWITH_JPEG_ENCODER=off -DCMAKE_BUILD_TYPE=Release
-make -j$(nproc)
-make install
-popd
-
-#printf "=== Building libxml2...\n"
+#printf "=== Building ${SRC}/libxml2...\n"
 #pushd "$SRC/libxml2"
 #./autogen.sh --disable-shared --without-debug --without-legacy --without-python --without-schematron --without-schemas --prefix="${WORK}"
 #make -j$(nproc)
 #make install
 #popd
 
-printf "=== Building jasper...\n"
-pushd "$SRC/jasper"
-cmake -G "Unix Makefiles" -H. -Bstaging -DJAS_ENABLE_SHARED=false -DCMAKE_INSTALL_PREFIX=$WORK #-DJAS_INCLUDE_BMP_CODEC=false -DJAS_INCLUDE_JPG_CODEC=false -DJAS_INCLUDE_MIF_CODEC=false -DJAS_INCLUDE_PNM_CODEC=false -DJAS_INCLUDE_RAS_CODEC=false -DJAS_ENABLE_OPENGL=false -DJAS_ENABLE_LIBJPEG=false -DJAS_ENABLE_OPENGL=false -DJAS_ENABLE_LIBHEIF=false
-pushd staging
+# build libjpeg-turbo
+printf "=== Building ${SRC}/libjpeg-turbo...\n"
+pushd "$SRC/libjpeg-turbo"
+CFLAGS="$CFLAGS -fPIC" cmake . \
+      -DCMAKE_INSTALL_PREFIX="$WORK" \
+      -DENABLE_STATIC=on \
+      -DENABLE_SHARED=off \
+      -DWITH_JPEG8=1 \
+      -DWITH_SIMD=0
+make -j$(nproc)
+make install
+popd
+
+# Build webp
+printf "=== Building ${SRC}/libwebp...\n"
+pushd "$SRC/libwebp"
+./autogen.sh
+PKG_CONFIG_PATH="$WORK/lib/pkgconfig" ./configure \
+               CPPFLAGS="-I$WORK/include" \
+               CFLAGS="$CFLAGS" \
+               LDFLAGS="${LDFLAGS:-} -L$WORK/lib" \
+               --enable-libwebpmux \
+               --disable-shared \
+               --enable-static \
+               --disable-gl \
+               --disable-sdl \
+               --disable-png \
+               --disable-jpeg \
+               --disable-tiff \
+               --disable-gif \
+               --disable-wic \
+               --prefix="$WORK" \
+               CFLAGS="$CFLAGS -fPIC"
+make -j$(nproc)
+make install
+popd
+
+# Build libtiff
+printf "=== Building ${SRC}/libtiff...\n"
+pushd "$SRC/libtiff"
+autoreconf -fiv
+PKG_CONFIG_PATH="$WORK/lib/pkgconfig" ./configure \
+               CPPFLAGS="-I$WORK/include" \
+               CFLAGS="$CFLAGS" \
+               LDFLAGS="${LDFLAGS:-} -L$WORK/lib" \
+               --prefix="$WORK" \
+               --disable-old-jpeg \
+               --disable-shared \
+               --enable-static \
+               --disable-tools \
+               --disable-tests \
+               --disable-contrib
+make -j$(nproc)
+make install
+popd
+
+# Build liblcms2
+printf "=== Building ${SRC}/Little-CMS...\n"
+pushd "$SRC/Little-CMS"
+autoreconf -fiv
+PKG_CONFIG_PATH="$WORK/lib/pkgconfig" ./configure \
+               CPPFLAGS="-I$WORK/include" \
+               CFLAGS="$CFLAGS" \
+               LDFLAGS="${LDFLAGS:-} -L$WORK/lib" \
+               --prefix="$WORK" \
+               --disable-shared \
+               --enable-static
+make -j$(nproc)
+make install
+popd
+
+# Build freetype
+printf "=== Building ${SRC}/freetype...\n"
+pushd "$SRC/freetype"
+./autogen.sh
+PKG_CONFIG_PATH="$WORK/lib/pkgconfig" ./configure \
+               CPPFLAGS="-I$WORK/include" \
+               CFLAGS="$CFLAGS" \
+               LDFLAGS="${LDFLAGS:-} -L$WORK/lib" \
+               --prefix="$WORK" \
+               --enable-freetype-config \
+               --disable-shared \
+               --enable-static
 make -j$(nproc)
 make install
 popd
+
+# Build libx265
+pushd "$SRC/x265/build/linux"
+printf "=== Building ${SRC}/libx265...\n"
+cmake -G "Unix Makefiles" \
+      -DCMAKE_C_COMPILER=$CC \
+      -DCMAKE_CXX_COMPILER=$CXX \
+      -DCMAKE_C_FLAGS="$CFLAGS" \
+      -DCMAKE_CXX_FLAGS="$CXXFLAGS" \
+      -DCMAKE_INSTALL_PREFIX="$WORK" \
+      -DENABLE_SHARED:bool=off \
+      ../../source
+make clean
+make -j$(nproc) x265-static
+make install
+popd
+
+# Build libde265
+printf "=== Building ${SRC}/libde265...\n"
+pushd "$SRC/libde265"
+./autogen.sh
+./configure \
+    --prefix="$WORK" \
+    --disable-shared \
+    --enable-static \
+    --disable-dec265 \
+    --disable-sherlock265 \
+    --disable-hdrcopy \
+    --disable-enc265 \
+    --disable-acceleration_speed
+make clean
+make -j$(nproc)
+make install
 popd
 
-# freetype-config is in $WORK/bin so we temporarily add $WORK/bin to the path
-printf "=== Building GraphicsMagick...\n"
-PATH=$WORK/bin:$PATH PKG_CONFIG_PATH="$WORK/lib/pkgconfig" ./configure CPPFLAGS="-I$WORK/include/libpng16 -I$WORK/include/freetype2 -I$WORK/include/libxml2 -I$WORK/include" CFLAGS="$CFLAGS" LDFLAGS="${LDFLAGS:-} -L$WORK/lib" --prefix="$WORK" --disable-compressed-files --without-perl --with-quantum-depth=16
-make "-j$(nproc)"
+# Build libaom
+printf "=== Building ${SRC}/aom...\n"
+mkdir -p $SRC/aom/build/linux
+pushd "$SRC/aom/build/linux"
+cmake -G "Unix Makefiles" \
+      -DCMAKE_C_COMPILER=$CC \
+      -DCMAKE_CXX_COMPILER=$CXX \
+      -DCMAKE_C_FLAGS="$CFLAGS" \
+      -DCMAKE_CXX_FLAGS="$CXXFLAGS" \
+      -DCMAKE_INSTALL_PREFIX="$WORK" \
+      -DENABLE_SHARED:bool=off \
+      -DCONFIG_PIC=1 \
+      -DENABLE_EXAMPLES=0 \
+      -DENABLE_DOCS=0 \
+      -DENABLE_TESTS=0 \
+      -DCONFIG_SIZE_LIMIT=1 \
+      -DDECODE_HEIGHT_LIMIT=12288 \
+      -DDECODE_WIDTH_LIMIT=12288 \
+      -DDO_RANGE_CHECK_CLAMP=1 \
+      -DAOM_MAX_ALLOCABLE_MEMORY=536870912 \
+      -DAOM_TARGET_CPU=generic \
+  ../../
+make clean
+make -j$(nproc)
 make install
+popd
+
+# Remove shared libraries to avoid accidental linking against them.
+#rm -f $WORK/lib/*.so
+#rm -f $WORK/lib/*.so.*
+
+# Build libheif
+printf "=== Building ${SRC}/libheif...\n"
+pushd "$SRC/libheif"
+#cmake . -DCMAKE_INSTALL_PREFIX=$WORK -DBUILD_SHARED_LIBS=off -DBUILD_TESTING=off -DWITH_EXAMPLES=off -DENABLE_PLUGIN_LOADING=off -DWITH_JPEG_DECODER=off -DWITH_JPEG_ENCODER=off -DCMAKE_BUILD_TYPE=Release -DX265_INCLUDE_DIR="$WORK/include" -DX265_LIBRARY="$WORK/lib"
+mkdir build
+cd build
+cmake .. --preset=fuzzing \
+      -DCMAKE_INSTALL_PREFIX=$WORK \
+      -DFUZZING_COMPILE_OPTIONS="" \
+      -DFUZZING_LINKER_OPTIONS="$LIB_FUZZING_ENGINE" \
+      -DFUZZING_C_COMPILER=$CC -DFUZZING_CXX_COMPILER=$CXX \
+      -DWITH_DEFLATE_HEADER_COMPRESSION=OFF \
+      -DENABLE_SHARED:bool=off
+make -j$(nproc)
+make install
+popd
 
 # Build libjxl
+printf "=== Building ${SRC}/libjxl...\n"
 pushd "$SRC/libjxl"
-cmake . -DCMAKE_INSTALL_PREFIX=$WORK -DBUILD_TESTING=off -DBUILD_SHARED_LIBS=false -DJPEGXL_FORCE_SYSTEM_LCMS2=true -DJPEGXL_ENABLE_EXAMPLES=false -DJPEGXL_ENABLE_FUZZERS=false -DJPEGXL_ENABLE_TOOLS=false -DJPEGXL_ENABLE_JPEGLI=false -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CXXFLAGS"
+mkdir build
+cd build
+cmake .. \
+      -DCMAKE_INSTALL_PREFIX=$WORK \
+      -DBUILD_TESTING=off \
+      -DBUILD_SHARED_LIBS=false \
+      -DCMAKE_BUILD_TYPE=Release \
+      -DJPEGXL_ENABLE_BENCHMARK=false \
+      -DJPEGXL_ENABLE_EXAMPLES=false \
+      -DJPEGXL_ENABLE_FUZZERS=false \
+      -DJPEGXL_ENABLE_JPEGLI=false \
+      -DJPEGXL_ENABLE_MANPAGES=OFF \
+      -DJPEGXL_ENABLE_SJPEG=false \
+      -DJPEGXL_ENABLE_TOOLS=false \
+      -DJPEGXL_ENABLE_VIEWERS=false \
+      -DJPEGXL_FORCE_SYSTEM_LCMS2=true \
+      -DCMAKE_C_FLAGS="-DHWY_DISABLED_TARGETS=HWY_SSSE3 ${CFLAGS}" \
+      -DCMAKE_CXX_FLAGS="-DHWY_DISABLED_TARGETS=HWY_SSSE3 ${CXXFLAGS}"
 make -j$(nproc)
 make install
 cp third_party/brotli/*.a $WORK/lib
 cp third_party/brotli/*.pc $WORK/lib/pkgconfig
 popd
 
-# Order libraries in linkage dependency order so libraries on the
-# right provide symbols needed by libraries to the left, to the
-# maximum extent possible.
-# FIXME: This hard-coded list is not taking advantage of the list that GraphicsMagick configure computed!
-#MAGICK_LIBS="$WORK/lib/libxml2.a $WORK/lib/libjasper.a $WORK/lib/libpng.a $WORK/lib/libtiff.a $WORK/lib/liblcms2.a $WORK/lib/libwebpmux.a $WORK/lib/libwebp.a $WORK/lib/libsharpyuv.a $WORK/lib/libturbojpeg.a $WORK/lib/libfreetype.a $WORK/lib/libzstd.a $WORK/lib/liblzma.a $WORK/lib/libz.a"
-MAGICK_LIBS=''
-for lib in libxml2.a libjasper.a libpng.a libtiff.a liblcms2.a libwebpmux.a libwebp.a libsharpyuv.a libturbojpeg.a libfreetype.a libzstd.a liblzma.a libz.a ; do
-    if [ -f "${WORK}/lib/$lib" ] ; then
-        if [ -n "${MAGICK_LIBS}" ] ; then
-             MAGICK_LIBS="${MAGICK_LIBS} "
-        fi
-        MAGICK_LIBS="${MAGICK_LIBS}${WORK}/lib/${lib}"
-    fi
-done
-printf "MAGICK_LIBS=${MAGICK_LIBS}\n"
+printf "Built libraries:\n"
+ls -l ${WORK}/lib
+
+
+# freetype-config is in $WORK/bin so we temporarily add $WORK/bin to the path
+printf "=== Building GraphicsMagick...\n"
+PATH=$WORK/bin:$PATH PKG_CONFIG_PATH="$WORK/lib/pkgconfig" ./configure \
+    CPPFLAGS="-I$WORK/include/libpng16 -I$WORK/include/freetype2 -I$WORK/include/libxml2 -I$WORK/include" \
+    CFLAGS="$CFLAGS" \
+    LDFLAGS="${LDFLAGS:-} -L$WORK/lib" \
+    --prefix="$WORK" \
+    --disable-compressed-files \
+    --without-perl \
+    --with-quantum-depth=16
+make "-j$(nproc)"
+make install
 
 printf "=== Building fuzzers...\n"
 for f in fuzzing/*_fuzzer.cc; do
@@ -159,6 +314,22 @@
     set +x
 done
 
+# Order libraries in linkage dependency order so libraries on the
+# right provide symbols needed by libraries to the left, to the
+# maximum extent possible.
+# FIXME: This hard-coded list is not taking advantage of the list that GraphicsMagick configure computed!
+#MAGICK_LIBS="$WORK/lib/libxml2.a $WORK/lib/libjasper.a $WORK/lib/libpng.a $WORK/lib/libtiff.a $WORK/lib/liblcms2.a $WORK/lib/libwebpmux.a $WORK/lib/libwebp.a $WORK/lib/libsharpyuv.a $WORK/lib/libturbojpeg.a $WORK/lib/libfreetype.a $WORK/lib/libzstd.a $WORK/lib/liblzma.a $WORK/lib/libz.a"
+MAGICK_LIBS=''
+for lib in libxml2.a libjasper.a libpng.a libtiff.a liblcms2.a libwebpmux.a libwebpdemux.a libwebp.a libsharpyuv.a libheif.a libturbojpeg.a libfreetype.a libx265.a libde265.a libzstd.a liblzma.a libz.a ; do
+    if [ -f "${WORK}/lib/$lib" ] ; then
+        if [ -n "${MAGICK_LIBS}" ] ; then
+             MAGICK_LIBS="${MAGICK_LIBS} "
+        fi
+        MAGICK_LIBS="${MAGICK_LIBS}${WORK}/lib/${lib}"
+    fi
+done
+printf "MAGICK_LIBS=${MAGICK_LIBS}\n"
+