From 76adf028da21c5076a25b6b08010a4811ffe47e2 Mon Sep 17 00:00:00 2001 From: s3rj1k Date: Sat, 30 Mar 2019 17:33:29 +0200 Subject: [PATCH] add support for RPM package building on Centos 7.x Signed-off-by: s3rj1k --- CMakeLists.txt | 133 +++++++++++++++++++++++++++++++++++++++++++------ README | 15 +++++- 2 files changed, 132 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1fd2a0e..727a601 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.6.2) +cmake_minimum_required(VERSION 3.7.2) option(SWCLT_DEBUG_JSON "Enables json frame logs to stdout" OFF) @@ -17,8 +17,8 @@ if (WIN32) endif() # Declare our project, libks -project(Signalwire-Client-C VERSION 1.1.0 LANGUAGES C) -message("Signalwire-Client-C ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}") +project(SignalWire-Client-C VERSION 1.1.0 LANGUAGES C) +message("SignalWire-Client-C ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}") # Set package version set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) @@ -31,11 +31,9 @@ ksutil_setup_platform() # Find stuff we need for packaging on UNIX if(KS_PLAT_LIN) - find_program(LSB_RELEASE_CMD lsb_release) find_package(Git) find_program(GZIP_CMD gzip) find_program(DATE_CMD date) - find_program(DPKG_CMD dpkg) endif() # Fixes build on older gcc, Debian Jessie @@ -63,13 +61,114 @@ if(KS_PLAT_LIN) find_file(DEBIAN_FOUND debian_version debconf.conf PATHS /etc ) + + find_file(CENTOS_FOUND centos-release + PATHS /etc + ) + if(DEBIAN_FOUND) set(CMAKE_OS_NAME "Debian" CACHE STRING "Operating system name" FORCE) endif() + + if(CENTOS_FOUND) + set(CMAKE_OS_NAME "Centos" CACHE STRING "Operating system name" FORCE) + endif() +endif() + +# Centos packaging +if("${CMAKE_OS_NAME}" STREQUAL "Centos") + + # Enable component install + set(CPACK_RPM_COMPONENT_INSTALL ON) + + # Find stuff we need for packaging on Centos + find_program(ARCH_CMD arch) + find_program(RPM_CMD rpm) + + # Set package architecture + if(ARCH_CMD) + execute_process(COMMAND ${ARCH_CMD} OUTPUT_VARIABLE CENTOS_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) + set(CPACK_RPM_RUNTIME_PACKAGE_ARCHITECTURE ${CENTOS_ARCH}) + set(CPACK_SYSTEM_NAME ${CENTOS_ARCH}) + unset(CENTOS_ARCH) + endif() + + # Get RPM DIST tag, rpm --eval '%{dist}' + if(RPM_CMD) + execute_process(COMMAND ${RPM_CMD} --eval %{dist} + OUTPUT_VARIABLE DIST_TAG + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE) + endif() + + # https://gitlab.kitware.com/cmake/cmake/issues/16517 + set(CPACK_COMPONENTS_ALL runtime) + + # Set package type to build + set(CPACK_GENERATOR RPM) + + # Set RPM package name + set(CPACK_RPM_RUNTIME_PACKAGE_NAME "signalwire-client-c") + + # Set version release from environment variable + if (NOT "$ENV{PACKAGE_RELEASE}" STREQUAL "") + set(CPACK_RPM_PACKAGE_RELEASE "$ENV{PACKAGE_RELEASE}") + else() + if(DATE_CMD) + execute_process(COMMAND ${DATE_CMD} +%Y%m%d OUTPUT_VARIABLE DATE_YMD) + set(CPACK_RPM_PACKAGE_RELEASE ${DATE_YMD}) + else() + set(CPACK_RPM_PACKAGE_RELEASE "1") + endif() + endif() + + # Set RPM version + set(CPACK_RPM_PACKAGE_VERSION ${PROJECT_VERSION}) + + # Set OS DIST tag + set(CPACK_RPM_PACKAGE_RELEASE_DIST ${DIST_TAG}) + + # Set RPM filename + set(CPACK_RPM_RUNTIME_FILE_NAME "${CPACK_RPM_RUNTIME_PACKAGE_NAME}-${PROJECT_VERSION}-${CPACK_RPM_PACKAGE_RELEASE}${DIST_TAG}.${CENTOS_ARCH}rpm") + + # Set license + set(CPACK_RPM_PACKAGE_LICENSE "MIT") + + # Set RPM group + set(CPACK_RPM_PACKAGE_GROUP "Development/Libraries/C and C++") + + # Set RPM vendor + set(CPACK_RPM_PACKAGE_VENDOR "SignalWire") + + # Set RPM URL + set(CPACK_RPM_RUNTIME_PACKAGE_URL "https://signalwire.com/") + + # Set RPM Description + set(CPACK_RPM_PACKAGE_DESCRIPTION "SignalWire C Client and Library Headers") + + # Set RPM package summary + set(CPACK_RPM_PACKAGE_SUMMARY "SignalWire's C client") + + # Set auto dependency detection + set(CPACK_RPM_PACKAGE_AUTOREQPROV "yes") + + # Create changelog + string(TIMESTAMP NOW "%a %b %d %Y" UTC) + FILE(WRITE ${CMAKE_CURRENT_LIST_DIR}/changelog "* ${NOW} ${CPACK_RPM_PACKAGE_VENDOR} <${CPACK_PACKAGE_CONTACT}> ${PROJECT_VERSION}-${CPACK_RPM_PACKAGE_RELEASE}${DIST_TAG}\n") + FILE(APPEND ${CMAKE_CURRENT_LIST_DIR}/changelog "- autogenerated RPM package\n") + unset(NOW) + set(CPACK_RPM_CHANGELOG_FILE "${CMAKE_CURRENT_LIST_DIR}/changelog") + endif() -# Get distro codename -if (KS_PLAT_LIN AND NOT DISTRO_CODENAME) +# Debian packaging +if("${CMAKE_OS_NAME}" STREQUAL "Debian") + + # Find stuff we need for packaging on Debian + find_program(DPKG_CMD dpkg) + find_program(LSB_RELEASE_CMD lsb_release) + + # Get distro codename if(NOT LSB_RELEASE_CMD) message(WARNING "DEB Generator: Can't find lsb_release in your path. Setting DISTRO_CODENAME to unknown.") set(DISTRO_CODENAME unknown) @@ -78,10 +177,6 @@ if (KS_PLAT_LIN AND NOT DISTRO_CODENAME) OUTPUT_VARIABLE DISTRO_CODENAME OUTPUT_STRIP_TRAILING_WHITESPACE) endif() -endif() - -# Debian packaging -if("${CMAKE_OS_NAME}" STREQUAL "Debian") # https://gitlab.kitware.com/cmake/cmake/issues/16517 set(CPACK_COMPONENTS_ALL runtime) @@ -93,9 +188,6 @@ if("${CMAKE_OS_NAME}" STREQUAL "Debian") # Abuse Cmake component name set(CPACK_DEBIAN_RUNTIME_PACKAGE_NAME ${CPACK_DEBIAN_PACKAGE_NAME}) - # Find stuff we need for packaging on Debian - find_program(DPKG_CMD dpkg) - # Set package type to build set(CPACK_GENERATOR DEB) @@ -276,7 +368,18 @@ if (NOT KS_PLAT_WIN) # Set install targets install(TARGETS signalwire_client COMPONENT "runtime" EXPORT SignalWireClientConfig DESTINATION lib) install(DIRECTORY inc/signalwire-client-c COMPONENT "runtime" DESTINATION include PATTERN internal EXCLUDE) - install(FILES ${PROJECT_BINARY_DIR}/signalwire_client.pc COMPONENT "runtime" DESTINATION lib/pkgconfig) + + # Set path for pkg-config based on ARCH and distro type + if("${CMAKE_OS_NAME}" STREQUAL "Centos") # pkg-config --variable pc_path pkg-config + if(${CPACK_SYSTEM_NAME} MATCHES "x86_64") + install(FILES ${PROJECT_BINARY_DIR}/signalwire_client.pc COMPONENT "runtime" DESTINATION lib64/pkgconfig) + else() + install(FILES ${PROJECT_BINARY_DIR}/signalwire_client.pc COMPONENT "runtime" DESTINATION lib/pkgconfig) + endif() + else() + install(FILES ${PROJECT_BINARY_DIR}/signalwire_client.pc COMPONENT "runtime" DESTINATION lib/pkgconfig) + endif() + install(EXPORT SignalWireClientConfig COMPONENT "runtime" DESTINATION include/signalwire-client-c/cmake) install(FILES ${PROJECT_BINARY_DIR}/copyright COMPONENT "runtime" DESTINATION share/doc/signalwire-client-c) diff --git a/README b/README index 5bf38a2..6f812b7 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -To build use cmake (Minimum version 3.6.2): +To build use cmake (Minimum version 3.7.2): cmake . make @@ -25,3 +25,16 @@ OPENSSL_ROOT_DIR=/usr/local/opt/openssl cmake . -DCMAKE_INSTALL_PREFIX:PATH=/usr To build release package with build number 42: PACKAGE_RELEASE="42" cmake . -DCMAKE_BUILD_TYPE=Release && make package + +To buld CMAKE from source +wget https://cmake.org/files/v3.7/cmake-3.7.2.tar.gz +tar -zxvf cmake-3.7.2.tar.gz +cd cmake-3.7.2 +./bootstrap --prefix=/usr/local +make +make install +/usr/local/bin/cmake --version + +Centos dependencies: +- yum groupinstall "Development Tools" +- yum install libuuid-devel libatomic openssl-devel