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

deps: Add build recipe for PNG #4423

Merged
merged 6 commits into from
Nov 6, 2024

Conversation

zachlewis
Copy link
Contributor

As requested in #4387.

@lgritz
Copy link
Collaborator

lgritz commented Sep 18, 2024

Looks like we're still failing CI here

@zachlewis
Copy link
Contributor Author

indeed... it's the strangest thing. Still trying to get to the bottom of this.

I think what's happening is, for systems that have a "too old" version of dynamic PNG libraries installed, now that there's a build recipe available, even if we build newer static PNG libs, the build system is still preferring to link the older shared libraries (even though they're too old).

I dunno if this is a clue or a red herring, but it seems the build system might be getting confused about which version of PNG it's found versus the version it's trying to build (at least nominally):

 Could NOT find PNG: Found unsuitable version "1.5.13", but required is at least "1.6.0" (found /usr/lib64/libpng.so)
-- Building package PNG 1.5.13 locally
--         PNG_BUILD_VERSION = 1.6.44
--         PNG_BUILD_SHARED_LIBS = OFF
--         Building local PNG 1.6.44 from https://github.com/glennrp/libpng
--         Downloading local https://github.com/glennrp/libpng
Note: checking out 'f5e92d76973a7a53f517579bc95d61483bf108c0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at f5e92d7 Release libpng version 1.6.44
-- Configuring done
-- Generating done
CMake Warning:
  Manually-specified variables were not used by the project:

    CMAKE_COMPILE_WARNING_AS_ERROR
    CMAKE_MESSAGE_INDENT
    CMAKE_RULE_MESSAGES


-- Build files have been written to: /__w/OpenImageIO/OpenImageIO/build/deps/PNG-build
[1/31] Generating pngprefix.h
[2/31] Generating scripts/pnglibconf.c
[3/31] Generating pnglibconf.c
[4/31] Generating scripts/symbols.out
[5/31] Generating scripts/symbols.chk
[6/31] Generating pnglibconf.out
[7/31] Generating pnglibconf.h
[8/31] Generating scripts/vers.out
[9/31] Generating scripts/sym.out
[10/31] Generating scripts/prefix.out
[11/31] Generating libpng.sym
[12/31] Generating libpng.vers
[13/31] Generating scripts/intprefix.out
[14/31] Building C object CMakeFiles/png_static.dir/pngmem.c.o
[15/31] Building C object CMakeFiles/png_static.dir/pngrio.c.o
[16/31] Building C object CMakeFiles/png_static.dir/pngpread.c.o
[17/31] Building C object CMakeFiles/png_static.dir/pngerror.c.o
[18/31] Building C object CMakeFiles/png_static.dir/pngget.c.o
[19/31] Building C object CMakeFiles/png_static.dir/pngtrans.c.o
[20/31] Building C object CMakeFiles/png_static.dir/pngset.c.o
[21/31] Building C object CMakeFiles/png_static.dir/png.c.o
[22/31] Building C object CMakeFiles/png_static.dir/pngwio.c.o
[23/31] Building C object CMakeFiles/png_static.dir/pngread.c.o
[24/31] Building C object CMakeFiles/png_static.dir/intel/intel_init.c.o
[25/31] Building C object CMakeFiles/png_static.dir/pngwtran.c.o
[26/31] Building C object CMakeFiles/png_static.dir/pngwrite.c.o
[27/31] Building C object CMakeFiles/png_static.dir/pngrutil.c.o
[28/31] Building C object CMakeFiles/png_static.dir/pngrtran.c.o
[29/31] Building C object CMakeFiles/png_static.dir/intel/filter_sse2_intrinsics.c.o
[30/31] Building C object CMakeFiles/png_static.dir/pngwutil.c.o
[31/31] Linking C static library libpng16.a
[0/1] Install the project...
-- Install configuration: "Release"
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/lib/libpng16.a
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/lib/libpng.a
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/include/png.h
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/include/pngconf.h
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/include/pnglibconf.h
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/include/libpng16/png.h
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/include/libpng16/pngconf.h
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/include/libpng16/pnglibconf.h
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/bin/libpng-config
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/bin/libpng16-config
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/share/man/man3/libpng.3
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/share/man/man3/libpngpf.3
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/share/man/man5/png.5
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/lib/pkgconfig/libpng.pc
-- Up-to-date: /__w/OpenImageIO/OpenImageIO/build/deps/dist/bin/libpng-config
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/lib/pkgconfig/libpng16.pc
-- Up-to-date: /__w/OpenImageIO/OpenImageIO/build/deps/dist/bin/libpng16-config
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/lib/libpng/libpng16.cmake
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/lib/libpng/libpng16-release.cmake
-- Up-to-date: /__w/OpenImageIO/OpenImageIO/build/deps/dist/lib/libpng16.a
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/lib/cmake/PNG/PNGTargets.cmake
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/lib/cmake/PNG/PNGTargets-release.cmake
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/lib/cmake/PNG/PNGConfig.cmake
-- Installing: /__w/OpenImageIO/OpenImageIO/build/deps/dist/lib/cmake/PNG/PNGConfigVersion.cmake
-- Refinding PNG with PNG_ROOT=/__w/OpenImageIO/OpenImageIO/build/deps/dist
-- Found PNG: /usr/lib64/libpng.so (found version "1.5.13") 
-- Found PNG 1.5.13 
--     PNG_INCLUDE_DIR = /usr/include;/usr/include
--     PNG_INCLUDE_DIRS = /usr/include;/usr/include
--     PNG_LIBRARIES = /usr/lib64/libpng.so;/usr/lib64/libz.so

so... in the second line in the above log snippet, it claims to be "Building package PNG 1.5.13 locally", even though it's building 1.6.44.

I'm not sure what, if anything, that has to do with the more serious problems:

  1. That it can't "refind" the freshly-built static PNG given PNG_ROOT, PNG_REFIND_VERSION, or even PNG_REFIND_ARGS CONFIG
  2. That it proceeds to link the system-level dynamic PNG 1.5.13 that it previously detected as too old

A lesser problem, but one worth figuring out -- currently, I'm forcing the recipe to only build static libraries, cuz Windows has trouble figuring out what to do with / how to install the dynamic PNG library it just built. (I was having similar trouble on macOS until I set -DPNG_FRAMEWORK=OFF; but I've not yet investigated what specifically is (or isn't) happening on Windows.

Ideally, we'd only link the static libraries, since that seems to behave properly across platforms, given the opportunity...
I believe the OCIO missing-dependency-build-system business allows one to forcibly prefer static libraries instead of dynamic libraries if both are found (on a per-library basis). I don't suppose there's a way to do that here?

@zachlewis
Copy link
Contributor Author

I'm kind of baffled by the CI build failures... I can't seem to pinpoint anything in the logs or the configs that would explain why or how the failures occur on some runs, but not others...

The problematic runs are:

  • CI / VFX2021 oldest gcc9.3/C++17 py3.7 exr-3.1
  • CI / VFX2021 gcc9/C++17 py3.7 exr3.1 ocio2.0
  • CI / VFX2022 gcc9/C++17 py39 exr3.1 ocio2.1
  • CI / VFX2022 clang13/C++17 py39 avx2 exr3.1 ocio2.1

And they all fail the same way:

FAILED: bin/simd_test 
: && ccache /usr/local/bin/_ccache/clang++ -O3 -DNDEBUG  src/libutil/CMakeFiles/simd_test.dir/Unity/unity_0_cxx.cxx.o -o bin/simd_test  -Wl,-rpath,/__w/OpenImageIO/OpenImageIO/build/lib:/usr/local/lib64:/__w/OpenImageIO/OpenImageIO/build/deps/dist/lib  lib/libOpenImageIO.so.2.6.6  lib/libOpenImageIO_Util.so.2.6.6  -lpthread  /usr/local/lib64/libImath-3_1.so.29.4.0  -lm  -Wl,-rpath-link,/usr/local/lib64:/__w/OpenImageIO/OpenImageIO/build/deps/dist/lib && :
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/../../../../bin/ld: lib/libOpenImageIO.so.2.6.6: undefined reference to `png_set_eXIf_1'
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/../../../../bin/ld: lib/libOpenImageIO.so.2.6.6: undefined reference to `png_get_eXIf_1'
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/../../../../bin/ld: lib/libOpenImageIO.so.2.6.6: undefined reference to `png_set_option'

But... considering the rest of the checks pass, it doesn't seem to be an issue with the compiler or compiler version, the VFX202X build image, the version of Python, the version of EXR, the version of OCIO, or whether sse instructions are used. And I can't seem to ascertain a particular constellation of settings that produces a failure.

The only thing I could identify that looked suspicious to me is the ordering of paths in the -Wl,-rpath-link,/usr/local/lib64:/__w/OpenImageIO/OpenImageIO/build/deps/dist/lib part of the build command for bin/simd_test. Earlier in the command, the path order is the reverse, with OIIO's build/deps/dist/lib path preceding /usr/local/lib64 (-Wl,-rpath,/__w/OpenImageIO/OpenImageIO/build/lib:/usr/local/lib64).

The logs aren't verbose enough for successful builds for me to tell if this is the difference that explains the failures of unsuccessful runs.

@zachlewis zachlewis force-pushed the build_PNG branch 4 times, most recently from 8dd92ae to 0c95b1d Compare September 26, 2024 04:40
@zachlewis
Copy link
Contributor Author

Okay, this doesn't seem to be working properly -- CMake is having trouble finding the correct PNG library, and my understanding is, the issue stems from PNG's own build system idiosyncracies. The failures above occur on systems with libpng v1.5 installed, which are initially detected as too-old; but are later "refound" after find_package fails to find the libraries under $PNG_ROOT. This seems to be a problem with either kitware's FindPNG.cmake, PNG's CMake config, or both.

This said, it looks like the libpng team has been very actively working on improving and modernizing their CMake-based build system recently, seemingly in anticipation of an imminent libpng 1.8 release.

Importantly, two weeks ago, libpng v1.6.44 made some improvements and changes to the CMake build system (see pnggroup/libpng#545 among others) -- which is great -- but the difference between 1.6.43 and 1.6.44 seems to have serious implications for how find_package behaves (or fails to behave) and where targets can be found -- namely, we need find_package to consider the CONFIG introduced in 1.6.44, and likewise set PNG_DIR.

However, sometimes, the find_package still fails to (re)find the correct libpng library. Locally, I can produce conditions with the VFX2021 image where find_package is able to find the proper self-built libraries... but only with incremental builds that reuse a build directory, and only after a first build attempt that manages to self-build PNG, but still proceeds to link the too-old system dynamic PNG, as described above.

We do have other means for finding PNG -- for one, PkgConfig / png_check_module seems to find our PNG without difficulty -- but I understand this might be problematic on Windows. Alternatively, we can use the output of the libpng-config cli tool for setting PNG_LIBRARIES and PNG_INCLUDE_DIRS (and PNG_FOUND)... but setting those values doesn't seem to sufficiently inform the rest of the build process. And I don't really know enough about CMake or building and linking stuff in general to know what exactly to do next.

I feel the best solution involves coercing CMake's own Find mechanism to do the right thing. I'm not sure if that means creating a custom FindPNG.cmake module or patching PNG's CMake config, or what; but I suspect the path of least resistance is contingent on the build system improvements the libpng team is currently working on.

This PR was initially motivated by Wheels workflow tasks failing on vanilla macos-14 runners; and while this build_PNG.cmake recipe does seem to help with building the macos-arm64 wheels, it obviously introduces problems under other conditions. So, for the time being, we're bypassing the PNG plugin entirely for the Wheels / Build MacOS ARM64 tasks until we can figure out a more robust solution for PNG.

@lgritz
Copy link
Collaborator

lgritz commented Oct 3, 2024

@zachlewis Any update on this one?

@zachlewis
Copy link
Contributor Author

I'm afraid not. I'll have another look, but I think I might be stuck...

The failures occur when the build system detects a too-old version of libpng:

  1. Build PNG locally with build_PNG.cmake
  2. Fail to find "our" locally-built libpng
  3. Build the PNG plugin against the "too old" system libpng

I'm trying to find a way to force the build system to always find and link "our" PNG; but find_package has trouble finding PNG to begin with.

Also, libpng 1.6.43 and 1.6.44 behave very differently.

@zachlewis zachlewis marked this pull request as draft October 3, 2024 21:40
@zachlewis zachlewis marked this pull request as draft October 3, 2024 21:40
@kaarrot
Copy link
Contributor

kaarrot commented Oct 20, 2024

The failures above occur on systems with libpng v1.5 installed, which are initially detected as too-old; but are later "refound" after find_package fails to find the libraries...

@zachlewis, I run into similar problem during 'Refind' step - the too old version of OpenEXR has been used even thought the locally we build another version according to the current minimal requirements. What I've found in this case is to explicitly instruct find_package() to use the local version instead. I feel this change may work for you as well.

@lgritz
Copy link
Collaborator

lgritz commented Oct 20, 2024

If that change doesn't break anything, I'm fine with it.

What do you think about adding

PATHS ${pkgname}_LOCAL_INSTALL_DIR NO_DEFAULT_PATH

which would, if I understand correctly, make it look ONLY in the place where we locally built the package, and none of the other usual locations. I believe that might make it impossible to accidentally find the wrong one installed elsewhere in the system.

@lgritz
Copy link
Collaborator

lgritz commented Oct 20, 2024

To clarify, I mean those are potential additional arguments to the find_package that is called in the re-find step.

@kaarrot
Copy link
Contributor

kaarrot commented Oct 20, 2024

What do you think about adding PATHS ${pkgname}_LOCAL_INSTALL_DIR NO_DEFAULT_PATH

I run a quick test replacing ${${pkgname}_REFIND_VERSION} REQUIRED with:

find_package (${pkgname} ${_pkg_UNPARSED_ARGUMENTS} ${${pkgname}_REFIND_ARGS} PATHS ${${pkgname}_LOCAL_INSTALL_DIR} NO_DEFAULT_PATH)

Sadly, this gives me the same result as the original issue - where 'Refind' detects existing system version of library - as if NO_DEFAULT_PATH has no effect.
I dug out some comments to also add NO_CMAKE_FIND_ROOT_PATH or rely on setting CMAKE_PREFIX_PATH but both errored detecting locally built (Robinmap).

If that change doesn't break anything, I'm fine with it.

So far only this version gives expected result and builds. Note I removed REQUIRED as it still finds locally built library.
find_package (${pkgname} ${${pkgname}_REFIND_VERSION} ${_pkg_UNPARSED_ARGUMENTS} ${${pkgname}_REFIND_ARGS})

@kaarrot
Copy link
Contributor

kaarrot commented Oct 21, 2024

The failures occur when the build system detects a too-old version of libpng:

  1. Build PNG locally with build_PNG.cmake
  2. Fail to find "our" locally-built libpng
  3. Build the PNG plugin against the "too old" system libpng

I was able to reproduce the problem with a system version of PNG 1.5 installed - which forces to build 1.6 version locally.
The build errors with missing symbols (png_set_eXIf_1) while linking some tests (simd_test).

Although I didn't encounter issue of not detecting local build of PNG. For consistency though, I moved the 'refinding' step into checked_find_package().

To address the missing symbols in simd_test, it appears that OpenImageIO does not apparently link with PNG if static version of the library is built locally. I'm not sure why this is not necessary in cases when the system version is used.

@zachlewis
Copy link
Contributor Author

Hey @kaarrot, thanks for having a look!

Super tricky, right?!

I've been doing a ton of experiments... hard to remember what I've tried and not tried, but I've definitely run into the same trouble as you with Robinmap after setting NO_DEFAULT_PATH in the (re)find_package step. I know I've messed with including ${pkgname}_REFIND_VERSION and REQUIRED in the (re)find_package step as well, to no avail.

I have found something that does seem to work, but I'm not sure if it's the direction we want to go, nor do I understand why this method works where others haven't... In any case, I'll push another commit to see what fails.

With a little help from ChatGPT, I put together a build_dependency_with_fetchcontent_populate macro that attempts to do what build_dependency_with_cmake does, but with FetchContent_Define and FetchContent_Populate instead of executing the configure / build / install steps as external processes. In particular, it uses a CMake 3.24 feature, the FetchContent_Define option OVERRIDE_FIND_PACKAGE to force future uses of find_package to find the named package exactly where FetchContent_Populate places it.

@zachlewis
Copy link
Contributor Author

hmmm... getting closer...!

Not sure why vfx2022-gcc9 and the vfx2021-hobbled tests are still failing, though...

@zachlewis
Copy link
Contributor Author

zachlewis commented Oct 22, 2024

Actually, looks like those successes were false positives. re-finding with ${pkgname}_REFIND_VERSION REQUIRED reveals elicits proper failures (in that find_package is still finding the system libpng).

I think this works for me locally cuz I'm using a newer version of CMake.


edit: nope, not the version of CMake either -- I tried testing "CI / VFX2021 hobbled" with CMake 3.24.4 + FetchContent_Declare's OVERRIDE_FIND_PACKAGE option, and... still no dice.

I'm not sure why I'm having success locally with my build_dependency_with_fetchcontent macro, but since it doesn't seem to help things here, I'll remove it shortly.

@zachlewis
Copy link
Contributor Author

Wow. It looks like I mangled the commit history pretty good here, huh.

Instead of trying to reconcile with main and clean stuff up, I've started a fresh branch here:
https://github.com/zachlewis/OpenImageIO/tree/build_PNG_2

Right now, there's a single added build_PNG.cmake file, which is at parity with the one here (so, same 8 failing checks).

If / when I have something worth sharing, I'll close this draft PR and open another.

I'm not sure what the next step here would be. I guess we could try a custom FindPNG module?

@lgritz
Copy link
Collaborator

lgritz commented Oct 30, 2024

If you rebase on top of main and squash the whole thing down to one commit, do you get that nice compact addition of the build_PNG.cmake only?

@zachlewis
Copy link
Contributor Author

Thank you , that worked perfectly!

@lgritz
Copy link
Collaborator

lgritz commented Nov 1, 2024

Still weird here.

You should be able to

git push origin build_PNG_2:build_PNG --force

@zachlewis
Copy link
Contributor Author

I had no idea I could do that. Should be less weird now.

@lgritz
Copy link
Collaborator

lgritz commented Nov 2, 2024

I've been fooling around with this myself. No matter what I do, it's explicitly including the system libpng.so. I'm starting to wonder if some other dependency is pulling it in under our noses.

@zachlewis
Copy link
Contributor Author

(I don't seem to be able to approve the changes in github, but I most certainly do approve!)

@zachlewis
Copy link
Contributor Author

Indeed, I've been playing around with the order of linked libraries for OpenImageIO target. What turns out to help is to place locally png library before ${format_plugin_libs}.

This is very interesting. FWIW, Freetype does seem to require (or at least use if available) PNG, so I wonder if PNG's placement below Freetype here is specifically what's causing problems for us; and it makes me wonder if the build system picking up a dynamic Freetype lib that itself links a dynamic libpng.so is somehow fighting our ability to find our libpng.

Man, if we can force the build system to build static deps the whole way down for all plugins... :chefs_kiss:

@zachlewis
Copy link
Contributor Author

zachlewis commented Nov 4, 2024

I may have spoken too soon...

I'm having trouble building the MacOS ARM64-only Python wheels, wherein we're setting -DCMAKE_OSX_ARCHITECTURES="arm64"

  FAILED: lib/libOpenImageIO.3.1.0.dylib
  : && /Applications/Xcode.app/Contents/Developer/usr/bin/g++ -Os -DNDEBUG -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk -mmacosx-version-min=11 -dynamiclib -Wl,-headerpad_max_install_names -compatibility_version 3.1.0 -current_version 3.1.0 -o lib/libOpenImageIO.3.1.0.dylib -install_name @rpath/libOpenImageIO.3.1.0.dylib src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo_pixelmath.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo_channels.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo_compare.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo_copy.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo_deep.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo_draw.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo_addsub.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo_muldiv.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo_mad.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo_minmaxchan.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo_orient.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo_xform.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo_demosaic.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebufalgo_yee.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/deepdata.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/exif.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/exif-canon.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/formatspec.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/icc.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imagebuf.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imageinput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imageio.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imageioplugin.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/imageoutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/iptc.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/xmp.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/color_ocio.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/maketexture.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/bluenoise.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/printinfo.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/oiio_gpu.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/libtexture/texturesys.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/libtexture/texture3d.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/libtexture/environment.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/libtexture/texoptions.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/libtexture/imagecache.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/bmp.imageio/bmpinput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/bmp.imageio/bmpoutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/bmp.imageio/bmp_pvt.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/cineon.imageio/cineoninput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/cineon.imageio/libcineon/Cineon.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/cineon.imageio/libcineon/OutStream.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/cineon.imageio/libcineon/Codec.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/cineon.imageio/libcineon/Reader.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/cineon.imageio/libcineon/CineonHeader.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/cineon.imageio/libcineon/ElementReadStream.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/cineon.imageio/libcineon/InStream.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/dds.imageio/ddsinput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/dpx.imageio/dpxinput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/dpx.imageio/dpxoutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/dpx.imageio/libdpx/DPX.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/dpx.imageio/libdpx/OutStream.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/dpx.imageio/libdpx/RunLengthEncoding.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/dpx.imageio/libdpx/Codec.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/dpx.imageio/libdpx/Reader.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/dpx.imageio/libdpx/Writer.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/dpx.imageio/libdpx/DPXHeader.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/dpx.imageio/libdpx/ElementReadStream.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/dpx.imageio/libdpx/InStream.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/dpx.imageio/libdpx/DPXColorConverter.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/fits.imageio/fitsinput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/fits.imageio/fitsoutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/fits.imageio/fits_pvt.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/hdr.imageio/hdrinput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/hdr.imageio/hdroutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/ico.imageio/icoinput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/ico.imageio/icooutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/iff.imageio/iffinput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/iff.imageio/iffoutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/jpeg.imageio/jpeginput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/jpeg.imageio/jpegoutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/null.imageio/nullimageio.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/openexr.imageio/exrinput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/openexr.imageio/exroutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/openexr.imageio/exrinput_c.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/png.imageio/pnginput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/png.imageio/pngoutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/pnm.imageio/pnminput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/pnm.imageio/pnmoutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/psd.imageio/psdinput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/rla.imageio/rlainput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/rla.imageio/rlaoutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/sgi.imageio/sgiinput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/sgi.imageio/sgioutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/softimage.imageio/softimageinput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/softimage.imageio/softimage_pvt.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/targa.imageio/targainput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/targa.imageio/targaoutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/term.imageio/termoutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/tiff.imageio/tiffinput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/tiff.imageio/tiffoutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/webp.imageio/webpinput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/webp.imageio/webpoutput.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/zfile.imageio/zfile.cpp.o src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/__/include/OpenImageIO/detail/pugixml/pugixml.cpp.o  -Wl,-rpath,/var/folders/w7/h_1h043d5jlbq4gz7rzxdwdm0000gn/T/tmplu6tsuow/build/lib  lib/libOpenImageIO_Util.3.1.0.dylib  deps/dist/lib/libImath_v_3_1_10_OpenImageIO_v3_1_0.a  deps/dist/lib/libOpenEXR_v_3_2_4_OpenImageIO_v3_1_0.a  deps/dist/lib/libpng16.a  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/lib/libz.tbd  deps/dist/lib/libjpeg.a  deps/dist/lib/libOpenEXR_v_3_2_4_OpenImageIO_v3_1_0.a  deps/dist/lib/libOpenEXRCore_v_3_2_4_OpenImageIO_v3_1_0.a  deps/dist/lib/libpng16.a  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/lib/libz.tbd  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/lib/libz.tbd  deps/dist/lib/libjpeg.a  deps/dist/lib/libwebp.a  deps/dist/lib/libwebpdemux.a  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/lib/libz.tbd  deps/dist/lib/libOpenColorIO_v_2_4_0_OIIO.a  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/lib/libz.tbd  deps/dist/lib/libIlmThread_v_3_2_4_OpenImageIO_v3_1_0.a  deps/dist/lib/libIex_v_3_2_4_OpenImageIO_v3_1_0.a  deps/dist/lib/libtiff.a  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/lib/libz.tbd  deps/dist/lib/libjpeg.a  deps/dist/lib/libdeflate.a  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/lib/libm.tbd  deps/dist/lib/libwebp.a  deps/dist/lib/libsharpyuv.a  deps/dist/lib/libImath_v_3_1_10_OpenImageIO_v3_1_0.a  -lm  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/lib/libexpat.tbd  deps/dist/lib/libpystring.a  deps/dist/lib/libyaml-cpp.a  deps/dist/lib/libminizip-ng.a  -framework ColorSync  -framework CoreFoundation  -framework CoreGraphics  -framework IOKit  deps/dist/lib/libfreetype.a  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/lib/libbz2.tbd  deps/dist/lib/libpng.a  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/lib/libz.tbd && :
  ld: warning: ignoring duplicate libraries: 'deps/dist/lib/libImath_v_3_1_10_OpenImageIO_v3_1_0.a', 'deps/dist/lib/libOpenEXR_v_3_2_4_OpenImageIO_v3_1_0.a', 'deps/dist/lib/libjpeg.a', 'deps/dist/lib/libpng16.a', 'deps/dist/lib/libwebp.a'
  Undefined symbols for architecture arm64:
    "_png_create_info_struct", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_create_read_struct", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_destroy_read_struct", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_error", referenced from:
        _read_data_from_FT_Stream in libfreetype.a[35](sfnt.c.o)
    "_png_get_IHDR", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_get_error_ptr", referenced from:
        _error_callback in libfreetype.a[35](sfnt.c.o)
        _read_data_from_FT_Stream in libfreetype.a[35](sfnt.c.o)
    "_png_get_io_ptr", referenced from:
        _read_data_from_FT_Stream in libfreetype.a[35](sfnt.c.o)
    "_png_get_valid", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_read_end", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_read_image", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_read_info", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_read_update_info", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_set_expand_gray_1_2_4_to_8", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_set_filler", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_set_gray_to_rgb", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_set_interlace_handling", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_set_longjmp_fn", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
        _error_callback in libfreetype.a[35](sfnt.c.o)
    "_png_set_packing", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_set_palette_to_rgb", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_set_read_fn", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_set_read_user_transform_fn", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_set_strip_16", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
    "_png_set_tRNS_to_alpha", referenced from:
        _Load_SBit_Png in libfreetype.a[35](sfnt.c.o)
  ld: symbol(s) not found for architecture arm64
  clang: error: linker command failed with exit code 1 (use -v to see invocation)

It seems libpng has had a little trouble with MacOS ARM64 CMake-based builds (pnggroup/libpng#372)

It's suggested in the thread that configure is far more reliable than libpng's Cmake build system...

@zachlewis
Copy link
Contributor Author

I wonder if the problems I'm experiencing somehow reflect an issue with Freetype, and not PNG.

I can verify that arm64 libpng libraries are built successfully...

$  lipo -info libpng.a 
Non-fat file: libpng.a is architecture: arm64

The problem goes away if I disable support for PNG-compressed OpenType embedded bitmaps in Freetype by passing the following CMake argument to Freetype's build_dependency_with_cmake command: -D FT_DISABLE_PNG=ON

I dunno what a PNG-compressed OpenType embedded bitmap is, or how common they are in the wild... but in my very brief testing, it does seem that oiiotool is able to read and write PNGs and print DroidSans text without issue...

@lgritz
Copy link
Collaborator

lgritz commented Nov 4, 2024

Good work! This is something I definitely would not have been able to figure out on my own, so I appreciate the help!

I feel like you're giving me too much credit! This was far from a skilled application of actual knowledge. Basically, I just tinkered with changing anything and everything I could think of that might be related, all weekend long over the course of 34 CI runs, until finally getting a combination that picked up the right libraries and passed the tests for each of our test matrix cases. It was very frustrating and I felt like I was flying blind most of the time.

@lgritz
Copy link
Collaborator

lgritz commented Nov 4, 2024

I think your assessment is correct -- Freetype is pulling in its own libpng and the exact order that the linker tries to resolve the symbols is very fragile and can break one or the other.

libpng gives us a build-time option to give a prefix to all the symbols (which is one of the changes I made), which prevents the wrong symbols from being linked, but they don't have a build option to change the name of the library, which really would have been handy and solved the whole thing, because then the linker wouldn't pick just one -- it would look like two differently named libraries with totally differently named symbols.

I'm almost tempted to propose a PR against libpng to add this option, but it's a pretty big pain for me to get legal clearance to contribute to a project. It's a one-time bureaucratic cost, so well worth it for a project we have a continued need to contribute to, but it's a high threshold for something where I want to make a 3 line change and then probably never send anything to the project again.

OK, so I think you're on the right track with the idea that for the python wheels, you can probably build freetype locally without the png option for now and see if anybody ever complains. Let's try that as an additional safeguard.

I will also note for the record that for quite some time, I've had it on my list to see if we should jettison libpng entirely in favor of "spng" which is just one .h and one .c file so can easily be vendored, and is supposed to be higher performance read/write as well. I was about one day of frustration away from just doing this and cutting libpng out of our lives. Maybe it's something we should still aim for in the relatively near future to eliminate all future libpng woes.

Freetype seems to be having trouble linking PNG on MacOS when CMAKE_OSX_ARCHITECTURES = arm64.

Signed-off-by: Zach Lewis <[email protected]>
@zachlewis
Copy link
Contributor Author

oh my god i broke everything

@zachlewis
Copy link
Contributor Author

Never mind, I don't think this one's my fault...

Between now and when things last worked, it looks like our CI / Ubuntu checks are now pulling a newer version of libheif (now 1.19, previously 1.17); and they seem to be running an older version of the OS (now "focal", previously "noble"). It seems unrelated to the changes I've just made (to disable PNG support in Freetype), but I'll happily revert them if needed... but I'm guessing I might see these failures in other PRs now.

I'm almost tempted to propose a PR against libpng to add this option

That seems like a really good idea. If I have some time and if I can figure out what needs to be done, I'll see if I can submit a PR to the libpng folks.

Maybe it's something we should still aim for in the relatively near future to eliminate all future libpng woes.

I'd come across "spng" in my desperation too not long ago, and was gonna ask about it on Slack if we'd completely run out of momentum here... I guess it's really a matter of how much more pain you're willing to put up with if this PR doesn't solve everything foreverish.

@lgritz
Copy link
Collaborator

lgritz commented Nov 4, 2024

Let's just say that for the purpose of this PR, any test matrix entry that only fails the "heif" test is unrelated and won't prevent us from merging. We will investigate that separately.

I'd come across "spng" in my desperation too not long ago, and was gonna ask about it on Slack if we'd completely run out of momentum here... I guess it's really a matter of how much more pain you're willing to put up with if this PR doesn't solve everything foreverish.

I think if this PR is working for now, we should merge it as-is.

I think that the most important application of this PR is to help put the final touches on the Python wheel generation so that we are sure it supports PNG, a commonly encountered format (despite being awful). Correct me if I'm wrong, but since WE (via our GHA workflow) are the ones generating the wheel, don't we have the option to make that workflow uninstall any existing problematic/conflicting dependencies from the VM image before we start our own builds? So we should be able to build conflict-free static libraries we need for the python wheel.

Sure, somebody building on their own system that contains conflicting dependency versions can still have trouble in some cases, but that's no worse than where we are today, and we can return to the problem to make the build system even more robust after 3.0 release including allowing PyPI installs.

@zachlewis
Copy link
Contributor Author

Let's stick a fork in this sucker. LGTM.

Correct me if I'm wrong, but since WE (via our GHA workflow) are the ones generating the wheel, don't we have the option to make that workflow uninstall any existing problematic/conflicting dependencies from the VM image before we start our own builds? So we should be able to build conflict-free static libraries we need for the python wheel.

Yes, you're absolutely correct. I was in fact uninstalling homebrew'd installed packages in the Wheels workflow at one point specifically to get rid of Freetype + friends; but upon review, we felt a more robust way to go would be to implement a IGNORE_HOMEBREWED_DEPS build option which appends typical homebrew + macports prefixes to CMAKE_IGNORE_PATH. For your consideration, of course.

Anyway -- yes, we can do whatever we want. Except install Docker on the MacOS images, apparently.

@lgritz
Copy link
Collaborator

lgritz commented Nov 4, 2024

Certainly, if there's a reliable way to ignore the paths, use that rather than uninstalling (which would take more time).

@lgritz
Copy link
Collaborator

lgritz commented Nov 4, 2024

OK, I will merge this, then. It's no big deal to have further changes to the PNG build if need be.

But give me a couple hours to chase down the heif thing, if I can get that solved I will feel better.

@lgritz
Copy link
Collaborator

lgritz commented Nov 5, 2024

I merged in the unrelated CI fix, and that does appear to have gotten this all unstuck.

Copy link
Collaborator

@lgritz lgritz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion diffs

zachlewis and others added 2 commits November 5, 2024 10:30
Co-authored-by: Larry Gritz <[email protected]>
Signed-off-by: zachlewis <[email protected]>
Co-authored-by: Larry Gritz <[email protected]>
Signed-off-by: zachlewis <[email protected]>
@lgritz
Copy link
Collaborator

lgritz commented Nov 6, 2024

I believe this is ready to go. The one test failure seems unrelated, let's look into it separately. You ready for me to merge this, @zachlewis ?

Copy link
Collaborator

@lgritz lgritz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@zachlewis
Copy link
Contributor Author

Merge away! Thanks again.

@lgritz lgritz merged commit ffb7276 into AcademySoftwareFoundation:main Nov 6, 2024
28 of 29 checks passed
lgritz added a commit to lgritz/OpenImageIO that referenced this pull request Nov 10, 2024
As requested in AcademySoftwareFoundation#4387.

---------

Signed-off-by: Zach Lewis <[email protected]>
Signed-off-by: Larry Gritz <[email protected]>
Signed-off-by: zachlewis <[email protected]>
Co-authored-by: Larry Gritz <[email protected]>
lgritz added a commit to lgritz/OpenImageIO that referenced this pull request Nov 10, 2024
As requested in AcademySoftwareFoundation#4387.

---------

Signed-off-by: Zach Lewis <[email protected]>
Signed-off-by: Larry Gritz <[email protected]>
Signed-off-by: zachlewis <[email protected]>
Co-authored-by: Larry Gritz <[email protected]>
lgritz added a commit to lgritz/OpenImageIO that referenced this pull request Nov 13, 2024
As requested in AcademySoftwareFoundation#4387.

---------

Signed-off-by: Zach Lewis <[email protected]>
Signed-off-by: Larry Gritz <[email protected]>
Signed-off-by: zachlewis <[email protected]>
Co-authored-by: Larry Gritz <[email protected]>
@zachlewis zachlewis deleted the build_PNG branch November 15, 2024 18:32
lgritz added a commit to lgritz/OpenImageIO that referenced this pull request Nov 21, 2024
As requested in AcademySoftwareFoundation#4387.

---------

Signed-off-by: Zach Lewis <[email protected]>
Signed-off-by: Larry Gritz <[email protected]>
Signed-off-by: zachlewis <[email protected]>
Co-authored-by: Larry Gritz <[email protected]>
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

Successfully merging this pull request may close these issues.

3 participants