From 2fe2a657720005ee3ec69d556df9f1f0781c64c6 Mon Sep 17 00:00:00 2001 From: Paul Evans Date: Thu, 28 May 2026 08:26:14 +0100 Subject: [PATCH] cmake: bring build output into parity with autotools for RPM/DEB packaging Update the shared library naming to match autotools conventions: use OUTPUT_NAME with the project version embedded, VERSION 2.0.0 and SOVERSION 2 (matching libtool -version-info 2:0:0), with a development symlink following the autotools -release naming. This ensures the cmake and autotools builds produce compatible SONAME and library filenames. Additional changes for parity: - install headers to /include/scsi/ to match autotools - fix INSTALL_INTERFACE include path (was double-nested include/include) - install all 9 scripts, not just rescan-scsi-bus.sh - link sgp_dd with pthread, sg_seek and sg_turs with rt (as-needed) - add -Wall -W, use -std=c99 (not gnu99), and define _LARGEFILE64_SOURCE and _FILE_OFFSET_BITS=64 - define HAVE_NVME in config.h when nvme_ioctl.h is present, enabling NVMe passthrough support to match autotools builds - align CPack RPM names with Fedora/RHEL (sg3_utils-libs, sg3_utils-devel) - align CPack DEB runtime name with Debian (libsgutils2-2) Signed-off-by: Paul Evans --- CMakeLists.txt | 43 ++++++++++++++++++++++++++++++++++-------- config.h.in.cmake | 1 + doc/CMakeLists.txt | 6 +++--- include/CMakeLists.txt | 2 +- lib/CMakeLists.txt | 20 ++++++++++++++++---- scripts/CMakeLists.txt | 16 +++++++++++++++- src/CMakeLists.txt | 13 +++++++++++++ 7 files changed, 84 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 25216ff4..f29d3aff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,10 @@ include(CMakePackageConfigHelpers) set ( CMAKE_C_STANDARD 99 ) set ( CMAKE_C_STANDARD_REQUIRED ON ) -set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -g" ) +set ( CMAKE_C_EXTENSIONS OFF ) +set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -g -Wall -W" ) + +add_compile_definitions ( _LARGEFILE64_SOURCE _FILE_OFFSET_BITS=64 ) string(TIMESTAMP BUILD_TIME "%Y%m%d %H:%M:%S") @@ -127,6 +130,11 @@ check_function_exists(pthread_kill HAVE_PTHREAD_KILL) check_function_exists(getopt_long HAVE_GETOPT_LONG) check_function_exists(setmode HAVE_SETMODE) +find_package(Threads) + +include(CheckLibraryExists) +check_library_exists(rt clock_gettime "" NEED_RT_LIB) + set(OS_LINUX 0) set(SG_LIB_LINUX 0) set(SG_LIB_ANDROID 0) @@ -162,11 +170,13 @@ if (CYGWIN) set(OS_WIN32 1) set(SG_LIB_WIN32 1) set(SG_LIB_CYGWIN 1) + set(HAVE_NVME 1) elseif (MINGW) message(STATUS ">> MinGW build") set(OS_WIN32 1) set(SG_LIB_WIN32 1) set(SG_LIB_MINGW 1) + set(HAVE_NVME 1) elseif (WIN32) message(STATUS ">> Windows build") set(OS_WIN32 1) @@ -176,6 +186,9 @@ elseif (ANDROID) set(OS_ANDROID 1) set(SG_LIB_LINUX 1) set(SG_LIB_ANDROID 1) + if (HAVE_LINUX_NVME_IOCTL_H) + set(HAVE_NVME 1) + endif () elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux") message(STATUS ">> Linux build") set(OS_LINUX 1) @@ -184,10 +197,14 @@ elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux") CHECK_INCLUDE_FILE( "linux/types.h" HAVE_LINUX_TYPES_H ) CHECK_INCLUDE_FILE( "linux/bsg.h" HAVE_LINUX_BSG_H ) CHECK_INCLUDE_FILE( "linux/kdev_t.h" HAVE_LINUX_KDEV_T_H ) + if (HAVE_LINUX_NVME_IOCTL_H) + set(HAVE_NVME 1) + endif () elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") message(STATUS ">> FreeBSD build") set(OS_FREEBSD 1) set(SG_LIB_FREEBSD 1) + set(HAVE_NVME 1) elseif (CMAKE_SYSTEM_NAME STREQUAL "NetBSD") message(STATUS ">> NetBSD build") set(OS_NETBSD 1) @@ -262,13 +279,15 @@ set(CPACK_COMPONENTS_GROUPING IGNORE) # set(CPACK_DEBIAN_UTILITIES_PACKAGE_NAME "sg3-utils") -set(CPACK_DEBIAN_RUNTIME_PACKAGE_NAME "libsgutils2") +set(CPACK_DEBIAN_RUNTIME_PACKAGE_NAME "libsgutils2-2") set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_NAME "libsgutils2-dev") set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_DEPENDS - "libsgutils2 (= ${PROJECT_VERSION})") + "libsgutils2-2 (= ${PROJECT_VERSION})") SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION "SCSI utilities, typically one utility per SCSI command, outputs responses in human readable or JSON form") SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Douglas Gilbert") -SET(CPACK_DEBIAN_PACKAGE_SECTION "admin") +set(CPACK_DEBIAN_UTILITIES_PACKAGE_SECTION "admin") +set(CPACK_DEBIAN_RUNTIME_PACKAGE_SECTION "libs") +set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_SECTION "libdevel") SET(CPACK_DEBIAN_PACKAGE_DEPENDS " ") set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) @@ -279,11 +298,11 @@ SET(CPACK_DEB_COMPONENT_INSTALL YES) # set(CPACK_RPM_UTILITIES_PACKAGE_NAME "sg3_utils") -set(CPACK_RPM_RUNTIME_PACKAGE_NAME "sgutils2-libs") -set(CPACK_RPM_DEVELOPMENT_PACKAGE_NAME "sgutils2-devel") +set(CPACK_RPM_RUNTIME_PACKAGE_NAME "sg3_utils-libs") +set(CPACK_RPM_DEVELOPMENT_PACKAGE_NAME "sg3_utils-devel") SET(CPACK_RPM_PACKAGE_DESCRIPTION "SCSI utilities, typically one utility per SCSI command, outputs responses in human readable or JSON form") SET(CPACK_RPM_PACKAGE_DEPENDS " ") -SET(CPACK_RPM_PACKAGE_LICENSE "BSD-2-clause") +SET(CPACK_RPM_PACKAGE_LICENSE "BSD-2-Clause and GPL-2.0-or-later") SET(CPACK_RPM_PACKAGE_VENDOR "Douglas Gilbert") set(CPACK_RPM_FILE_NAME RPM-DEFAULT) @@ -299,7 +318,15 @@ set(CPACK_FREEBSD_PACKAGE_MAINTAINER "dgilbert@interlog.com") set(CPACK_FREEBSD_PACKAGE_WWW "https://doug-gilbert.github.io/sg3_utils.html") if ( SG_LIB_LINUX ) - SET(CPACK_GENERATOR "DEB;RPM") + set(CPACK_GENERATOR "") + find_program(DPKG_EXECUTABLE dpkg) + if (DPKG_EXECUTABLE) + list(APPEND CPACK_GENERATOR "DEB") + endif () + find_program(RPMBUILD_EXECUTABLE rpmbuild) + if (RPMBUILD_EXECUTABLE) + list(APPEND CPACK_GENERATOR "RPM") + endif () elseif ( SG_LIB_FREEBSD ) SET(CPACK_GENERATOR "FREEBSD") endif ( SG_LIB_LINUX ) diff --git a/config.h.in.cmake b/config.h.in.cmake index 6b50521e..254d2c06 100644 --- a/config.h.in.cmake +++ b/config.h.in.cmake @@ -47,6 +47,7 @@ #cmakedefine HAVE_LINUX_BSG_H 1 #cmakedefine HAVE_LINUX_KDEV_T_H 1 #cmakedefine HAVE_LINUX_NVME_IOCTL_H 1 +#cmakedefine HAVE_NVME 1 #cmakedefine HAVE_SYS_TYPES_H 1 #cmakedefine IGNORE_NVME 1 #cmakedefine IGNORE_LINUX_SGV4 1 diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index f5597d29..f0ce3ff0 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -95,7 +95,7 @@ foreach(util ${SG3_UTILS}) file(ARCHIVE_CREATE OUTPUT ${CMAKE_BINARY_DIR}/doc/${util}.8.gz - PATHS doc/${util}.8 + PATHS ${CMAKE_SOURCE_DIR}/doc/${util}.8 FORMAT raw COMPRESSION GZip ) @@ -109,7 +109,7 @@ endforeach() if (OS_LINUX) file(ARCHIVE_CREATE OUTPUT ${CMAKE_BINARY_DIR}/doc/sg_scan.8.gz - PATHS doc/sg_scan.8.linux + PATHS ${CMAKE_SOURCE_DIR}/doc/sg_scan.8.linux FORMAT raw COMPRESSION GZip ) @@ -122,7 +122,7 @@ endif (OS_LINUX) if (SG_LIB_WIN32) file(ARCHIVE_CREATE OUTPUT ${CMAKE_BINARY_DIR}/doc/sg_scan.8.gz - PATHS doc/sg_scan.8.win32 + PATHS ${CMAKE_SOURCE_DIR}/doc/sg_scan.8.win32 FORMAT raw COMPRESSION GZip ) diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index e0a90bd6..6e5dcc0c 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -25,7 +25,7 @@ install( sg_pt_linux_missing.h sg_unaligned.h DESTINATION - ${CMAKE_INSTALL_INCLUDEDIR} + ${CMAKE_INSTALL_INCLUDEDIR}/scsi COMPONENT development ) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index f32a382e..4f83030d 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -82,7 +82,7 @@ endif ( ENABLE_DEBUG ) target_include_directories(sgutils2 PUBLIC $ - $ + $ ) target_include_directories(sgutils2 PRIVATE ${CMAKE_BINARY_DIR}) @@ -91,8 +91,9 @@ target_include_directories(sgutils2 PRIVATE ${CMAKE_BINARY_DIR}) # target_compile_features(sgutils2 PUBLIC c_std_99) set_target_properties(sgutils2 PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 + OUTPUT_NAME "sgutils2-${PROJECT_VERSION}" + VERSION 2.0.0 + SOVERSION 2 ) # @@ -104,8 +105,19 @@ install(TARGETS sgutils2 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT runtime + NAMELINK_SKIP +) - NAMELINK_COMPONENT development +# Match the autotools -release convention: the development symlink is the +# plain libsgutils2.so name (without the release version embedded). +# Create the directory first so this works when CPack stages components +# into separate trees. +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LIBDIR}\") +file(CREATE_LINK + \"libsgutils2-${PROJECT_VERSION}.so.2\" + \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LIBDIR}/libsgutils2.so\" + SYMBOLIC)" + COMPONENT development ) write_basic_package_version_file( diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt index 124e8fb0..ff858f1b 100644 --- a/scripts/CMakeLists.txt +++ b/scripts/CMakeLists.txt @@ -1,7 +1,21 @@ MESSAGE( STATUS ">> Entering scripts/CMakeLists.txt" ) -install(FILES ${CMAKE_SOURCE_DIR}/scripts/rescan-scsi-bus.sh +set(SG3_UTILS_SCRIPTS + rescan-scsi-bus.sh + scsi_logging_level + scsi_mandat + scsi_readcap + scsi_ready + scsi_satl + scsi_start + scsi_stop + scsi_temperature +) + +foreach(script ${SG3_UTILS_SCRIPTS}) + install(FILES ${CMAKE_SOURCE_DIR}/scripts/${script} PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT utilities) +endforeach() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b100f911..7c602d37 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -181,3 +181,16 @@ elseif (SG_LIB_WIN32) endif (NOT PT_DUMMY) endif (SG_LIB_LINUX) +# Per-utility link dependencies matching autotools (src/Makefile.am): +# sgp_dd needs pthread, sg_seek and sg_turs need rt (for clock_gettime) +if (SG_LIB_LINUX AND NOT PT_DUMMY) + if (Threads_FOUND) + target_link_libraries(sgp_dd PRIVATE Threads::Threads) + endif () +endif () + +if (NEED_RT_LIB) + target_link_libraries(sg_seek PRIVATE rt) + target_link_libraries(sg_turs PRIVATE rt) +endif () +