summaryrefslogtreecommitdiffstats
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorManuel Bentele2020-10-23 18:13:15 +0200
committerManuel Bentele2020-10-23 18:13:15 +0200
commit588368dd2a46ddec70741c6cc87a79a0b26ee383 (patch)
tree69265caba9b1fb0ee126c142538b75fd49bbe8ee /CMakeLists.txt
parentMove the source code of all xloop components to the common 'src' directory (diff)
downloadxloop-588368dd2a46ddec70741c6cc87a79a0b26ee383.tar.gz
xloop-588368dd2a46ddec70741c6cc87a79a0b26ee383.tar.xz
xloop-588368dd2a46ddec70741c6cc87a79a0b26ee383.zip
Add automatic generation of version and build type headers for compilation
This change replaces the static version and build type header file generation by CMake with dynamic CMake targets to generate the version file whenever a Make target is executed. Thus, there is no need anymore to reconfigure and rerun CMake after the repository version or build configuration has changed.
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt154
1 files changed, 115 insertions, 39 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cc62a4b..a14e369 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,21 +1,41 @@
cmake_minimum_required(VERSION 3.10)
# include CMake macros
-set (CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake")
-include(version)
+set(PROJECT_MODULES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
+ ${PROJECT_MODULES_DIR})
# define root CMake project
project(xloop
DESCRIPTION "xloop Linux kernel modules and utility"
LANGUAGES C)
-# define project specific settings
-set(BLK_DEV_XLOOP_MIN_COUNT 8
- CACHE STRING "Number of xloop devices to pre-create at init time")
-set(XLOOP_MAJOR 120
- CACHE STRING "Major number for xloop devices")
-set(XLOOP_CTRL_MINOR 15
- CACHE STRING "Minor number for the xloop-control device")
+# check for system before all other stuff is configured
+if(NOT UNIX OR NOT CMAKE_SYSTEM_NAME MATCHES "Linux")
+ # abort build of the xloop Linux kernel modules on a system other than Linux, eg. FreeBSD
+ message(FATAL_ERROR "Detected non-Linux system: Abort build of the xloop Linux kernel modules and utility")
+endif(NOT UNIX OR NOT CMAKE_SYSTEM_NAME MATCHES "Linux")
+
+# set supported build configurations
+set(CMAKE_CONFIGURATION_TYPES Debug Release)
+
+# set compilation in debug mode as default configuration
+if(NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE Debug)
+ message(STATUS "Build type is not set. Defaulting to ${CMAKE_BUILD_TYPE} build!")
+endif(NOT CMAKE_BUILD_TYPE)
+
+# include project version and build type related macros
+include(Version)
+include(Build)
+
+# search for required packages
+find_package(Git)
+
+# abort if a required package is not available
+if(NOT GIT_FOUND)
+ message(FATAL_ERROR "No Git found, can't determine xloop project version number!")
+endif(NOT GIT_FOUND)
# set Linux kernel directories
set(KERNEL_BUILD_DIR "/lib/modules/${CMAKE_SYSTEM_VERSION}/build"
@@ -23,6 +43,14 @@ set(KERNEL_BUILD_DIR "/lib/modules/${CMAKE_SYSTEM_VERSION}/build"
set(KERNEL_INSTALL_DIR "/lib/modules/${CMAKE_SYSTEM_VERSION}/extra"
CACHE PATH "Path to install Linux kernel modules")
+# set linux kernel modules specific default settings
+set(BLK_DEV_XLOOP_MIN_COUNT 8
+ CACHE STRING "Number of xloop devices to pre-create at init time")
+set(XLOOP_MAJOR 120
+ CACHE STRING "Major number for xloop devices")
+set(XLOOP_CTRL_MINOR 15
+ CACHE STRING "Minor number for the xloop-control device")
+
# print configured settings
message(STATUS "Path to Linux kernel modules to compile against is " ${KERNEL_BUILD_DIR})
message(STATUS "Path to install Linux kernel modules is " ${KERNEL_INSTALL_DIR})
@@ -30,48 +58,77 @@ message(STATUS "Number of xloop devices to pre-create at init time is " ${BLK_DE
message(STATUS "Major number for xloop devices is " ${XLOOP_MAJOR})
message(STATUS "Minor number for the xloop-control device is " ${XLOOP_CTRL_MINOR})
-# set supported build configurations
-set(CMAKE_CONFIGURATION_TYPES Debug Release)
+# get the Linux kernel version
+get_kernel_version(LINUX_KERNEL_VERSION ${KERNEL_BUILD_DIR})
-# set compilation in debug mode as default configuration
-if(NOT CMAKE_BUILD_TYPE)
- set(CMAKE_BUILD_TYPE Debug)
- message(STATUS "Build type is not set. Defaulting to ${CMAKE_BUILD_TYPE} build!")
-endif()
+# set include directories
+set(PROJECT_GEN_DIR ${CMAKE_BINARY_DIR}/generated)
+set(PROJECT_INCLUDE_DIR_PREFIX inc)
+set(PROJECT_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/${PROJECT_INCLUDE_DIR_PREFIX})
+set(PROJECT_INCLUDE_GEN_DIR ${PROJECT_GEN_DIR}/${PROJECT_INCLUDE_DIR_PREFIX})
+include_directories(${PROJECT_INCLUDE_DIR})
-# get versions to define project version
-get_kernel_version(LINUX_KERNEL_VERSION ${KERNEL_BUILD_DIR})
-get_repository_version(REPOSITORY_VERSION)
-set(VERSION ${LINUX_KERNEL_VERSION}-${REPOSITORY_VERSION}
- CACHE STRING "Version of xloop package")
+# generate project version C header file from template
+# exposes xloop-generate-version and xloop-version target
+set(INCLUDE_VERSION_HEADER ${PROJECT_INCLUDE_DIR}/xloop/version.h)
+set(INCLUDE_VERSION_HEADER_TEMPLATE ${PROJECT_INCLUDE_DIR}/xloop/version.h.in)
+set(INCLUDE_VERSION_HEADER_GENERATE ${PROJECT_INCLUDE_GEN_DIR}/xloop/version.h)
+set(INCLUDE_VERSION_HEADER_GENERATE_PREFIX ${PROJECT_INCLUDE_DIR_PREFIX}/xloop)
+gen_project_version(${INCLUDE_VERSION_HEADER} ${INCLUDE_VERSION_HEADER_TEMPLATE} ${INCLUDE_VERSION_HEADER_GENERATE})
+
+# generate project build type C header file from template
+# exposes xloop-generate-build and xloop-build target
+set(INCLUDE_BUILD_HEADER_TEMPLATE ${PROJECT_INCLUDE_DIR}/xloop/build.h.in)
+set(INCLUDE_BUILD_HEADER_GENERATE ${PROJECT_INCLUDE_GEN_DIR}/xloop/build.h)
+gen_build_type(${INCLUDE_BUILD_HEADER_TEMPLATE} ${INCLUDE_BUILD_HEADER_GENERATE})
+
+# enable all error warnings in Debug build configuration
+set(CMAKE_C_FLAGS_DEBUG "-Wall -Wextra -Wpedantic -Wconversion -Wformat -Wformat-security -Werror=format-security")
+set(CMAKE_C_FLAGS_RELEASE "-Wno-error")
+
+# set compilation optimization
+set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -Og -DDEBUG")
+set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -DNDEBUG")
# define packaging if Release build is enabled
-if(${CMAKE_BUILD_TYPE} MATCHES Release)
+if(CMAKE_BUILD_TYPE MATCHES "Release")
+ # get version source package or Git repository
+ get_repository_version(REPOSITORY_VERSION ${INCLUDE_VERSION_HEADER} ${CMAKE_BUILD_TYPE})
+
+ # define project version
+ set(REPOSITORY_VERSION_FULL ${REPOSITORY_VERSION}-${LINUX_KERNEL_VERSION})
+
set(CPACK_GENERATOR "DEB;RPM;TGZ")
- set(CPACK_SOURCE_GENERATOR "TGZ;ZIP")
set(CPACK_PACKAGE_NAME ${CMAKE_PROJECT_NAME})
set(CPACK_MONOLITHIC_INSTALL True)
- set(CPACK_SOURCE_IGNORE_FILES "/build/;/.git/;.gitignore$;.*~")
- set(CPACK_PACKAGE_VERSION ${VERSION})
+ set(CPACK_PACKAGE_VERSION ${REPOSITORY_VERSION})
+ set(CPACK_PACKAGE_VERSION_FULL ${REPOSITORY_VERSION_FULL})
set(CPACK_PACKAGE_SECTION admin)
set(CPACK_PACKAGE_VENDOR "University of Freiburg")
set(CPACK_PACKAGE_CONTACT "Christian Rößler <christian.roessler@rz.uni-freiburg.de>")
set(CPACK_PACKAGE_HOMEPAGE_URL "https://git.openslx.org/openslx-ng/xloop.git/")
set(CPACK_PACKAGE_CHECKSUM SHA256)
- set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}_${CMAKE_SYSTEM_PROCESSOR})
+ set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}_${REPOSITORY_VERSION_FULL}_${CMAKE_SYSTEM_PROCESSOR})
set(CPACK_SOURCE_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}_source)
set(CPACK_STRIP_FILES True)
set(CPACK_PACKAGE_RELOCATABLE False)
set(CPACK_SET_DESTDIR True)
set(CMAKE_INSTALL_PREFIX "/usr")
set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
+ set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/COPYING)
+ set(CPACK_RESOURCE_FILE_README ${CMAKE_CURRENT_SOURCE_DIR}/README.md)
+
# set DEB generator specific packaging options
- set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc-bin")
- file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/package/deb/postinst "depmod -a\nudevadm control --reload-rules\n")
- file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/package/deb/postrm "depmod -a\nudevadm control --reload-rules\n")
- set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA ${CMAKE_CURRENT_BINARY_DIR}/package/deb/postinst
- ${CMAKE_CURRENT_BINARY_DIR}/package/deb/postrm)
+ set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6")
+ if(XLOOP_KERNEL_MODULES)
+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/package/deb/postinst "depmod -a\nudevadm control --reload-rules\n")
+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/package/deb/postrm "depmod -a\nudevadm control --reload-rules\n")
+ set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA ${CMAKE_CURRENT_BINARY_DIR}/package/deb/postinst
+ ${CMAKE_CURRENT_BINARY_DIR}/package/deb/postrm)
+ endif(XLOOP_KERNEL_MODULES)
+
# set RPM generator specific packaging options
+ set(CPACK_RPM_PACKAGE_REQUIRES "glibc")
set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/lib"
"/lib/modules"
"/lib/modules/${CMAKE_SYSTEM_VERSION}"
@@ -82,16 +139,35 @@ if(${CMAKE_BUILD_TYPE} MATCHES Release)
"${CPACK_PACKAGING_INSTALL_PREFIX}/share/bash-completion/completions"
"${CPACK_PACKAGING_INSTALL_PREFIX}/share/man"
"${CPACK_PACKAGING_INSTALL_PREFIX}/share/man/man8")
- file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/package/rpm/post "depmod -a\nudevadm control --reload-rules\n")
- file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/package/rpm/postun "depmod -a\nudevadm control --reload-rules\n")
- set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE ${CMAKE_CURRENT_BINARY_DIR}/package/rpm/post)
- set(CPACK_RPM_POST_UNINSTALL_SCRIPT_FILE ${CMAKE_CURRENT_BINARY_DIR}/package/rpm/postun)
+ if(XLOOP_KERNEL_MODULES)
+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/package/rpm/post "depmod -a\nudevadm control --reload-rules\n")
+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/package/rpm/postun "depmod -a\nudevadm control --reload-rules\n")
+ set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE ${CMAKE_CURRENT_BINARY_DIR}/package/rpm/post)
+ set(CPACK_RPM_POST_UNINSTALL_SCRIPT_FILE ${CMAKE_CURRENT_BINARY_DIR}/package/rpm/postun)
+ endif(XLOOP_KERNEL_MODULES)
+
+ # configure source packaging
+ set(CPACK_SOURCE_GENERATOR "TGZ;ZIP")
+ set(CPACK_SOURCE_INSTALLED_DIRECTORIES "${CMAKE_SOURCE_DIR}" "/"
+ "${PROJECT_GEN_DIR}" "/")
+ set(CPACK_SOURCE_IGNORE_FILES "/build/;/.git/;.gitignore$;.*~;version.h.in$")
+
+ # generate install script for CPack to install generated files
+ configure_file(${PROJECT_MODULES_DIR}/InstallVersionFile.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/package/InstallVersionFile.cmake)
+
+ # set CPack install script
+ set(CPACK_INSTALL_SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/package/InstallVersionFile.cmake)
+
# include CPack functionality
include(CPack)
-endif()
+
+ # create custom target to build package source
+ add_custom_target(source
+ COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target package_source
+ DEPENDS xloop-generate-version
+ VERBATIM
+ USES_TERMINAL)
+endif(CMAKE_BUILD_TYPE MATCHES "Release")
# add all xloop related projects from the source code directory
add_subdirectory(src)
-
-# print version information
-message(STATUS "Configured ${CMAKE_PROJECT_NAME} in version ${VERSION}")