]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | #!/bin/sh |
2 | # BSD LICENSE | |
3 | # | |
4 | # Copyright(c) 2015 Neil Horman. All rights reserved. | |
5 | # All rights reserved. | |
6 | # | |
7 | # Redistribution and use in source and binary forms, with or without | |
8 | # modification, are permitted provided that the following conditions | |
9 | # are met: | |
10 | # | |
11 | # * Redistributions of source code must retain the above copyright | |
12 | # notice, this list of conditions and the following disclaimer. | |
13 | # * Redistributions in binary form must reproduce the above copyright | |
14 | # notice, this list of conditions and the following disclaimer in | |
15 | # the documentation and/or other materials provided with the | |
16 | # distribution. | |
17 | # | |
18 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
19 | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
20 | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
21 | # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
22 | # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
23 | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
24 | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
25 | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
26 | # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
27 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
28 | # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
29 | ||
30 | TAG1=$1 | |
31 | TAG2=$2 | |
32 | TARGET=$3 | |
33 | ABI_DIR=`mktemp -d -p /tmp ABI.XXXXXX` | |
34 | ||
35 | usage() { | |
36 | echo "$0 <REV1> <REV2> <TARGET>" | |
37 | } | |
38 | ||
39 | log() { | |
40 | local level=$1 | |
41 | shift | |
42 | echo "$*" | |
43 | } | |
44 | ||
45 | validate_tags() { | |
46 | ||
47 | if [ -z "$HASH1" ] | |
48 | then | |
49 | echo "invalid revision: $TAG1" | |
50 | return | |
51 | fi | |
52 | if [ -z "$HASH2" ] | |
53 | then | |
54 | echo "invalid revision: $TAG2" | |
55 | return | |
56 | fi | |
57 | } | |
58 | ||
59 | validate_args() { | |
60 | if [ -z "$TAG1" ] | |
61 | then | |
62 | echo "Must Specify REV1" | |
63 | return | |
64 | fi | |
65 | if [ -z "$TAG2" ] | |
66 | then | |
67 | echo "Must Specify REV2" | |
68 | return | |
69 | fi | |
70 | if [ -z "$TARGET" ] | |
71 | then | |
72 | echo "Must Specify a build target" | |
73 | fi | |
74 | } | |
75 | ||
76 | ||
77 | cleanup_and_exit() { | |
78 | rm -rf $ABI_DIR | |
79 | git checkout $CURRENT_BRANCH | |
80 | exit $1 | |
81 | } | |
82 | ||
83 | # Make sure we configure SHARED libraries | |
84 | # Also turn off IGB and KNI as those require kernel headers to build | |
85 | fixup_config() { | |
86 | sed -i -e"$ a\CONFIG_RTE_BUILD_SHARED_LIB=y" config/defconfig_$TARGET | |
87 | sed -i -e"$ a\CONFIG_RTE_NEXT_ABI=n" config/defconfig_$TARGET | |
88 | sed -i -e"$ a\CONFIG_RTE_EAL_IGB_UIO=n" config/defconfig_$TARGET | |
89 | sed -i -e"$ a\CONFIG_RTE_LIBRTE_KNI=n" config/defconfig_$TARGET | |
90 | sed -i -e"$ a\CONFIG_RTE_KNI_KMOD=n" config/defconfig_$TARGET | |
91 | } | |
92 | ||
93 | ########################################### | |
94 | #START | |
95 | ############################################ | |
96 | ||
97 | #trap on ctrl-c to clean up | |
98 | trap cleanup_and_exit SIGINT | |
99 | ||
100 | if [ -z "$DPDK_MAKE_JOBS" ] | |
101 | then | |
102 | # This counts the number of cpus on the system | |
103 | if [ -e /usr/bin/lscpu ] | |
104 | then | |
105 | DPDK_MAKE_JOBS=`lscpu -p=cpu | grep -v "#" | wc -l` | |
106 | else | |
107 | DPDK_MAKE_JOBS=1 | |
108 | fi | |
109 | fi | |
110 | ||
111 | #Save the current branch | |
112 | CURRENT_BRANCH=`git branch | grep \* | cut -d' ' -f2` | |
113 | ||
114 | if [ -z "$CURRENT_BRANCH" ] | |
115 | then | |
116 | CURRENT_BRANCH=`git log --pretty=format:%H HEAD~1..HEAD` | |
117 | fi | |
118 | ||
119 | if [ -n "$VERBOSE" ] | |
120 | then | |
121 | export VERBOSE=/dev/stdout | |
122 | else | |
123 | export VERBOSE=/dev/null | |
124 | fi | |
125 | ||
126 | # Validate that we have all the arguments we need | |
127 | res=$(validate_args) | |
128 | if [ -n "$res" ] | |
129 | then | |
130 | echo $res | |
131 | usage | |
132 | cleanup_and_exit 1 | |
133 | fi | |
134 | ||
135 | HASH1=$(git show -s --format=%H "$TAG1" -- 2> /dev/null | tail -1) | |
136 | HASH2=$(git show -s --format=%H "$TAG2" -- 2> /dev/null | tail -1) | |
137 | ||
138 | # Make sure our tags exist | |
139 | res=$(validate_tags) | |
140 | if [ -n "$res" ] | |
141 | then | |
142 | echo $res | |
143 | cleanup_and_exit 1 | |
144 | fi | |
145 | ||
146 | # Make hashes available in output for non-local reference | |
147 | TAG1="$TAG1 ($HASH1)" | |
148 | TAG2="$TAG2 ($HASH2)" | |
149 | ||
150 | ABICHECK=`which abi-compliance-checker 2>/dev/null` | |
151 | if [ $? -ne 0 ] | |
152 | then | |
153 | log "INFO" "Cant find abi-compliance-checker utility" | |
154 | cleanup_and_exit 1 | |
155 | fi | |
156 | ||
157 | ABIDUMP=`which abi-dumper 2>/dev/null` | |
158 | if [ $? -ne 0 ] | |
159 | then | |
160 | log "INFO" "Cant find abi-dumper utility" | |
161 | cleanup_and_exit 1 | |
162 | fi | |
163 | ||
164 | log "INFO" "We're going to check and make sure that applications built" | |
165 | log "INFO" "against DPDK DSOs from version $TAG1 will still run when executed" | |
166 | log "INFO" "against DPDK DSOs built from version $TAG2." | |
167 | log "INFO" "" | |
168 | ||
169 | # Check to make sure we have a clean tree | |
170 | git status | grep -q clean | |
171 | if [ $? -ne 0 ] | |
172 | then | |
173 | log "WARN" "Working directory not clean, aborting" | |
174 | cleanup_and_exit 1 | |
175 | fi | |
176 | ||
177 | # Move to the root of the git tree | |
178 | cd $(dirname $0)/.. | |
179 | ||
180 | log "INFO" "Checking out version $TAG1 of the dpdk" | |
181 | # Move to the old version of the tree | |
182 | git checkout $HASH1 | |
183 | ||
184 | fixup_config | |
185 | ||
186 | # Checking abi compliance relies on using the dwarf information in | |
187 | # The shared objects. Thats only included in the DSO's if we build | |
188 | # with -g | |
189 | export EXTRA_CFLAGS="$EXTRA_CFLAGS -g -O0" | |
190 | export EXTRA_LDFLAGS="$EXTRA_LDFLAGS -g" | |
191 | ||
192 | # Now configure the build | |
193 | log "INFO" "Configuring DPDK $TAG1" | |
194 | make config T=$TARGET O=$TARGET > $VERBOSE 2>&1 | |
195 | ||
196 | log "INFO" "Building DPDK $TAG1. This might take a moment" | |
197 | make -j$DPDK_MAKE_JOBS O=$TARGET > $VERBOSE 2>&1 | |
198 | ||
199 | if [ $? -ne 0 ] | |
200 | then | |
201 | log "INFO" "THE BUILD FAILED. ABORTING" | |
202 | cleanup_and_exit 1 | |
203 | fi | |
204 | ||
205 | # Move to the lib directory | |
206 | cd $TARGET/lib | |
207 | log "INFO" "COLLECTING ABI INFORMATION FOR $TAG1" | |
208 | for i in `ls *.so` | |
209 | do | |
210 | $ABIDUMP $i -o $ABI_DIR/$i-ABI-0.dump -lver $HASH1 | |
211 | done | |
212 | cd ../.. | |
213 | ||
214 | # Now clean the tree, checkout the second tag, and rebuild | |
215 | git clean -f -d | |
216 | git reset --hard | |
217 | # Move to the new version of the tree | |
218 | log "INFO" "Checking out version $TAG2 of the dpdk" | |
219 | git checkout $HASH2 | |
220 | ||
221 | fixup_config | |
222 | ||
223 | # Now configure the build | |
224 | log "INFO" "Configuring DPDK $TAG2" | |
225 | make config T=$TARGET O=$TARGET > $VERBOSE 2>&1 | |
226 | ||
227 | log "INFO" "Building DPDK $TAG2. This might take a moment" | |
228 | make -j$DPDK_MAKE_JOBS O=$TARGET > $VERBOSE 2>&1 | |
229 | ||
230 | if [ $? -ne 0 ] | |
231 | then | |
232 | log "INFO" "THE BUILD FAILED. ABORTING" | |
233 | cleanup_and_exit 1 | |
234 | fi | |
235 | ||
236 | cd $TARGET/lib | |
237 | log "INFO" "COLLECTING ABI INFORMATION FOR $TAG2" | |
238 | for i in `ls *.so` | |
239 | do | |
240 | $ABIDUMP $i -o $ABI_DIR/$i-ABI-1.dump -lver $HASH2 | |
241 | done | |
242 | cd ../.. | |
243 | ||
244 | # Start comparison of ABI dumps | |
245 | for i in `ls $ABI_DIR/*-1.dump` | |
246 | do | |
247 | NEWNAME=`basename $i` | |
248 | OLDNAME=`basename $i | sed -e"s/1.dump/0.dump/"` | |
249 | LIBNAME=`basename $i | sed -e"s/-ABI-1.dump//"` | |
250 | ||
251 | if [ ! -f $ABI_DIR/$OLDNAME ] | |
252 | then | |
253 | log "INFO" "$OLDNAME DOES NOT EXIST IN $TAG1. SKIPPING..." | |
254 | fi | |
255 | ||
256 | #compare the abi dumps | |
257 | $ABICHECK -l $LIBNAME -old $ABI_DIR/$OLDNAME -new $ABI_DIR/$NEWNAME | |
258 | done | |
259 | ||
260 | git reset --hard | |
261 | log "INFO" "ABI CHECK COMPLETE. REPORTS ARE IN compat_report directory" | |
262 | cleanup_and_exit 0 |