From 75e2ba16951821ab6b435929272445d993845235 Mon Sep 17 00:00:00 2001 From: kgv Date: Sat, 26 Feb 2022 19:29:44 +0300 Subject: [PATCH] 0032856: Configuration, CMake - SONAME should include minor version in addition to major to reflect ABI compatibility Added option BUILD_SOVERSION_NUMBERS to manage SOVERSION length. Default option value is set to 2 (major.minor) instead of previously used 1 (major), excluding Android/Emscripten/Windows platforms that use 0 by default. --- CMakeLists.txt | 14 ++++++++++++++ adm/cmake/occt_toolkit.cmake | 17 ++++++++++------- adm/cmake/vardescr.cmake | 3 +++ adm/qmake/OccToolkit.pri | 12 +++++++++++- 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e6ad20280a..23dd2d377b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,6 +56,20 @@ set_property (GLOBAL PROPERTY OCC_VERSION_MAJOR ${OCC_VERSION_MAJOR}) set_property (GLOBAL PROPERTY OCC_VERSION_MINOR ${OCC_VERSION_MINOR}) set_property (GLOBAL PROPERTY OCC_VERSION_MAINTENANCE ${OCC_VERSION_MAINTENANCE}) +# set soversion variable determining compatibility version on platforms with symlinks +# 0 - for empty, 1 - for major, 2 - for major.minor, 3 - for major.minor.maintenance +if (NOT BUILD_SOVERSION_NUMBERS) + set (BUILD_SOVERSION_NUMBERS "0" CACHE STRING "${BUILD_SOVERSION_NUMBERS_DESCR}" FORCE) + SET_PROPERTY(CACHE BUILD_SOVERSION_NUMBERS PROPERTY STRINGS 0 1 2 3) + + # update default state of soversion on different platforms + if (WIN32 OR ANDROID OR EMSCRIPTEN) + set (BUILD_SOVERSION_NUMBERS 0) + else() + set (BUILD_SOVERSION_NUMBERS 2) + endif() +endif() + set (INSTALL_TEST_CASES OFF CACHE BOOL "${INSTALL_TEST_CASES_DESCR}") # Regeneration of OCCT resource files diff --git a/adm/cmake/occt_toolkit.cmake b/adm/cmake/occt_toolkit.cmake index 2f96c6f148..b3c83067b8 100644 --- a/adm/cmake/occt_toolkit.cmake +++ b/adm/cmake/occt_toolkit.cmake @@ -280,14 +280,17 @@ get_property (OCC_VERSION_MAJOR GLOBAL PROPERTY OCC_VERSION_MAJOR) get_property (OCC_VERSION_MINOR GLOBAL PROPERTY OCC_VERSION_MINOR) get_property (OCC_VERSION_MAINTENANCE GLOBAL PROPERTY OCC_VERSION_MAINTENANCE) -if (ANDROID) - # do not append version to the filename - set_target_properties (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${PRECOMPILED_DEFS}") -else() - set_target_properties (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${PRECOMPILED_DEFS}" - SOVERSION "${OCC_VERSION_MAJOR}" - VERSION "${OCC_VERSION_MAJOR}.${OCC_VERSION_MINOR}.${OCC_VERSION_MAINTENANCE}") +set (OCC_SOVERSION "") +if (BUILD_SOVERSION_NUMBERS GREATER 2) + set (OCC_SOVERSION "${OCC_VERSION_MAJOR}.${OCC_VERSION_MINOR}.${OCC_VERSION_MAINTENANCE}") +elseif (BUILD_SOVERSION_NUMBERS GREATER 1) + set (OCC_SOVERSION "${OCC_VERSION_MAJOR}.${OCC_VERSION_MINOR}") +elseif (BUILD_SOVERSION_NUMBERS GREATER 0) + set (OCC_SOVERSION "${OCC_VERSION_MAJOR}") endif() +set_target_properties (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${PRECOMPILED_DEFS}" + SOVERSION "${OCC_SOVERSION}" + VERSION "${OCC_VERSION_MAJOR}.${OCC_VERSION_MINOR}.${OCC_VERSION_MAINTENANCE}") set (USED_TOOLKITS_BY_CURRENT_PROJECT) set (USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT) diff --git a/adm/cmake/vardescr.cmake b/adm/cmake/vardescr.cmake index 0733af0ac2..8212a0308b 100644 --- a/adm/cmake/vardescr.cmake +++ b/adm/cmake/vardescr.cmake @@ -28,6 +28,9 @@ Applies only for Debug configuration.") set (BUILD_SHARED_LIBRARY_NAME_POSTFIX_DESCR "Append the postfix to names of output libraries") +set (BUILD_SOVERSION_NUMBERS_DESCR +"Version numbers to put into SONAME: 0 - for empty, 1 - for major, 2 - for major.minor, 3 - for major.minor.maintenance") + set (BUILD_RELEASE_DISABLE_EXCEPTIONS_DESCR "Disables exceptions like Standard_OutOfRange in Release builds. Defines No_Exception macros for Release builds when enabled (default). diff --git a/adm/qmake/OccToolkit.pri b/adm/qmake/OccToolkit.pri index 9bc54d1cdb..3f18edb1cf 100644 --- a/adm/qmake/OccToolkit.pri +++ b/adm/qmake/OccToolkit.pri @@ -132,21 +132,31 @@ for (aPackage, aPackages) { } } -# extend clean with versioned .so files !win32 { aVerList = $$split(VERSION, ".") aVerMaj = $$member(aVerList, 0) aVerMin = $$member(aVerList, 1) aVerMic = $$member(aVerList, 2) + equals(TEMPLATE, app) { QMAKE_CLEAN += $$DESTDIR/$${TARGET} } else { mac { + # override qmake soname versionong logic + QMAKE_LFLAGS_SONAME = + QMAKE_LFLAGS += -Wl,-soname=lib$${TARGET}.dylib.$${aVerMaj}.$${aVerMin} + + # extend clean with versioned .dylib files QMAKE_CLEAN += $$DESTDIR/lib$${TARGET}.dylib QMAKE_CLEAN += $$DESTDIR/lib$${TARGET}.$${aVerMaj}.dylib QMAKE_CLEAN += $$DESTDIR/lib$${TARGET}.$${aVerMaj}.$${aVerMin}.dylib QMAKE_CLEAN += $$DESTDIR/lib$${TARGET}.$${aVerMaj}.$${aVerMin}.$${aVerMic}.dylib } else { + # override qmake soname versionong logic + QMAKE_LFLAGS_SONAME = + QMAKE_LFLAGS += -Wl,-soname=lib$${TARGET}.so.$${aVerMaj}.$${aVerMin} + + # extend clean with versioned .so files QMAKE_CLEAN += $$DESTDIR/lib$${TARGET}.so QMAKE_CLEAN += $$DESTDIR/lib$${TARGET}.so.$${aVerMaj} QMAKE_CLEAN += $$DESTDIR/lib$${TARGET}.so.$${aVerMaj}.$${aVerMin}