On Thu, Mar 28, 2024 at 04:12:55PM +0000, Stuart Henderson wrote: > On 2024/03/25 23:07, Brad Smith wrote: > > Here is an update to OpenImageIO 2.5.9. > > 2.4.17.0 is broken on i386 - 2.5.9 doesn't fix it
I noticed a package missing on amd64 for the last two bulk builds but haven't seen anything from naddy@ yet. It builds for me on my amd64 build host. This appears to have something to do with the last commit to strutil_test.cpp. Try the following.. Index: Makefile =================================================================== RCS file: /cvs/ports/graphics/openimageio/Makefile,v retrieving revision 1.69 diff -u -p -u -p -r1.69 Makefile --- Makefile 22 Mar 2024 12:25:32 -0000 1.69 +++ Makefile 29 Mar 2024 01:33:57 -0000 @@ -7,6 +7,7 @@ GH_ACCOUNT = AcademySoftwareFoundation GH_PROJECT = OpenImageIO GH_TAGNAME = v2.4.17.0 PKGNAME = ${DISTNAME:L} +REVISION = 0 SHARED_LIBS += OpenImageIO 14.0 # 2.4.10 SHARED_LIBS += OpenImageIO_Util 9.0 # 2.4.10 Index: patches/patch-src_include_OpenImageIO_detail_farmhash_h =================================================================== RCS file: patches/patch-src_include_OpenImageIO_detail_farmhash_h diff -N patches/patch-src_include_OpenImageIO_detail_farmhash_h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_include_OpenImageIO_detail_farmhash_h 29 Mar 2024 01:33:57 -0000 @@ -0,0 +1,92 @@ +Revert fix(strutil.h): ensure proper constexpr of string hashing (#3901) +8e8dab1215f584ff940ea6240768abecd5c63f07 + +Index: src/include/OpenImageIO/detail/farmhash.h +--- src/include/OpenImageIO/detail/farmhash.h.orig ++++ src/include/OpenImageIO/detail/farmhash.h +@@ -244,77 +244,21 @@ STATIC_INLINE uint32_t Fetch32(const char *p) { + + #else + +-#if defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L +-// C++20 compiler with constexpr support std::bitcast +-STATIC_INLINE uint64_t Fetch64(const char *p) { +- struct BlockOfBytes { +- char bytes[8]; +- }; +- BlockOfBytes bob{p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7]}; +- return std::bit_cast<uint64_t>(bob); ++template <typename T> ++STATIC_INLINE T FetchType(const char *p) { ++ T result = 0; ++ for (size_t i = 0; i < sizeof(T); i++) ++ reinterpret_cast<char *>(&result)[i] = p[i]; ++ return result; + } +-STATIC_INLINE uint32_t Fetch32(const char *p) { +- struct BlockOfBytes { +- char bytes[4]; +- }; +- BlockOfBytes bob{p[0],p[1],p[2],p[3]}; +- return std::bit_cast<uint32_t>(bob); +-} + +-#else +- +-// constexpr supported for C++14,17 versions that manually load bytes and +-// bitshift into proper order for the unsigned integer. +-// NOTE: bigendian untested + STATIC_INLINE uint64_t Fetch64(const char *p) { +- // Favor letting uint8_t construction to handle +- // signed to unsigned conversion vs. uint64_t(p[0]&0xff) +- uint8_t b0 = p[0]; +- uint8_t b1 = p[1]; +- uint8_t b2 = p[2]; +- uint8_t b3 = p[3]; +- uint8_t b4 = p[4]; +- uint8_t b5 = p[5]; +- uint8_t b6 = p[6]; +- uint8_t b7 = p[7]; +- return littleendian() ? +- (uint64_t(b0)) | // LSB +- (uint64_t(b1) << 8) | +- (uint64_t(b2) << 16) | +- (uint64_t(b3) << 24) | +- (uint64_t(b4) << 32) | +- (uint64_t(b5) << 40) | +- (uint64_t(b6) << 48) | +- (uint64_t(b7) << 56) // MSB +- : // Big Endian byte order +- (uint64_t(b0) << 56) | // MSB +- (uint64_t(b1) << 48) | +- (uint64_t(b2) << 40) | +- (uint64_t(b3) << 32) | +- (uint64_t(b4) << 24) | +- (uint64_t(b5) << 16) | +- (uint64_t(b6) << 8) | +- (uint64_t(b7)) ; // LSB ++ return FetchType<uint64_t>(p); + } + + STATIC_INLINE uint32_t Fetch32(const char *p) { +- uint8_t b0 = p[0]; +- uint8_t b1 = p[1]; +- uint8_t b2 = p[2]; +- uint8_t b3 = p[3]; +- return littleendian() ? +- (uint32_t(b0)) | // LSB +- (uint32_t(b1) << 8) | +- (uint32_t(b2) << 16) | +- (uint32_t(b3) << 24) // MSB +- : // Big Endian byte order +- (uint32_t(b0) << 24) | // MSB +- (uint32_t(b1) << 16) | +- (uint32_t(b2) << 8) | +- (uint32_t(b3)); // LSB ++ return FetchType<uint32_t>(p); + } +-#endif +- + + // devices don't seem to have bswap_64() or bswap_32() + template<typename T> Index: patches/patch-src_include_OpenImageIO_string_view_h =================================================================== RCS file: patches/patch-src_include_OpenImageIO_string_view_h diff -N patches/patch-src_include_OpenImageIO_string_view_h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_include_OpenImageIO_string_view_h 29 Mar 2024 01:33:57 -0000 @@ -0,0 +1,39 @@ +Revert fix(strutil.h): ensure proper constexpr of string hashing (#3901) +8e8dab1215f584ff940ea6240768abecd5c63f07 + +Index: src/include/OpenImageIO/string_view.h +--- src/include/OpenImageIO/string_view.h.orig ++++ src/include/OpenImageIO/string_view.h +@@ -106,8 +106,9 @@ class basic_string_view { (public) + : m_chars(chars), m_len(len) { } + + /// Construct from char*, use strlen to determine length. +- constexpr basic_string_view(const CharT* chars) noexcept +- : m_chars(chars), m_len(chars ? cestrlen(chars) : 0) { } ++ OIIO_CONSTEXPR17 basic_string_view(const CharT* chars) noexcept ++ : m_chars(chars), m_len(chars ? Traits::length(chars) : 0) { } ++ // N.B. char_traits::length() is constexpr starting with C++17. + + /// Construct from std::string. Remember that a string_view doesn't have + /// its own copy of the characters, so don't use the `string_view` after +@@ -428,20 +429,6 @@ class basic_string_view { (public) + if (!traits::find(s.data(), s.length(), *first)) + return first; + return last; +- } +- +- // Guaranteed constexpr length of a C string +- static constexpr size_t cestrlen(const charT* chars) { +-#if OIIO_CPLUSPLUS_VERSION >= 17 +- return Traits::length(chars); +-#else +- if (chars == nullptr) +- return 0; +- size_t len = 0; +- while (chars[len] != 0) +- len++; +- return len; +-#endif + } + + class traits_eq { Index: patches/patch-src_libutil_strutil_test_cpp =================================================================== RCS file: patches/patch-src_libutil_strutil_test_cpp diff -N patches/patch-src_libutil_strutil_test_cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_libutil_strutil_test_cpp 29 Mar 2024 01:33:57 -0000 @@ -0,0 +1,16 @@ +Revert fix(strutil.h): ensure proper constexpr of string hashing (#3901) +8e8dab1215f584ff940ea6240768abecd5c63f07 + +Index: src/libutil/strutil_test.cpp +--- src/libutil/strutil_test.cpp.orig ++++ src/libutil/strutil_test.cpp +@@ -350,9 +350,6 @@ test_hash() + OIIO_CHECK_EQUAL(strhash(std::string("foo")), 6150913649986995171); + OIIO_CHECK_EQUAL(strhash(string_view("foo")), 6150913649986995171); + OIIO_CHECK_EQUAL(strhash(""), 0); // empty string hashes to 0 +- // Check longer hash and ensure that it's really constexpr +- constexpr size_t hash = Strutil::strhash("much longer string"); +- OIIO_CHECK_EQUAL(hash, 16257490369375554819ULL); + } + +