You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pulsar.apache.org by Yunze Xu <xy...@apache.org> on 2023/09/04 11:53:49 UTC

[Discuss] Release RPM packages with cxx11 ABI

Hi all,

Currently the official released pre-built binaries for Linux include:
- RPM packages for RedHat-based Linux distros
- DEB packages for Debian-based Linux distros
- APK packages for Alpine-based Linux distros

Though they are provided in different Linux distributions, they are
all compiled with GCC. However, only the RPM package is built with GCC
< 5. GCC 5 brings a breaking ABI change [1] to the std::string, which
is widely used in the Pulsar C++ client interfaces as the byte array.
In short, the impact is, if you're using GCC >= 5
1. You have to add the -D_GLIBCXX_USE_CXX11_ABI=0 compile option to
use the pre-built RPM package.
2. If your application depends on other 3rd party libraries that are
built with GCC >= 5, the pre-built RPM package cannot be used
together.

So for users that use GCC >= 5, the current RPM package is very
unfriendly especially for the 2nd case. As a workaround, they have to
build libraries by themselves, while installing dependencies might be
complicated in C++ world.

However, CentOS 7, whose EOL is 2024-06-30 [2], is still widely used.
In addition, if you're going to upgrade your GCC via devtoolset, the
installed GCC still does not have the cxx11 ABI [3]. So I don't think
it's good to drop the support for old ABIs for RedHat users.

In short, I suggest adding separated pre-built binaries with new ABIs
for RPM packages. The hierarchy will be:

rpm-arm64/aarch64/            ----  RPMs with new ABIs
rpm-arm64/aarch64/legacy ---- RPMs with old ABIs
rpm-x86_64/x86_64/           ---- RPMs with new ABIs
rpm-x86_64/x86_64/legacy ---- RPMs with old ABIs

See [4] for the current hierarchy.

After that, we should document the difference here [5].

[1] https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
[2] https://wiki.centos.org/About/Product
[3] https://bugzilla.redhat.com/show_bug.cgi?id=1546704
[4] https://archive.apache.org/dist/pulsar/pulsar-client-cpp-3.3.0/
[5] https://pulsar.apache.org/docs/3.1.x/client-libraries-cpp-setup/

Thanks,
Yunze

Re: [Discuss] Release RPM packages with cxx11 ABI

Posted by Baodi Shi <ba...@apache.org>.
>
> +1

Thanks,
Baodi Shi


On Sep 5, 2023 at 09:13:12, PengHui Li <pe...@apache.org> wrote:

> +1
>
> And if we can have a README file under the cpp client distribution
> directory.
> It should be great. Users can find the explanation of what legacy means.
>
> Regards,
> Penghui
>
> On Mon, Sep 4, 2023 at 7:54 PM Yunze Xu <xy...@apache.org> wrote:
>
> Hi all,
>
>
> Currently the official released pre-built binaries for Linux include:
>
> - RPM packages for RedHat-based Linux distros
>
> - DEB packages for Debian-based Linux distros
>
> - APK packages for Alpine-based Linux distros
>
>
> Though they are provided in different Linux distributions, they are
>
> all compiled with GCC. However, only the RPM package is built with GCC
>
> < 5. GCC 5 brings a breaking ABI change [1] to the std::string, which
>
> is widely used in the Pulsar C++ client interfaces as the byte array.
>
> In short, the impact is, if you're using GCC >= 5
>
> 1. You have to add the -D_GLIBCXX_USE_CXX11_ABI=0 compile option to
>
> use the pre-built RPM package.
>
> 2. If your application depends on other 3rd party libraries that are
>
> built with GCC >= 5, the pre-built RPM package cannot be used
>
> together.
>
>
> So for users that use GCC >= 5, the current RPM package is very
>
> unfriendly especially for the 2nd case. As a workaround, they have to
>
> build libraries by themselves, while installing dependencies might be
>
> complicated in C++ world.
>
>
> However, CentOS 7, whose EOL is 2024-06-30 [2], is still widely used.
>
> In addition, if you're going to upgrade your GCC via devtoolset, the
>
> installed GCC still does not have the cxx11 ABI [3]. So I don't think
>
> it's good to drop the support for old ABIs for RedHat users.
>
>
> In short, I suggest adding separated pre-built binaries with new ABIs
>
> for RPM packages. The hierarchy will be:
>
>
> rpm-arm64/aarch64/            ----  RPMs with new ABIs
>
> rpm-arm64/aarch64/legacy ---- RPMs with old ABIs
>
> rpm-x86_64/x86_64/           ---- RPMs with new ABIs
>
> rpm-x86_64/x86_64/legacy ---- RPMs with old ABIs
>
>
> See [4] for the current hierarchy.
>
>
> After that, we should document the difference here [5].
>
>
> [1] https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
>
> [2] https://wiki.centos.org/About/Product
>
> [3] https://bugzilla.redhat.com/show_bug.cgi?id=1546704
>
> [4] https://archive.apache.org/dist/pulsar/pulsar-client-cpp-3.3.0/
>
> [5] https://pulsar.apache.org/docs/3.1.x/client-libraries-cpp-setup/
>
>
> Thanks,
>
> Yunze
>
>
>

Re: [Discuss] Release RPM packages with cxx11 ABI

Posted by PengHui Li <pe...@apache.org>.
+1

And if we can have a README file under the cpp client distribution
directory.
It should be great. Users can find the explanation of what legacy means.

Regards,
Penghui

On Mon, Sep 4, 2023 at 7:54 PM Yunze Xu <xy...@apache.org> wrote:

> Hi all,
>
> Currently the official released pre-built binaries for Linux include:
> - RPM packages for RedHat-based Linux distros
> - DEB packages for Debian-based Linux distros
> - APK packages for Alpine-based Linux distros
>
> Though they are provided in different Linux distributions, they are
> all compiled with GCC. However, only the RPM package is built with GCC
> < 5. GCC 5 brings a breaking ABI change [1] to the std::string, which
> is widely used in the Pulsar C++ client interfaces as the byte array.
> In short, the impact is, if you're using GCC >= 5
> 1. You have to add the -D_GLIBCXX_USE_CXX11_ABI=0 compile option to
> use the pre-built RPM package.
> 2. If your application depends on other 3rd party libraries that are
> built with GCC >= 5, the pre-built RPM package cannot be used
> together.
>
> So for users that use GCC >= 5, the current RPM package is very
> unfriendly especially for the 2nd case. As a workaround, they have to
> build libraries by themselves, while installing dependencies might be
> complicated in C++ world.
>
> However, CentOS 7, whose EOL is 2024-06-30 [2], is still widely used.
> In addition, if you're going to upgrade your GCC via devtoolset, the
> installed GCC still does not have the cxx11 ABI [3]. So I don't think
> it's good to drop the support for old ABIs for RedHat users.
>
> In short, I suggest adding separated pre-built binaries with new ABIs
> for RPM packages. The hierarchy will be:
>
> rpm-arm64/aarch64/            ----  RPMs with new ABIs
> rpm-arm64/aarch64/legacy ---- RPMs with old ABIs
> rpm-x86_64/x86_64/           ---- RPMs with new ABIs
> rpm-x86_64/x86_64/legacy ---- RPMs with old ABIs
>
> See [4] for the current hierarchy.
>
> After that, we should document the difference here [5].
>
> [1] https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
> [2] https://wiki.centos.org/About/Product
> [3] https://bugzilla.redhat.com/show_bug.cgi?id=1546704
> [4] https://archive.apache.org/dist/pulsar/pulsar-client-cpp-3.3.0/
> [5] https://pulsar.apache.org/docs/3.1.x/client-libraries-cpp-setup/
>
> Thanks,
> Yunze
>