Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 63 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required ( VERSION 3.10 )
cmake_minimum_required ( VERSION 3.18 )

project(sdparm VERSION 1.12.9)
# Use version number: x.y.9 to indicate pre-release of x.(y+1)
Expand All @@ -17,11 +17,21 @@ option ( DISABLE_NVME_SUPP "Remove all or most NVMe code" OFF)
include ( CMakePackageConfigHelpers )
include ( GNUInstallDirs )
include ( CheckIncludeFile )
include ( CheckFunctionExists )
include ( CheckCSourceCompiles )
find_package ( PkgConfig )

string(TIMESTAMP BUILD_TIME "%Y%m%d %H:%M:%S")

CHECK_INCLUDE_FILE( "linux/nvme_ioctl.h" NVME_PRESENT )
CHECK_INCLUDE_FILE( "linux/nvme_ioctl.h" HAVE_NVME )
CHECK_INCLUDE_FILE( "byteswap.h" HAVE_BYTESWAP_H )
CHECK_INCLUDE_FILE( "linux/major.h" HAVE_LINUX_MAJOR_H )

check_function_exists( getopt_long HAVE_GETOPT_LONG )
check_function_exists( posix_memalign HAVE_POSIX_MEMALIGN )
check_function_exists( posix_fadvise HAVE_POSIX_FADVISE )
check_function_exists( sysconf HAVE_SYSCONF )
check_function_exists( lseek64 HAVE_LSEEK64 )

if (DISABLE_LIBSGUTILS)
set(BUILD_SHARED_LIBS OFF)
Expand Down Expand Up @@ -68,15 +78,26 @@ set(OS_MINGW 0)
if(CYGWIN)
message(STATUS "Cygwin")
set(OS_CYGWIN 1)
set(SG_LIB_WIN32 1)
set(HAVE_NVME 1)
elseif(MINGW)
message(STATUS "MinGW")
set(OS_MINGW 1)
set(SG_LIB_WIN32 1)
set(SG_LIB_MINGW 1)
set(HAVE_NVME 1)
elseif(WIN32)
message(STATUS "Windows")
set(OS_WINDOWS 1)
set(SG_LIB_WIN32 1)
elseif(ANDROID)
message(STATUS "Android")
set(OS_ANDROID 1)
set(SG_LIB_ANDROID 1)
set(SG_LIB_LINUX 1)
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 )
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
message(STATUS "Linux")
set(OS_LINUX 1)
Expand All @@ -88,7 +109,15 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
message(STATUS "FreeBSD")
set(OS_FREEBSD 1)
set(SG_LIB_FREEBSD 1)
target_include_directories( smp_utils PRIVATE /usr/local/include )
set(HAVE_NVME 1)
elseif(CMAKE_SYSTEM_NAME STREQUAL "NetBSD")
message(STATUS "NetBSD")
set(OS_NETBSD 1)
set(SG_LIB_NETBSD 1)
elseif(CMAKE_SYSTEM_NAME STREQUAL "OpenBSD")
message(STATUS "OpenBSD")
set(OS_OPENBSD 1)
set(SG_LIB_OPENBSD 1)
elseif(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
message(STATUS "Solaris")
set(OS_SOLARIS 1)
Expand All @@ -99,10 +128,20 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "AIX")
elseif(APPLE)
message(STATUS "macOS")
set(OS_MACOS 1)
set(SG_LIB_MACOS 1)
else()
message(STATUS "Unknown system: ${CMAKE_SYSTEM_NAME}")
endif()

if (HAVE_LINUX_TYPES_H)
check_c_source_compiles("
#include <linux/types.h>
int main(void) { __u64 var = 0; return (int)var; }
" HAVE___U64)
endif ()

string(TOLOWER "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}" SG_LIB_BUILD_HOST)

configure_file( ${CMAKE_SOURCE_DIR}/config.h.in.cmake ${CMAKE_BINARY_DIR}/config.h )
add_definitions ( -DHAVE_CONFIG_H )

Expand All @@ -116,15 +155,34 @@ install(FILES README DESTINATION "${CMAKE_INSTALL_DOCDIR}")
install(FILES AUTHORS DESTINATION "${CMAKE_INSTALL_DOCDIR}")
install(FILES CREDITS DESTINATION "${CMAKE_INSTALL_DOCDIR}")

install(PROGRAMS scripts/sas_disk_blink DESTINATION "${CMAKE_INSTALL_BINDIR}")
if ( OS_LINUX )
install(PROGRAMS scripts/scsi_ch_swp DESTINATION "${CMAKE_INSTALL_BINDIR}")
endif ()


set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION "${PROJECT_VERSION}")
SET(CPACK_GENERATOR "DEB;RPM")
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Douglas Gilbert") #required

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 ()

SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Douglas Gilbert")
SET(CPACK_DEBIAN_PACKAGE_SECTION "admin")
SET(CPACK_RPM_PACKAGE_DESCRIPTION "Permits reading and setting of SCSI device mode pages (cf hdparm for ATA disks)")
SET(CPACK_RPM_PACKAGE_LICENSE "BSD-2-clause")
SET(CPACK_RPM_PACKAGE_VENDOR "Douglas Gilbert")
if ( BUILD_SHARED_LIBS )
SET(CPACK_RPM_PACKAGE_REQUIRES "sg3_utils-libs")
SET(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
endif ()

include(CPack)
include(CTest)
37 changes: 18 additions & 19 deletions config.h.in.cmake
Original file line number Diff line number Diff line change
@@ -1,35 +1,34 @@

#cmakedefine SG_LIB_LINUX 1
#cmakedefine SG_LIB_ANDROID 1
#cmakedefine SG_LIB_FREEBSD 1
#cmakedefine SG_LIB_SOLARIS 1
#cmakedefine SG_LIB_CYGWIN 1
#cmakedefine SG_LIB_MINGW 1
#cmakedefine SG_LIB_AIX 1
#cmakedefine SG_LIB_WINDOWS 1
#cmakedefine SG_LIB_ABROID 1
#cmakedefine SG_LIB_NETBSD 1
#cmakedefine SG_LIB_OPENBSD 1
#cmakedefine SG_LIB_SOLARIS 1
#cmakedefine SG_LIB_AIX 1
#cmakedefine SG_LIB_WIN32 1
#cmakedefine SG_LIB_MINGW 1
#cmakedefine SG_LIB_MACOS 1

#cmakedefine SG_LIB_BUILD_HOST "@SG_LIB_BUILD_HOST@"

#cmakedefine HAVE_GETOPT_LONG 1
#cmakedefine HAVE_NVME 1
#cmakedefine HAVE_POSIX_MEMALIGN 1
#cmakedefine IGNORE_FAST_LEBE 1
#cmakedefine IGNORE_LINUX_BSG 1
#cmakedefine IGNORE_NVME 1
#cmakedefine SG_SCSI_STRINGS 1
#cmakedefine HAVE_POSIX_FADVISE 1
#cmakedefine HAVE_SYSCONF 1
#cmakedefine HAVE_LSEEK64 1
#cmakedefine HAVE___U64 1
#cmakedefine HAVE_BYTESWAP_H 1
#cmakedefine HAVE_LINUX_TYPES_H 1
#cmakedefine HAVE_LINUX_BSG_H 1
#cmakedefine HAVE_LINUX_KDEV_T_H 1
#cmakedefine HAVE_LINUX_MAJOR_H 1

#cmakedefine XXXXXXX 1
#cmakedefine IGNORE_FAST_LEBE 1
#cmakedefine IGNORE_LINUX_BSG 1
#cmakedefine IGNORE_NVME 1
#cmakedefine SG_SCSI_STRINGS 1

#define BUILD_TIME "@BUILD_TIME@"

// #define SG_LIB_LINUX @OS_LINUX@
// #define SG_LIB_FREEBSD @OS_FREEBSD@
// #cmakedefine01 SG_LIB_AIX @SG_LIB_AIX@

// # This will generate a line in the output_file. Then in CMLists.txt:
// # set(FEATURE_COMMENT "//")
// @FEATURE_COMMENT@#define OPTIONAL_SETTING 1

8 changes: 5 additions & 3 deletions doc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,19 @@ MESSAGE( STATUS ">> Entering doc/CMakeLists.txt" )
set(SDPARM_MP
sdparm
sdparm_json
sas_disk_blink
scsi_ch_swp
)

foreach(util ${SDPARM_MP})

file(ARCHIVE_CREATE
OUTPUT doc/${util}.8.gz
PATHS doc/${util}.8
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${util}.8.gz
PATHS ${CMAKE_CURRENT_SOURCE_DIR}/${util}.8
FORMAT raw
COMPRESSION GZip
)
install(FILES ${util}.8.gz
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${util}.8.gz
DESTINATION "${CMAKE_INSTALL_MANDIR}/man8"
)

Expand Down
68 changes: 51 additions & 17 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ set ( sourcefiles_sdparm
sdparm_vpd.c
)

if ( OS_CYGWIN OR OS_MINGW )
list(APPEND sourcefiles_sdparm sdparm_wscan.c)
endif ()

set ( src_nolib_sdparm
${CMAKE_SOURCE_DIR}/lib/sg_lib.c
${CMAKE_SOURCE_DIR}/lib/sg_lib_data.c
Expand All @@ -27,37 +31,67 @@ set ( src_nolib_sdparm

if ( BUILD_SHARED_LIBS )
MESSAGE( STATUS ">> Build using shared libraries (default)" )
find_library(LIBSGUTILS NAMES sgutils2 PATH_SUFFIXES lib)
if ( LIBSGUTILS )
MESSAGE( STATUS ">> Found shared library: ${LIBSGUTILS}" )
if ( PkgConfig_FOUND )
pkg_check_modules(SGUTILS sgutils2)
endif ()
if ( NOT SGUTILS_FOUND )
find_library(SGUTILS_LIB NAMES sgutils2 PATH_SUFFIXES lib)
find_path(SGUTILS_INC sg_lib.h PATH_SUFFIXES scsi)
if ( SGUTILS_LIB AND SGUTILS_INC )
set(SGUTILS_FOUND TRUE)
set(SGUTILS_LIBRARIES ${SGUTILS_LIB})
set(SGUTILS_INCLUDE_DIRS ${SGUTILS_INC})
endif ()
endif ()
if ( SGUTILS_FOUND )
MESSAGE( STATUS ">> Found system sgutils2 library" )
add_executable ( sdparm ${sourcefiles_sdparm} )
target_link_libraries(sdparm PRIVATE ${LIBSGUTILS})
else ( LIBSGUTILS )
MESSAGE( STATUS ">> Did not find shared library: ${LIBSGUTILS}" )
add_definitions ( -DSG_LIB_LINUX )
target_link_libraries(sdparm PRIVATE ${SGUTILS_LIBRARIES})
target_include_directories(sdparm PRIVATE ${SGUTILS_INCLUDE_DIRS})
else ()
if ( NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/sg_lib.c )
MESSAGE( FATAL_ERROR "System sgutils2 not found and bundled sg3_utils sources are not present.\n"
"Install the development package (e.g. libsgutils2-dev on Debian/Ubuntu,\n"
"sg3_utils-devel on Fedora/RHEL) or populate the lib/ and include/ directories." )
endif ()
MESSAGE( STATUS ">> System sgutils2 not found, using bundled sg3_utils sources" )
add_executable ( sdparm ${sourcefiles_sdparm} ${src_nolib_sdparm} )
target_link_libraries(sdparm)
endif ( LIBSGUTILS )
else ( BUILD_SHARED_LIBS )
target_include_directories(sdparm PRIVATE ${CMAKE_SOURCE_DIR}/include)
endif ()
else ()
MESSAGE( STATUS ">> Trying to build a static executable" )
add_definitions ( -DSG_LIB_LINUX )
if ( NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/sg_lib.c )
MESSAGE( FATAL_ERROR "Bundled sg3_utils sources are not present in lib/.\n"
"Static builds require the lib/ and include/ directories to be populated." )
endif ()
add_executable ( sdparm ${sourcefiles_sdparm} ${src_nolib_sdparm} )
add_definitions ( -static )
target_link_libraries(sdparm -static)
endif ( BUILD_SHARED_LIBS )
target_include_directories(sdparm PRIVATE ${CMAKE_SOURCE_DIR}/include)
target_link_options(sdparm PRIVATE -static)
endif ()

target_compile_definitions(sdparm PRIVATE _LARGEFILE64_SOURCE _FILE_OFFSET_BITS=64)
target_compile_options(sdparm PRIVATE -Wall -W)
target_include_directories(sdparm PUBLIC ${CMAKE_SOURCE_DIR}/include)
target_include_directories(sdparm PRIVATE ${CMAKE_BINARY_DIR})

if ( ENABLE_DEBUG )
target_compile_definitions(sdparm PRIVATE DEBUG)
target_compile_options(sdparm PRIVATE
-Wextra -Wmisleading-indentation -Wduplicated-cond -Wlogical-op
-Wnull-dereference -Wshadow -Wunused -Wsizeof-array-argument
-Wduplicated-branches -Wjump-misses-init -Wparentheses)
-Wnull-dereference -Wshadow -Wjump-misses-init
-Wunused -Wsizeof-array-argument -Wduplicated-branches -Wparentheses)
endif ( ENABLE_DEBUG )

if ( OS_FREEBSD )
target_link_libraries(sdparm PRIVATE cam)
endif ()

if ( OS_CYGWIN )
target_compile_options(sdparm PRIVATE -Wno-char-subscripts)
endif ()

if ( OS_MINGW )
target_compile_definitions(sdparm PRIVATE __USE_MINGW_ANSI_STDIO)
endif ()

install(TARGETS sdparm RUNTIME DESTINATION bin)