Merge lp:~michihenning/unity-scopes-api/abigail into lp:unity-scopes-api/devel

Proposed by Michi Henning
Status: Merged
Approved by: James Henstridge
Approved revision: 683
Merged at revision: 655
Proposed branch: lp:~michihenning/unity-scopes-api/abigail
Merge into: lp:unity-scopes-api/devel
Diff against target: 368 lines (+124/-96)
10 files modified
HACKING (+4/-7)
debian/VERSION (+1/-1)
debian/changelog (+24/-0)
debian/control.in (+2/-1)
test/CMakeLists.txt (+1/-1)
test/abi-compliance/CMakeLists.txt (+10/-6)
test/abi-compliance/abi.xml.in (+0/-57)
test/abi-compliance/check-abi-compliance.sh.in (+59/-21)
test/abi-compliance/gen-abi-dump.sh.in (+2/-2)
test/abi-compliance/suppressions (+21/-0)
To merge this branch: bzr merge lp:~michihenning/unity-scopes-api/abigail
Reviewer Review Type Date Requested Status
James Henstridge Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+285551@code.launchpad.net

Commit message

Changed from acc-compliance-checker to abigail for ABI test.

Description of the change

I think this is good to go now. I've tested both on Jenkins and in a silo.

We now use abigail instead of abi-compliance-checker for ABI testing.

The approach is much the same: dump the current ABI and compare that against a saved dump of the base ABI.

Due to some minor problems with abidiff suppressions and abidiff exit status, the check script currently suppresses output about added functions wholesale and then tests for success by checking that the generated report is empty. Once we a get a new version of abidiff, I'll update the check script to fail for added functions, so we can review explicitly what was added by a new version, and then add suppression directives as appropriate. This will serve as good sanity check (and the generated output is quite readable, so it's easy to do).

This does not affect the safety of the check: despite the work-around, we *will* reliably detect ABI breakage (just not as elegantly as I would like).

Abigail is faster than abi-compliance-checker. This is particularly noticeable on Arm, where it takes six minutes instead of over 20.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
677. By Michi Henning

Added test go guard against compilations without -g.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
678. By Michi Henning

Test was broken.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
James Henstridge (jamesh) wrote :

This looks pretty good. I've left a few inline comments about possible simplifications/improvements, but this is definitely on the right track.

review: Needs Fixing
Revision history for this message
Michi Henning (michihenning) wrote :

> This looks pretty good. I've left a few inline comments about possible
> simplifications/improvements, but this is definitely on the right track.

Thanks for the review!

I've fixed the gunzip issue and added back a comment in HACKING about where to find the report

With the cmake thing, I stuffed around with that for quite a while. The custom command to dump the abi is necessary because it needs to be dumped whenever it isn't there yet, or after the library has been rebuilt.

For the check-abi step, I want to make sure that the test runs every time, whether the abi dump is new or not. With a naive approach, using add_custom_target/add_custom_command, the problem was that, after the test was run once, running it again wouldn't do anything, even when the ABI was broken (because the report file was up-to-date).

But, to force re-generation of the abi dump if necessary, I *have* to use a a custom command that depends on the dump file. In the end, the only reliable way I managed to come up with was to use the dummy output file. If there is a simpler way of doing this, I'd like to find out though. Every time I use add_custom_target/add_custom_command, my mind turns into a pretzel. I find this uniquely awkward to use, much worse than a makefile, as a matter of fact :-(

With the suppressions, things are in progress. There *is* a bug, but in a slightly different shape than I thought. Dodji has come up with a work-around the deals with the problem I was seeing though. So, on Monday, I think I'll be able to turn suppressions on and do things properly (with a slight hack in the suppressions file). I'll push another branch then with a link to the bug tracker as appropriate.

If there is any cargo-culting, it'll at least be cleaner cargo after that :-)

PS: Have you ever read "Dream Park--The California Voodoo Game"? If not, do. You will probably enjoy it :-)

Revision history for this message
James Henstridge (jamesh) wrote :

Okay, so I guess there are two options here:

1. If you want to generate a new dump as part of the vbuild process, why not just have a custom_command that depends on the libunity-scopes target and outputs the ABI dump, rather than dealing with the "run_always" bits?

2. Do you even need to dump the current ABI to an XML file as part of the test? Might it be quicker to just have abidiff compare the reference XML dump against the just-built .so file? That would reduce the number of moving parts in the test, and would likely be even faster.

I can understand having a helper script to generate a dump based on the just-built library, but it doesn't seem like a prerequisite for running the tests.

679. By Michi Henning

Some review comments from James.

Changed script to use suppressions file after getting a work-around for the partial
suppressions from Dodji.

Revision history for this message
Michi Henning (michihenning) wrote :

> Okay, so I guess there are two options here:
>
> 1. If you want to generate a new dump as part of the vbuild process, why not
> just have a custom_command that depends on the libunity-scopes target and
> outputs the ABI dump, rather than dealing with the "run_always" bits?

Now I'm confused. I already have this command:

add_custom_command(
    OUTPUT ${abi_dump_file}
    COMMAND ${abi_dump_cmd}
    DEPENDS ${UNITY_SCOPES_LIB})

add_custom_target(gen-abi-dump DEPENDS ${abi_dump_file})

This generates the dump if the dump doesn't exist yet or is out of date with respect to the library.

The run always hack is necessary because, without it, a "make test" will correctly complain the first time but, if I have a failure the first time and then do "make test" again, I end up with nothing being done at all, because nothing is out of date, and the second run then incorrectly reports success when, in fact, the failure is still there.

> 2. Do you even need to dump the current ABI to an XML file as part of the
> test? Might it be quicker to just have abidiff compare the reference XML dump
> against the just-built .so file? That would reduce the number of moving parts
> in the test, and would likely be even faster.

I considered doing this, but decided not to. Any speed difference is completely unnoticeable because analysing the dump takes many times longer than uncompressing it. That's for a large dump. For a small dump, the difference is also unnoticeable because a small dump will uncompress very quickly.

And I figured it would be useful to leave the dump behind. When something goes wrong, and people want to dig into it, they don't have to copy and uncompress it manually, making sure that they use the correct arch subdirectory.

The dump file is also useful for reporting issues with abidiff, because I have everything I need (both dumps and the suppressions file) right there.

I've updated the clean target though to get rid of the base dump, so a "make clean" actually reclaims the disk space.

> I can understand having a helper script to generate a dump based on the just-
> built library, but it doesn't seem like a prerequisite for running the tests.

The helper script to create the dump is useful for generating the dump by hand (say, for debugging). It also avoids a needless dump on Vivid. Doing that sort of thing directly in cmake rapidly gets cumbersome. Using the helper script is cleaner, I think?

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
680. By Michi Henning

Fix exit status in currently unused code.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
681. By Michi Henning

Added comment.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
682. By Michi Henning

Merged devel.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
James Henstridge (jamesh) wrote :

> > 2. Do you even need to dump the current ABI to an XML file as part of the
> > test? Might it be quicker to just have abidiff compare the reference XML
> dump
> > against the just-built .so file? That would reduce the number of moving
> parts
> > in the test, and would likely be even faster.
>
> I considered doing this, but decided not to. Any speed difference is
> completely unnoticeable because analysing the dump takes many times longer
> than uncompressing it. That's for a large dump. For a small dump, the
> difference is also unnoticeable because a small dump will uncompress very
> quickly.
>
> And I figured it would be useful to leave the dump behind. When something goes
> wrong, and people want to dig into it, they don't have to copy and uncompress
> it manually, making sure that they use the correct arch subdirectory.
>
> The dump file is also useful for reporting issues with abidiff, because I have
> everything I need (both dumps and the suppressions file) right there.
>
> I've updated the clean target though to get rid of the base dump, so a "make
> clean" actually reclaims the disk space.

I was curious what the time difference was, so I ran a few tests on my Chromebook (since armhf always seems to be the last to finish building, and hopefully the Chromebook is similar enough). I used the vivid versions of abigail and extracted the latest Xenial builds of libunity-scopes-api (this uses detached debug info, but hopefully that doesn't influence things too much).

First of all, the timings to extract an ABI dump and compare it to itself:

    $ time abidw --debug-info-dir root/usr/lib/debug root/usr/lib/arm-linux-gnueabihf/libunity-scopes.so.1.0.3 > dump.xml
    real 1m25.146s
    user 1m21.865s
    sys 0m2.975s

    $ time abidiff dump.xml dump.xml
    real 3m4.622s
    user 3m1.870s
    sys 0m2.565s

And as the alternative I was suggesting, comparing the XML dump against the library itself:

    $ time abidiff --debug-info-dir2 root/usr/lib/debug dump.xml root/usr/lib/arm-linux-gnueabihf/libunity-scopes.so.1.0.3
    real 2m30.120s
    user 2m27.060s
    sys 0m2.605s

So in addition to saving the 1.5 minutes taken to create the XML dump, the actual comparison process took 30 seconds less. All up, that's a 45% reduction in runtime

The times with the xenial version of abigail-tools seem a bit different on my amd64 box, but I'm still seeing significantly lower overall time for abidiff against the .so vs. abidw+abidiff.

Revision history for this message
James Henstridge (jamesh) wrote :

Just recording part of a conversation from IRC. Michi got the following error when comparing the XML dump to the shared library on his system:

http://pastebin.ubuntu.com/15070257/

In the XML dump, these are defined here:

    <elf-symbol name='_ZN5unity6scopes15ConfigExceptionC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE' type='func-type' binding='global-binding' alias='_ZN5unity6scopes15ConfigExceptionC2ERKS1_' is-defined='yes'/>
    <elf-symbol name='_ZN5unity6scopes15ConfigExceptionC2ERKS1_' type='func-type' binding='global-binding' is-defined='yes'/>

The "alias" attribute on the first line seems erroneous, since the first mangled name is ConfigException(std::string const&), while the second is ConfigException(ConfigException const&). These are clearly not the same symbol, so I'm not sure why they'd be listed as such here.

683. By Michi Henning

Fixed broken clean target.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Michi Henning (michihenning) wrote :

Dodji has fixed the issues around he different behaviour when using a dump vs comparing the base dump against the .so.

We'll have to wait until the next version of abigail makes it into archives. At that point, we'll also have to re-generate the base dumps because, as it turns out, they are currently not storing all of the relevant information.

At that point, we also should consider comparing against two dumps: the base dump, to make sure we haven't broken ABI with respect to the base, and the most recently-released version dump, to make sure that, in a later version, we haven't removed something that was added on an earlier (non-base) version, thereby breaking ABI not against the base, but against a version that was released into the wild.

Revision history for this message
James Henstridge (jamesh) wrote :

As discussed earlier, there is room for improvement but that will probably require a new version of abigail. This is obviously a big improvement over a-c-c, so lets merge it and improve it later.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'HACKING'
2--- HACKING 2015-09-15 21:55:44 +0000
3+++ HACKING 2016-02-15 06:03:52 +0000
4@@ -293,13 +293,13 @@
5 ABI compliance test
6 -------------------
7
8-The tests include an ABI compliance test (for Wily and later). To run it:
9+The tests include an ABI compliance test (for xenial and later). To run it:
10
11 $ cd test/abi-compliance
12 $ make test
13
14 The test is also automatically run as part of the test suite.
15-It takes several minutes to run . If you don't want to wait during local builds,
16+It takes a while to run. If you don't want to wait during local builds,
17 set the cmake "slowtests" option to OFF to skip the check.
18
19 The baseline ABI files for the test are in test/abi-compliance/abi_dumps.
20@@ -313,11 +313,8 @@
21 Once all the packages are built, you can extract the ABI dump
22 files and add them to the corresponding directory in the source tree.
23
24-The abi-compliance-checker tool produces a report in
25-
26- test/abi-compliance/compat_reports/libunity-scopes.so/[version]_to_[version]/compat_report.html
27-
28-The report provides a nicely layed-out page with all the details.
29+The abi compliance test produces a report in
30+libunity-scopes_<current-version>_abi-report.txt if anything unusual is detected.
31
32 Autopkg test suite
33 ------------------
34
35=== modified file 'debian/VERSION'
36--- debian/VERSION 2015-09-21 12:30:26 +0000
37+++ debian/VERSION 2016-02-15 06:03:52 +0000
38@@ -1,1 +1,1 @@
39-1.0.2
40+1.0.3
41
42=== modified file 'debian/changelog'
43--- debian/changelog 2015-12-18 11:42:03 +0000
44+++ debian/changelog 2016-02-15 06:03:52 +0000
45@@ -1,3 +1,27 @@
46+unity-scopes-api (1.0.3+16.04.20160209-0ubuntu2) UNRELEASED; urgency=medium
47+
48+ [ Michi Henning ]
49+ * Changed ABI compliance testing to use abigail.
50+
51+ -- Michi Henning <michi.henning@canonical.com> Mon, 15 Feb 2016 07:45:13 +1000
52+
53+unity-scopes-api (1.0.3+16.04.20160209-0ubuntu1) xenial; urgency=medium
54+
55+ [ Michi Henning ]
56+ * Bumped micro version.
57+
58+ [ CI Train Bot ]
59+ * No-change rebuild.
60+
61+ -- Rodney Dawes <ci-train-bot@canonical.com> Tue, 09 Feb 2016 15:15:15 +0000
62+
63+unity-scopes-api (1.0.3) UNRELEASED; urgency=medium
64+
65+ [ Michi Henning ]
66+ * Changed ABI compliance check to use abigail instead of abi-compliance-checker.
67+
68+ -- Michi Henning <michi.henning@canonical.com> Tue, 09 Feb 2016 17:07:10 +1000
69+
70 unity-scopes-api (1.0.2+16.04.20151218.2-0ubuntu1) xenial; urgency=medium
71
72 [ Michi Henning ]
73
74=== modified file 'debian/control.in'
75--- debian/control.in 2015-11-13 04:05:00 +0000
76+++ debian/control.in 2016-02-15 06:03:52 +0000
77@@ -1,7 +1,8 @@
78 Source: unity-scopes-api
79 Priority: optional
80 Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
81-Build-Depends: abi-compliance-checker,
82+Build-Depends: abigail-tools | libabigail-tools,
83+ binutils,
84 capnproto,
85 click-dev (>= 0.2.2),
86 cmake,
87
88=== modified file 'test/CMakeLists.txt'
89--- test/CMakeLists.txt 2015-09-09 07:37:01 +0000
90+++ test/CMakeLists.txt 2016-02-15 06:03:52 +0000
91@@ -5,5 +5,5 @@
92
93 if(${slowtests})
94 add_subdirectory(headers)
95- add_subdirectory(abi-compliance) # Keep this test last because it's really slow.
96+ add_subdirectory(abi-compliance)
97 endif()
98
99=== modified file 'test/abi-compliance/CMakeLists.txt'
100--- test/abi-compliance/CMakeLists.txt 2015-09-09 07:37:01 +0000
101+++ test/abi-compliance/CMakeLists.txt 2016-02-15 06:03:52 +0000
102@@ -1,11 +1,11 @@
103-configure_file(abi.xml.in ${CMAKE_CURRENT_BINARY_DIR}/abi.xml)
104 configure_file(check-abi-compliance.sh.in ${CMAKE_CURRENT_BINARY_DIR}/check-abi-compliance.sh @ONLY)
105 configure_file(gen-abi-dump.sh.in ${CMAKE_CURRENT_BINARY_DIR}/gen-abi-dump.sh @ONLY)
106
107 set(abi_dump_cmd /bin/sh ${CMAKE_CURRENT_BINARY_DIR}/gen-abi-dump.sh)
108 set(abi_check_cmd /bin/sh ${CMAKE_CURRENT_BINARY_DIR}/check-abi-compliance.sh)
109-set(abi_dump_file ${CMAKE_CURRENT_BINARY_DIR}/abi_dumps/lib${UNITY_SCOPES_LIB}/lib${UNITY_SCOPES_LIB}_${UNITY_SCOPES_FULL_VERSION}.abi.tar.gz)
110-set(abi_report ${CMAKE_CURRENT_BINARY_DIR}/compat_reports/lib${UNITY_SCOPES_LIB}/lib${UNITY_SCOPES_LIB}/${UNITY_SCOPES_MAJOR_MINOR}.0_to_${UNITY_SCOPES_FULL_VERSION}/compat_report.html)
111+set(abi_dump_file ${CMAKE_CURRENT_BINARY_DIR}/lib${UNITY_SCOPES_LIB}_${UNITY_SCOPES_FULL_VERSION}.abi.xml)
112+set(abi_baseline_dump ${CMAKE_CURRENT_BINARY_DIR}/lib${UNITY_SCOPES_LIB}_${UNITY_SCOPES_MAJOR}.0.0.abi.xml)
113+set(abi_report ${CMAKE_CURRENT_BINARY_DIR}/lib${UNITY_SCOPES_LIB}_${UNITY_SCOPES_FULL_VERSION}_abi-report.txt)
114
115 add_custom_command(
116 OUTPUT ${abi_dump_file}
117@@ -15,10 +15,14 @@
118 add_custom_target(gen-abi-dump DEPENDS ${abi_dump_file})
119
120 add_custom_command(
121- OUTPUT ${abi_report}
122+ OUTPUT run_always ${abi_report}
123 COMMAND ${abi_check_cmd}
124- DEPENDS gen-abi-dump)
125+ DEPENDS ${abi_dump_file} ${suppressions})
126+set_source_files_properties(run_always
127+ PROPERTIES SYMBOLIC true)
128+set_directory_properties(PROPERTIES
129+ ADDITIONAL_MAKE_CLEAN_FILES ${abi_baseline_dump})
130
131-add_custom_target(check-abi DEPENDS ${abi_report})
132+add_custom_target(check-abi DEPENDS run_always)
133
134 add_test(check-abi-compliance ${CMAKE_MAKE_PROGRAM} check-abi)
135
136=== removed file 'test/abi-compliance/abi.xml.in'
137--- test/abi-compliance/abi.xml.in 2015-08-27 06:41:36 +0000
138+++ test/abi-compliance/abi.xml.in 1970-01-01 00:00:00 +0000
139@@ -1,57 +0,0 @@
140-<version>
141-@UNITY_SCOPES_MAJOR@.@UNITY_SCOPES_MINOR@.@UNITY_SCOPES_MICRO@
142-</version>
143-
144-<headers>
145-@CMAKE_SOURCE_DIR@/include
146-@CMAKE_BINARY_DIR@/src
147-@CMAKE_BINARY_DIR@/include/unity
148-</headers>
149-
150-<!--
151-We skip the internal include directories because we have separate tests
152-that already ensure that no public header includes an internal one.
153--->
154-<skip_include_paths>
155-@CMAKE_BINARY_DIR@/include/unity/scopes/internal
156-@CMAKE_BINARY_DIR@/include/unity/scopes/internal/lttng
157-@CMAKE_BINARY_DIR@/include/unity/scopes/internal/smartscopes
158-@CMAKE_BINARY_DIR@/include/unity/scopes/internal/zmq_middleware
159-@CMAKE_BINARY_DIR@/include/unity/scopes/qt/internal
160-@CMAKE_BINARY_DIR@/include/unity/scopes/utility/internal
161-@CMAKE_SOURCE_DIR@/src/scopes/internal
162-@CMAKE_SOURCE_DIR@/src/scopes/internal/lttng
163-@CMAKE_SOURCE_DIR@/src/scopes/internal/smartscopes
164-@CMAKE_SOURCE_DIR@/src/scopes/qt/internal
165-@CMAKE_SOURCE_DIR@/src/scopes/utility/internal
166-</skip_include_paths>
167-
168-<libs>
169-@CMAKE_BINARY_DIR@/libunity-scopes.so
170-</libs>
171-
172-<gcc_options>
173--std=c++11 -fPIC -D_ENABLE_QT_EXPERIMENTAL_ -DQT_NO_KEYWORDS
174-</gcc_options>
175-
176-<skip_namespaces>
177-unity::scopes::internal
178-unity::scopes::qt::internal
179-unity::scopes::utility::internal
180-</skip_namespaces>
181-
182-<skip_headers>
183-@CMAKE_BINARY_DIR@/include/unity/Makefile
184-@CMAKE_BINARY_DIR@/include/unity/scopes/internal/lttng/Makefile
185-@CMAKE_BINARY_DIR@/include/unity/scopes/internal/Makefile
186-@CMAKE_BINARY_DIR@/include/unity/scopes/internal/smartscopes/Makefile
187-@CMAKE_BINARY_DIR@/include/unity/scopes/internal/zmq_middleware/Makefile
188-@CMAKE_BINARY_DIR@/include/unity/scopes/Makefile
189-@CMAKE_BINARY_DIR@/include/unity/scopes/qt/internal/Makefile
190-@CMAKE_BINARY_DIR@/include/unity/scopes/qt/Makefile
191-@CMAKE_BINARY_DIR@/include/unity/scopes/testing/Makefile
192-@CMAKE_BINARY_DIR@/include/unity/scopes/utility/internal/Makefile
193-@CMAKE_BINARY_DIR@/include/unity/scopes/utility/Makefile
194-@CMAKE_SOURCE_DIR@/include/unity/scopes/internal/lttng/SimpleTracepoint.h
195-@CMAKE_SOURCE_DIR@/include/unity/scopes/internal/lttng/UnityScopes_tp.h
196-</skip_headers>
197
198=== removed file 'test/abi-compliance/abi_dumps/aarch64-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz'
199Binary files test/abi-compliance/abi_dumps/aarch64-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz 2015-09-08 02:29:27 +0000 and test/abi-compliance/abi_dumps/aarch64-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz 1970-01-01 00:00:00 +0000 differ
200=== added file 'test/abi-compliance/abi_dumps/aarch64-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz'
201Binary files test/abi-compliance/abi_dumps/aarch64-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz 1970-01-01 00:00:00 +0000 and test/abi-compliance/abi_dumps/aarch64-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz 2016-02-15 06:03:52 +0000 differ
202=== removed file 'test/abi-compliance/abi_dumps/arm-linux-gnueabihf/libunity-scopes_1.0.0.abi.tar.gz'
203Binary files test/abi-compliance/abi_dumps/arm-linux-gnueabihf/libunity-scopes_1.0.0.abi.tar.gz 2015-09-08 02:29:27 +0000 and test/abi-compliance/abi_dumps/arm-linux-gnueabihf/libunity-scopes_1.0.0.abi.tar.gz 1970-01-01 00:00:00 +0000 differ
204=== added file 'test/abi-compliance/abi_dumps/arm-linux-gnueabihf/libunity-scopes_1.0.0.abi.xml.gz'
205Binary files test/abi-compliance/abi_dumps/arm-linux-gnueabihf/libunity-scopes_1.0.0.abi.xml.gz 1970-01-01 00:00:00 +0000 and test/abi-compliance/abi_dumps/arm-linux-gnueabihf/libunity-scopes_1.0.0.abi.xml.gz 2016-02-15 06:03:52 +0000 differ
206=== removed file 'test/abi-compliance/abi_dumps/i386-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz'
207Binary files test/abi-compliance/abi_dumps/i386-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz 2015-09-08 02:29:27 +0000 and test/abi-compliance/abi_dumps/i386-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz 1970-01-01 00:00:00 +0000 differ
208=== added file 'test/abi-compliance/abi_dumps/i386-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz'
209Binary files test/abi-compliance/abi_dumps/i386-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz 1970-01-01 00:00:00 +0000 and test/abi-compliance/abi_dumps/i386-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz 2016-02-15 06:03:52 +0000 differ
210=== removed file 'test/abi-compliance/abi_dumps/powerpc-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz'
211Binary files test/abi-compliance/abi_dumps/powerpc-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz 2015-09-08 02:29:27 +0000 and test/abi-compliance/abi_dumps/powerpc-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz 1970-01-01 00:00:00 +0000 differ
212=== added file 'test/abi-compliance/abi_dumps/powerpc-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz'
213Binary files test/abi-compliance/abi_dumps/powerpc-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz 1970-01-01 00:00:00 +0000 and test/abi-compliance/abi_dumps/powerpc-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz 2016-02-15 06:03:52 +0000 differ
214=== removed file 'test/abi-compliance/abi_dumps/powerpc64le-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz'
215Binary files test/abi-compliance/abi_dumps/powerpc64le-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz 2015-09-08 02:29:27 +0000 and test/abi-compliance/abi_dumps/powerpc64le-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz 1970-01-01 00:00:00 +0000 differ
216=== added file 'test/abi-compliance/abi_dumps/powerpc64le-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz'
217Binary files test/abi-compliance/abi_dumps/powerpc64le-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz 1970-01-01 00:00:00 +0000 and test/abi-compliance/abi_dumps/powerpc64le-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz 2016-02-15 06:03:52 +0000 differ
218=== removed file 'test/abi-compliance/abi_dumps/x86_64-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz'
219Binary files test/abi-compliance/abi_dumps/x86_64-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz 2015-09-08 02:29:27 +0000 and test/abi-compliance/abi_dumps/x86_64-linux-gnu/libunity-scopes_1.0.0.abi.tar.gz 1970-01-01 00:00:00 +0000 differ
220=== added file 'test/abi-compliance/abi_dumps/x86_64-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz'
221Binary files test/abi-compliance/abi_dumps/x86_64-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz 1970-01-01 00:00:00 +0000 and test/abi-compliance/abi_dumps/x86_64-linux-gnu/libunity-scopes_1.0.0.abi.xml.gz 2016-02-15 06:03:52 +0000 differ
222=== modified file 'test/abi-compliance/check-abi-compliance.sh.in'
223--- test/abi-compliance/check-abi-compliance.sh.in 2015-09-15 21:59:25 +0000
224+++ test/abi-compliance/check-abi-compliance.sh.in 2016-02-15 06:03:52 +0000
225@@ -20,10 +20,11 @@
226
227 # Script to check whether the ABI is still intact.
228 #
229-# The base ABI (for version <x>.<y>.0) is kept in libunity-scopes_<x>.<y>.0.abi.tar.gz.
230-# If the micro version is non-zero, we run abi-compliance-checker to compare the two versions.
231+# The base ABI (for version <x>.<y>.0) is kept in libunity-scopes_<x>.<y>.0.abi.xml.gz.
232+# If the micro version is non-zero, we run abidiff to compare the two versions.
233 # If there are any complaints, we print an error message ane return non-zero status.
234
235+set -x
236 progname=$(basename $0)
237
238 distro=$(lsb_release -c -s)
239@@ -32,26 +33,63 @@
240 exit 0
241 }
242
243+[ @UNITY_SCOPES_MICRO@ -eq 0 ] && exit 0
244+
245 libname=lib@UNITY_SCOPES_LIB@
246-
247-base_abi=@CMAKE_CURRENT_SOURCE_DIR@/abi_dumps/@CMAKE_LIBRARY_ARCHITECTURE@/${libname}_@UNITY_SCOPES_MAJOR_MINOR@.0.abi.tar.gz
248-cur_abi=@CMAKE_CURRENT_BINARY_DIR@/abi_dumps/${libname}/${libname}_@UNITY_SCOPES_FULL_VERSION@.abi.tar.gz
249+base_abi_dir=@CMAKE_CURRENT_SOURCE_DIR@/abi_dumps/@CMAKE_LIBRARY_ARCHITECTURE@
250+base_abi=${libname}_@UNITY_SCOPES_MAJOR_MINOR@.0.abi.xml
251+
252+gunzip -c ${base_abi_dir}/${base_abi}.gz >${base_abi}
253+
254+cur_abi=${libname}_@UNITY_SCOPES_FULL_VERSION@.abi.xml
255+report=${libname}_@UNITY_SCOPES_FULL_VERSION@_abi-report.txt
256+
257+# If the current lib doesn't contain debug info, we can't run the test.
258+# TODO: See https://sourceware.org/bugzilla/show_bug.cgi?id=19621
259+info_file=$(mktemp)
260+readelf --debug-dump=info @CMAKE_BINARY_DIR@/${libname}.so >$info_file
261+[ $? -ne 0 ] && exit 1
262+[ -s $info_file ]
263+no_debug_info=$?
264+rm -f $info_file
265+[ $no_debug_info -eq 1 ] && {
266+ echo "${progname}: Skipping ABI test because ${libname}.so was compiled without -g"
267+ exit 0
268+}
269
270 # Compare against the base ABI.
271-abi-compliance-checker -lib ${libname} -old $base_abi -new $cur_abi
272-
273+abidiff --no-unreferenced-symbols --suppressions @CMAKE_CURRENT_SOURCE_DIR@/suppressions \
274+ ${base_abi} ${cur_abi} >${report} 2>&1
275 status=$?
276-report=@CMAKE_CURRENT_BINARY_DIR@/compat_reports/${libname}/1.0.0_to_@UNITY_SCOPES_FULL_VERSION@/compat_report.html
277-[ -e $report ] && {
278- echo "${progname}: Compatibility report generated to $report"
279-}
280-
281-[ $status -ne 0 ] && {
282- [ $status -eq 1 ] && {
283- echo "${progname}: ERROR: Incompatible ABI!" >&2
284- }
285- echo "${progname}: ERROR: abi-compliance-checker returned exit status $status" >&2
286- exit 1
287-}
288-
289-exit 0
290+
291+# TODO: Exit status test is not reliable with 1.0.rc2 (https://sourceware.org/bugzilla/show_bug.cgi?id=19596).
292+# We instead rely on the report size for the time being. When suppressions are used, and there are
293+# no problems, the report still contains three lines of summary, so we fail if there are more than
294+# three lines.
295+num_lines=$(wc -l <${report})
296+[ $num_lines -gt 3 ] && {
297+ echo "${progname}: ERROR: Incompatible ABI!" >&2
298+ cat ${report} >&2
299+ exit 8
300+}
301+exit $status # TODO
302+
303+# Incompatible changes found.
304+[ $status -ge 8 ] && {
305+ echo "${progname}: ERROR: Incompatible ABI!" >&2
306+ cat ${report} >&2
307+ exit $status
308+}
309+
310+# Possibly incompatible changes found.
311+[ $status -ge 4 ] && {
312+ echo "${progname}: ABI has possibly incompatible changes, see $report for details."
313+ exit $status
314+}
315+
316+# All went fine.
317+[ $status -eq 0 ] && exit 0
318+
319+# Some other error
320+echo "${progname}: Unexpected error, see $report for details." >&2
321+exit $status
322
323=== modified file 'test/abi-compliance/gen-abi-dump.sh.in'
324--- test/abi-compliance/gen-abi-dump.sh.in 2015-09-10 00:39:52 +0000
325+++ test/abi-compliance/gen-abi-dump.sh.in 2016-02-15 06:03:52 +0000
326@@ -21,7 +21,7 @@
327 # Script to dump the current ABI.
328
329 libname=lib@UNITY_SCOPES_LIB@
330-cur_abi=@CMAKE_CURRENT_BINARY_DIR@/abi_dumps/${libname}/${libname}_@UNITY_SCOPES_FULL_VERSION@.abi.tar.gz
331+cur_abi=@CMAKE_CURRENT_BINARY_DIR@/${libname}_@UNITY_SCOPES_FULL_VERSION@.abi.xml
332
333 distro=$(lsb_release -c -s)
334 [ "$distro" = "vivid" ] && {
335@@ -30,6 +30,6 @@
336 }
337
338 # Dump the current ABI.
339-abi-compliance-checker -lib ${libname} -dump @CMAKE_CURRENT_BINARY_DIR@/abi.xml
340+abidw --out-file ${cur_abi} @CMAKE_BINARY_DIR@/${libname}.so
341
342 exit $?
343
344=== added file 'test/abi-compliance/suppressions'
345--- test/abi-compliance/suppressions 1970-01-01 00:00:00 +0000
346+++ test/abi-compliance/suppressions 2016-02-15 06:03:52 +0000
347@@ -0,0 +1,21 @@
348+# Suppressions for template functions that are instantiated due to new
349+# types that were added since the baseline.
350+
351+# TODO: The allows_other_aliases is currently needed due to a bug in abigail 1.0.rc2.
352+# One a newer version becomes available, they can be removed.
353+# https://sourceware.org/bugzilla/show_bug.cgi?id=19619
354+
355+[suppress_function]
356+ name_regexp = boost::.*
357+ change_kind = added-function
358+ allow_other_aliases = false
359+
360+[suppress_function]
361+ name_regexp = std::.*
362+ change_kind = added-function
363+ allow_other_aliases = false
364+
365+[suppress_function]
366+ name_regexp = unity::scopes::testing::.*
367+ change_kind = added-function
368+ allow_other_aliases = false

Subscribers

People subscribed via source and target branches

to all changes: