Skip to content

Commit e740214

Browse files
committed
build FEATURE add ABI check
1 parent a11ddd9 commit e740214

File tree

3 files changed

+127
-12
lines changed

3 files changed

+127
-12
lines changed

.github/workflows/ci.yml

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,47 @@ jobs:
149149
working-directory: ${{ github.workspace }}/build
150150
run: ctest --output-on-failure
151151

152+
abi:
153+
runs-on: ubuntu-latest
154+
steps:
155+
- uses: actions/checkout@v2
156+
157+
- name: Dependencies
158+
shell: bash
159+
run: |
160+
sudo add-apt-repository ppa:kedazo/libssh-0.7.x -y
161+
sudo apt-get update
162+
sudo apt-get install $DEFAULT_PACKAGES abi-dumper abi-compliance-checker
163+
sudo snap install core universal-ctags
164+
165+
GIT_BRANCH=`echo ${{ github.ref }} | cut -d'/' -f 3`
166+
git clone -b $GIT_BRANCH https://github.com/CESNET/libyang.git
167+
cd libyang
168+
mkdir build
169+
cd build
170+
CC=gcc cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_BUILD_TESTS=OFF ..
171+
make -j2
172+
sudo make install
173+
174+
git clone https://github.com/DNSSEC-Tools/DNSSEC-Tools.git dnssec-tools
175+
cd dnssec-tools/dnssec-tools/validator
176+
./configure
177+
make -j2
178+
sudo make install
179+
180+
- name: Configure
181+
shell: bash
182+
working-directory: ${{ github.workspace }}
183+
run: |
184+
mkdir build
185+
cd build
186+
CC=gcc cmake -DCMAKE_BUILD_TYPE=ABICheck ..
187+
188+
- name: Build
189+
shell: bash
190+
working-directory: ${{ github.workspace }}/build
191+
run: LC_ALL=C.UTF-8 PATH=/snap/bin:$PATH make abi-check
192+
152193
coverage:
153194
runs-on: ubuntu-latest
154195
steps:
@@ -166,7 +207,7 @@ jobs:
166207
cd libyang
167208
mkdir build
168209
cd build
169-
CC=${{ matrix.config.cc }} cmake -DCMAKE_BUILD_TYPE=${{ matrix.config.build-type }} -DENABLE_BUILD_TESTS=OFF ..
210+
CC=gcc cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_BUILD_TESTS=OFF ..
170211
make -j2
171212
sudo make install
172213

CMakeLists.txt

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ include(CheckFunctionExists)
1010
include(CheckCSourceCompiles)
1111
include(CheckIncludeFile)
1212
include(UseCompat)
13+
include(ABICheck)
1314
include(SourceFormat)
1415
include(GenDoc)
1516

@@ -34,15 +35,17 @@ endif()
3435
# normalize build type string
3536
string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_UPPER)
3637
if ("${BUILD_TYPE_UPPER}" STREQUAL "RELEASE")
37-
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build Type" FORCE)
38-
elseif ("${BUILD_TYPE_UPPER}" STREQUAL "DEBUG")
39-
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build Type" FORCE)
40-
elseif ("${BUILD_TYPE_UPPER}" STREQUAL "RELWITHDEBINFO")
41-
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Build Type" FORCE)
42-
elseif ("${BUILD_TYPE_UPPER}" STREQUAL "RELWITHDEBUG")
43-
set(CMAKE_BUILD_TYPE "RelWithDebug" CACHE STRING "Build Type" FORCE)
44-
elseif ("${BUILD_TYPE_UPPER}" STREQUAL "DOCONLY")
45-
set(CMAKE_BUILD_TYPE "DocOnly" CACHE STRING "Build Type" FORCE)
38+
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build Type" FORCE)
39+
elseif("${BUILD_TYPE_UPPER}" STREQUAL "DEBUG")
40+
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build Type" FORCE)
41+
elseif("${BUILD_TYPE_UPPER}" STREQUAL "RELWITHDEBINFO")
42+
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Build Type" FORCE)
43+
elseif("${BUILD_TYPE_UPPER}" STREQUAL "RELWITHDEBUG")
44+
set(CMAKE_BUILD_TYPE "RelWithDebug" CACHE STRING "Build Type" FORCE)
45+
elseif("${BUILD_TYPE_UPPER}" STREQUAL "ABICHECK")
46+
set(CMAKE_BUILD_TYPE "ABICheck" CACHE STRING "Build Type" FORCE)
47+
elseif("${BUILD_TYPE_UPPER}" STREQUAL "DOCONLY")
48+
set(CMAKE_BUILD_TYPE "DocOnly" CACHE STRING "Build Type" FORCE)
4649
endif()
4750

4851
# Version of the project
@@ -108,6 +111,7 @@ endif()
108111
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_COVERAGE} -Wall -Wextra -fvisibility=hidden -std=gnu99")
109112
set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O2")
110113
set(CMAKE_C_FLAGS_DEBUG "-g -O0")
114+
set(CMAKE_C_FLAGS_ABICHECK "-g -Og")
111115

112116
# options
113117
option(ENABLE_SSH "Enable NETCONF over SSH support (via libssh)" ON)
@@ -149,7 +153,6 @@ if(ENABLE_TLS)
149153
endif()
150154

151155
set(headers
152-
${PROJECT_BINARY_DIR}/src/config.h
153156
src/log.h
154157
src/netconf.h
155158
src/session.h
@@ -279,7 +282,7 @@ install(TARGETS netconf2 DESTINATION ${CMAKE_INSTALL_LIBDIR})
279282
# install headers
280283
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/nc_client.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
281284
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/nc_server.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
282-
install(FILES ${headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libnetconf2)
285+
install(FILES ${headers} ${PROJECT_BINARY_DIR}/src/config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libnetconf2)
283286

284287
# install pkg-config file
285288
find_package(PkgConfig)
@@ -320,6 +323,11 @@ endif()
320323
# generate doxygen documentation for libnetconf2 API
321324
gen_doc("${doxy_files}" ${LIBNETCONF2_VERSION} ${LIBNETCONF2_DESCRIPTION} "")
322325

326+
# generate API/ABI report
327+
if ("${BUILD_TYPE_UPPER}" STREQUAL "ABICHECK")
328+
lib_abi_check(netconf2 "${headers}" ${LIBNETCONF2_SOVERSION_FULL} a11ddd9f032e0b7bdaa8583c49f4eca168c9c642)
329+
endif()
330+
323331
# clean cmake cache
324332
add_custom_target(cleancache
325333
COMMAND make clean

CMakeModules/ABICheck.cmake

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# generate API/ABI report
2+
macro(LIB_ABI_CHECK LIB_TARGET LIB_HEADERS LIB_SOVERSION_FULL ABI_BASE_HASH)
3+
# get short hash
4+
string(SUBSTRING "${ABI_BASE_HASH}" 0 8 ABI_BASE_HASH_SHORT)
5+
6+
# find abi-dumper
7+
find_program(ABI_DUMPER abi-dumper)
8+
find_package_handle_standard_args(abi-dumper DEFAULT_MSG ABI_DUMPER)
9+
if(NOT ABI_DUMPER)
10+
message(FATAL_ERROR "Program abi-dumper not found!")
11+
endif()
12+
13+
# find abi-checker
14+
find_program(ABI_CHECKER abi-compliance-checker)
15+
find_package_handle_standard_args(abi-compliance-checker DEFAULT_MSG ABI_CHECKER)
16+
if(NOT ABI_CHECKER)
17+
message(FATAL_ERROR "Program abi-compliance-checker not found!")
18+
endif()
19+
20+
# abi-dump target - generating an ABI dump
21+
set(PUBLIC_HEADERS ${LIB_HEADERS})
22+
string(PREPEND PUBLIC_HEADERS "${CMAKE_SOURCE_DIR}/")
23+
string(REPLACE ";" "\n${CMAKE_SOURCE_DIR}/" PUBLIC_HEADERS "${PUBLIC_HEADERS}")
24+
file(GENERATE OUTPUT ${CMAKE_BINARY_DIR}/public_headers CONTENT "${PUBLIC_HEADERS}")
25+
add_custom_target(abi-dump
26+
COMMAND ${ABI_DUMPER} ./lib${LIB_TARGET}${CMAKE_SHARED_LIBRARY_SUFFIX}
27+
-o lib${LIB_TARGET}.${LIB_SOVERSION_FULL}.dump
28+
-lver ${LIB_SOVERSION_FULL} -public-headers ${CMAKE_BINARY_DIR}/public_headers
29+
DEPENDS ${LIB_TARGET}
30+
BYPRODUCTS ${CMAKE_BINARY_DIR}/lib${LIB_TARGET}.${LIB_SOVERSION_FULL}.dump
31+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
32+
COMMENT "Dumping ABI information of version ${LIB_SOVERSION_FULL} for abi-check")
33+
34+
# get URL for fetching origin
35+
execute_process(COMMAND git remote get-url origin OUTPUT_VARIABLE ORIGIN_URL OUTPUT_STRIP_TRAILING_WHITESPACE)
36+
37+
# generate script for generating the base ABI dump
38+
file(GENERATE OUTPUT ${CMAKE_BINARY_DIR}/abibase.sh CONTENT "#!/bin/sh
39+
if [ ! -d abibase ]; then mkdir abibase; fi
40+
cd abibase
41+
if [ ! -f build/lib${LIB_TARGET}.*.dump ]; then
42+
if [ -d .git ] && [ \"${ABI_BASE_HASH}\" != \"`git log --pretty=oneline | cut -d' ' -f1`\" ]; then rm -rf .* 2> /dev/null; fi
43+
if [ ! -d .git ]; then
44+
git init --initial-branch=master
45+
git remote add origin ${ORIGIN_URL}
46+
git fetch origin --depth 1 ${ABI_BASE_HASH}
47+
git reset --hard FETCH_HEAD
48+
fi
49+
if [ ! -d build ]; then mkdir build; fi
50+
cd build
51+
cmake -DCMAKE_BUILD_TYPE=ABICheck ..
52+
make abi-dump
53+
fi
54+
")
55+
56+
# abi-check target - check ABI compatibility of current version and the base hash version
57+
add_custom_target(abi-check
58+
COMMAND bash ./abibase.sh
59+
COMMAND ${ABI_CHECKER} -l lib${LIB_TARGET}${CMAKE_SHARED_LIBRARY_SUFFIX}
60+
-old abibase/build/lib${LIB_TARGET}.*.dump
61+
-new ./lib${LIB_TARGET}.${LIB_SOVERSION_FULL}.dump -s
62+
DEPENDS ${LIB_TARGET} abi-dump
63+
BYPRODUCTS ${CMAKE_BINARY_DIR}/compat_reports/lib${LIB_TARGET}${CMAKE_SHARED_LIBRARY_SUFFIX}/*_to_${LIB_SOVERSION_FULL}/compat_report.html
64+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
65+
COMMENT "Checking ABI compatibility of version ${LIB_SOVERSION_FULL} and revision ${ABI_BASE_HASH_SHORT}")
66+
endmacro()

0 commit comments

Comments
 (0)