Skip to content

API Compatibility v0.27 vs v0.27 "dots" #890

@clanmills

Description

@clanmills

@nehaljwani shared something about ABI/API compatibility of different releases of Exiv2. I think it was this: https://abi-laboratory.pro/index.php?view=timeline&l=exiv2

In the past, I have not worried about API/ABI compatibility. Every release of Exiv2 (v0.24, v0.25 etc) has similar and slightly different APIs. They have a different set of headers and different library filenames. This is “open-source”, and users are expected to recompile applications for different versions of Exiv2.

However, with “the dots” we have a different scenario. In February, I had an email conversation with Dan Bricklin (Yes, the guy who invented Lotus-1-2-3) and he wanted to use Exiv2 for one of his projects. He had several conditions and one was “he could replace DLLs in an existing application”. Dan had a couple of features he wanted us to add to Exiv2 and we didn’t shake hands on a deal. I couldn’t undertake the necessary work and I can’t ask any member of Team Exiv2 to deliver anything to Dan’s schedule. We didn’t discuss money.

On 2019-05-23, I built Exiv2 0.27.0 and ran the test suite on MacOS-X. Then I build Exiv2 0.27.2.99 (0.27 maintenance development for v0.27.2). I successfully ran the 0.27 test suite using the 0.27.2.99 .dylib. Very good. Very pleased that this is working OK. I didn’t try on other platforms such as Windows or Linux.

I’ve written a 1 line command to extract the API from the library:
$ nm -g --demangle libexiv2.0.27.0.dylib | grep ' T ' | cut -d' ' -f 3- | sort > ~/temp/27.0.txt

This is a 4606 line file. (4610 lines for 0.27.2.99). So small changes in the API. Nothing that seems to be a disaster. I would like folks to be able to replace 0.27 DLLs for existing applications without recompiling anything.

Here's the diff. I'll see if this can be reduced. The remaining differences will be documented in the release notes for v0.27.2

I've invited Nehal to get involved in this effort and it fits well with tasks he has been assigned at work. So, Nehal will be the expert on API/ABI compatibility for "the dots".

I don't see any reason to be concerned about API/ABI compatibility for v0.28.

689 rmills@rmillsmbp:/Applications/Xcode.app $ diff ~/temp/27.0.txt ~/temp/27.2.txt 
774c774
< Exiv2::Internal::LensIdFct const* Exiv2::find<Exiv2::Internal::LensIdFct const, long, 46>(Exiv2::Internal::LensIdFct const (&) [46], long const&)
---
> Exiv2::Internal::LensIdFct const* Exiv2::find<Exiv2::Internal::LensIdFct const, long, 49>(Exiv2::Internal::LensIdFct const (&) [49], long const&)
1088c1088
< Exiv2::Internal::TagDetails const* Exiv2::find<Exiv2::Internal::TagDetails const, Exiv2::Internal::LensTypeAndFocalLengthAndMaxAperture, 352>(Exiv2::Internal::TagDetails const (&) [352], Exiv2::Internal::LensTypeAndFocalLengthAndMaxAperture const&)
---
> Exiv2::Internal::TagDetails const* Exiv2::find<Exiv2::Internal::TagDetails const, Exiv2::Internal::LensTypeAndFocalLengthAndMaxAperture, 360>(Exiv2::Internal::TagDetails const (&) [360], Exiv2::Internal::LensTypeAndFocalLengthAndMaxAperture const&)
1109d1108
< Exiv2::Internal::TagDetails const* Exiv2::find<Exiv2::Internal::TagDetails const, long, 352>(Exiv2::Internal::TagDetails const (&) [352], long const&)
1110a1110
> Exiv2::Internal::TagDetails const* Exiv2::find<Exiv2::Internal::TagDetails const, long, 360>(Exiv2::Internal::TagDetails const (&) [360], long const&)
2403c2403
< Exiv2::WebPImage::decodeChunks(unsigned long long)
---
> Exiv2::WebPImage::decodeChunks(long)
2728a2729
> Exiv2::readChunk(Exiv2::DataBuf&, Exiv2::BasicIo&)
3233a3235
> _exvGettext(char const*)
3235a3238
> bool Safe::Internal::builtin_add_overflow<long>(long, long, long&)
3272a3276
> long Safe::add<long>(long, long)
3977c3981
< std::__1::basic_ostream<char, std::__1::char_traits<char> >& Exiv2::Internal::printTag<352, Exiv2::Internal::canonCsLensType>(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, Exiv2::Value const&, Exiv2::ExifData const*)
---
> std::__1::basic_ostream<char, std::__1::char_traits<char> >& Exiv2::Internal::printTag<360, Exiv2::Internal::canonCsLensType>(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, Exiv2::Value const&, Exiv2::ExifData const*)
690 rmills@rmillsmbp:/Applications/Xcode.app $ 

I will investigate the differences and they will be eliminated or justified in releasenotes/releasenotes.txt

Metadata

Metadata

Assignees

No one assigned

    Labels

    testingAnything related to the tests and their infrastructure

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions