Thank you for helping dig into the details. What you’ve written makes sense, and is consistent with the comments in absl/base/options.h regarding ABSL_OPTION_USE_STD_STRING_VIEW:

    A value of 2 means to detect the C++ version being used to compile Abseil,
    and use an alias only if a working std::string_view is available.  This
    option is useful when you are building your program from source.  It should     not be used otherwise -- for example, if you are distributing Abseil in a     binary package manager -- since in mode 2, absl::string_view will name a     different type, with a different mangled name and binary layout, depending on
    the compiler flags passed by the end user.  For more info, see
https://abseil.io/about/design/dropin-types.

https://github.com/abseil/abseil-cpp/blob/c8a2f92586fe9b4e1aff049108f5db8064924d8e/absl/base/options.h#L138

For completeness, the reason the value of ABSL_OPTION_USE_STD_STRING_VIEW changed from 2 to 1 since the previous release is an intentional upstream change described as follows:

    Change `absl/base/options.h` at install time to reflect the ABI used
    to compile the libraries, i.e., if Abseil was compiled with
    C++ >= 17 then the `ABSL_OPTION_USE_STD_*` macros are set to `1`,
    because then the C++ 17 types are embedded in the ABI of the installed
    artifacts.

    Likewise, set the `target_compile_features()` of Abseil libraries
    to reflect the C++ version used to compile them. If they the Abseil
    libraries are compiled with C++ >= 17, then all downstream
    dependencies must also be compiled with C++ >= 17.

https://github.com/abseil/abseil-cpp/commit/308bbf300fe9332130f4784c7a91fa2ad707d6e4

So the only way that dependent packages can use C++14 is if we intentionally and explicitly downgrade the C++ standard used to compile abseil-cpp from C++17 (the default) to C++14.

Given all this, it appears to me that the best course is still to keep abseil-cpp on the default C++17 standard and accept that dependent packages cannot use C++14. However, I’m pleased to have a much better understanding of what is happening, how, and why, and I’m still happy to consider any proposals to proceed differently.

On 3/15/23 6:29 PM, Jonathan Wakely wrote:


On Wed, 15 Mar 2023 at 22:17, Jonathan Wakely <jwak...@redhat.com> wrote:



    On Wed, 15 Mar 2023 at 22:14, Ben Beasley
    <c...@musicinmybrain.net> wrote:

        Thank you for prompting me to look at this more closely. A
        quick investigation reveals:

        “Abseil libraries require C++14 as the current minimum
        standard. When compiled with C++17 (either because it is the
        compiler's default or explicitly requested), then Abseil
        requires C++17.”

        
https://github.com/abseil/abseil-cpp/blob/20230125.1/CMake/AbseilHelpers.cmake#L291

        The abseil-cpp package in Fedora has been compiled as C++17
        for some time—at first explicitly, but this would also now be
        the default if the spec file did not configure a particular
        standard—so it seems dependent packages already technically
        needed C++17, and it is mere happenstance that this particular
        release is revealing incompatibilities.


    I'm not sure if that's true, see my other email which crossed with
    yours. In the previous release absl::string_view would work for
    both C++14 and C++17, because USE_STD_STRING_VIEW was defined to
    2, so adapted to the headers that included it.

    In the new release it is hardcoded to only work for C++17. That
    seems like a new change in the new version, not something that was
    already present.


Digging deeper, maybe it was true, and ilbc was just getting away with it by chance.

Several member functions of absl::string_view are defined out-of-line in abseil-cpp-20220623.1/absl/strings/string_view.cc but if the library is built as C++17 then those won't be defined (because absl::string_view is just an alias for std::string_view, so all the members come from libstdc++). So all clients of abseil-cpp shared libs do need to be compiled as C++17 or later. It looks like libilbc.so.3.0.4 doesn't actually use any libasbl_*.so libs, so only uses libabsl headers, and that's why it "worked" when the header was adaptive w.r.t. the string-view definition. It doesn't care that there are no definitions for those string_view member functions, because it happens to not use those specific member functions.
_______________________________________________
devel mailing list -- devel@lists.fedoraproject.org
To unsubscribe send an email to devel-le...@lists.fedoraproject.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org
Do not reply to spam, report it: 
https://pagure.io/fedora-infrastructure/new_issue

Reply via email to