diff options
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 486 |
1 files changed, 246 insertions, 240 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 0141b05..69459dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,240 +1,246 @@ -################################################################################ -# GENERAL # -################################################################################ - -PROJECT(dnbd3 C) -CMAKE_MINIMUM_REQUIRED(VERSION 2.6.2) -IF (CMAKE_BUILD_TYPE STREQUAL "") - SET(CMAKE_BUILD_TYPE Debug) -ENDIF() - -SET(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Path prefix for system installation") -OPTION(BUILD_FUSE_CLIENT "Build dnbd3 fuse client" ON) -OPTION(BUILD_SERVER "Build dnbd3 server" ON) -OPTION(BUILD_STRESSTEST "Build dnbd3 stress testing tool" OFF) -SET(EXTRA_C_FLAGS "" CACHE STRING "Additional options to pass to compiler") - -OPTION(SERVER_FOR_AFL "Build dnbd3-server for usage with afl-fuzz" OFF) - -# Is there a non-retarded way to check if build type is debug or release? -# When specifying, it is case insensitive, so DeBuG would also enable debug builds, -# but in cmake, we can only do case sensitive matches... :/ -string( TOLOWER "${CMAKE_BUILD_TYPE}" bt_lower ) -if (NOT bt_lower MATCHES "^(debug|release)$") - message( FATAL_ERROR "Build type needs to be either Debug or Release" ) -endif() - -message( "Build Type selected: ${CMAKE_BUILD_TYPE}" ) - -IF(CMAKE_SYSTEM_NAME MATCHES "BSD") - message("Detected *BSD System: disable build of Kernel Module.") - SET(BUILD_KERNEL_MODULE False) -ELSE() - OPTION(BUILD_KERNEL_MODULE "Build the dnbd3 Linux kernel module" ON) -ENDIF() - -if(CMAKE_C_COMPILER MATCHES "clang") - message( "Using clang flags." ) - SET(CMAKE_C_FLAGS_DEBUG "-std=c11 -O1 -fno-omit-frame-pointer -g -Wall -Wextra -Wpedantic -Wno-unused-result -D_GNU_SOURCE -D_DEBUG -Wno-multichar -fno-strict-aliasing ${EXTRA_C_FLAGS}") - SET(CMAKE_C_FLAGS_RELEASE "-std=c11 -O2 -Wno-unused-result -D_GNU_SOURCE -DNDEBUG -Wno-multichar -fno-strict-aliasing ${EXTRA_C_FLAGS}") -elseif (CMAKE_C_COMPILER MATCHES "(cc-)|(cc$)") - message( "Using (g)cc flags." ) - SET(CMAKE_C_FLAGS_DEBUG "-std=c11 -O0 -g -Wall -Wextra -Wpedantic -Wconversion -Wno-sign-conversion -D_GNU_SOURCE -D_DEBUG -Wno-multichar -fno-strict-aliasing ${EXTRA_C_FLAGS}") - SET(CMAKE_C_FLAGS_RELEASE "-std=c11 -O2 -Wno-unused-result -D_GNU_SOURCE -DNDEBUG -Wno-multichar -fno-strict-aliasing ${EXTRA_C_FLAGS}") -else() - message( FATAL_ERROR "Could not determine compiler type." ) -endif() -#SET(CMAKE_CXX_FLAGS_DEBUG "-std=c99 -O0 -g -Wall -Wno-unused-result -D_GNU_SOURCE -D_DEBUG") -#SET(CMAKE_CXX_FLAGS_RELEASE "-std=c99 -O2 -Wno-unused-result -D_GNU_SOURCE -DNDEBUG" ) - -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") - -ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64) -ADD_DEFINITIONS(-DWITH_IPV6) - -FIND_PACKAGE(Threads) - -SET(DO_ABORT False) - -message( " *************************************************" ) -if(BUILD_FUSE_CLIENT) - FIND_PACKAGE(Fuse) - if(NOT FUSE_FOUND) - message( " *** No fuse dev libs found, can't build dnbd3-fuse" ) - SET(DO_ABORT True) - endif() - if(NOT THREADS_FOUND) - message( " *** No threads found, can't build dnbd3-fuse" ) - SET(DO_ABORT True) - endif() -endif() -if(BUILD_SERVER) - FIND_PACKAGE(Jansson) - if(NOT THREADS_FOUND) - message( " *** No threads found, can't build dnbd3-server" ) - SET(DO_ABORT True) - endif() - if(NOT JANSSON_FOUND) - message( " *** No jansson lib found, can't build dnbd3-server" ) - SET(DO_ABORT True) - endif() -endif() -if(BUILD_STRESSTEST) - if(NOT THREADS_FOUND) - message( " *** No threads found, can't build dnbd3-bench" ) - SET(DO_ABORT True) - endif() -endif() -message( " *************************************************" ) -if(DO_ABORT) - message( FATAL_ERROR "Aborting." ) -endif() - -#SET(FUSE_INCLUDE_DIR "") -#SET(JANSSON_INCLUDE_DIR "") - -################################################################################ -# VERSION HEADER # -################################################################################ - -FILE(WRITE ${CMAKE_BINARY_DIR}/version.cmake -"EXECUTE_PROCESS( - COMMAND \${CMD} - OUTPUT_VARIABLE VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - CONFIGURE_FILE(\${SRC} \${DST} @ONLY) -") -ADD_CUSTOM_TARGET( - version - ${CMAKE_COMMAND} -D SRC=${CMAKE_SOURCE_DIR}/src/version.c.in - -D DST=${CMAKE_BINARY_DIR}/version.c - -D CMD=${CMAKE_SOURCE_DIR}/get-version.sh - -P ${CMAKE_BINARY_DIR}/version.cmake -) - -## This is required if you're not building the kernel module -## TODO: Find a nicer way to avoid parent includes, -## especially the ../version.h -> version.c -> version.h cycle -FILE(GLOB COMMON_HEADER_FILES src/*.h) -FOREACH(COMMON_HEADER_FILE ${COMMON_HEADER_FILES}) - CONFIGURE_FILE(${COMMON_HEADER_FILE} ${CMAKE_BINARY_DIR} COPYONLY) -ENDFOREACH( COMMON_HEADER_FILE ) - - -################################################################################ -# CLIENT # -################################################################################ - -if(BUILD_KERNEL_MODULE) - INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}) - FILE(GLOB_RECURSE CLIENT_SRCS src/client/*.c) - ADD_EXECUTABLE(dnbd3-client ${CLIENT_SRCS}) - TARGET_LINK_LIBRARIES(dnbd3-client) - ADD_DEPENDENCIES(dnbd3-client version) - INSTALL(TARGETS dnbd3-client RUNTIME DESTINATION sbin) -ENDIF() - - -################################################################################ -# SERVER # -################################################################################ - -if(BUILD_SERVER) - IF(SERVER_FOR_AFL) - message(" ######################## Building server for AFL mode - will be useless otherwise!") - ADD_DEFINITIONS(-DAFL_MODE) - ENDIF() - INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${JANSSON_INCLUDE_DIR}) - FILE(GLOB SERVER_SRCS src/server/*.c src/shared/*.c src/server/picohttpparser/*.c) - ADD_EXECUTABLE(dnbd3-server ${SERVER_SRCS}) - TARGET_LINK_LIBRARIES(dnbd3-server ${CMAKE_THREAD_LIBS_INIT} ${JANSSON_LIBRARIES}) - if(UNIX AND NOT APPLE) - target_link_libraries(dnbd3-server rt) - endif() - ADD_DEPENDENCIES(dnbd3-server version) - INSTALL(TARGETS dnbd3-server RUNTIME DESTINATION sbin) -endif() - - - -################################################################################ -# FUSE # -################################################################################ - -if(BUILD_FUSE_CLIENT) - INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${FUSE_INCLUDE_DIR}) - FILE(GLOB FUSE_SRCS src/fuse/*.c src/shared/*.c) - ADD_EXECUTABLE(dnbd3-fuse ${FUSE_SRCS}) - TARGET_LINK_LIBRARIES(dnbd3-fuse ${CMAKE_THREAD_LIBS_INIT} ${FUSE_LIBRARIES}) - ADD_DEPENDENCIES(dnbd3-fuse version) - INSTALL(TARGETS dnbd3-fuse RUNTIME DESTINATION bin) -endif() - -################################################################################ -# STRESSTEST # -################################################################################ - -if(BUILD_STRESSTEST) - FILE(GLOB BENCH_SRCS src/bench/*.c src/shared/*.c) - ADD_EXECUTABLE(dnbd3-bench ${BENCH_SRCS}) - TARGET_LINK_LIBRARIES(dnbd3-bench ${CMAKE_THREAD_LIBS_INIT}) - ADD_DEPENDENCIES(dnbd3-bench version) - INSTALL(TARGETS dnbd3-bench RUNTIME DESTINATION bin) -endif() - -################################################################################ -# MODULE # -################################################################################ - -IF(BUILD_KERNEL_MODULE) - SET(MODULE_NAME dnbd3) - SET(MODULE_FILE ${MODULE_NAME}.ko) - FILE(GLOB MODULE_SOURCE_FILES src/kernel/*.c src/serialize.c) - FILE(GLOB MODULE_HEADER_FILES src/kernel/*.h) - - SET(KERNEL_DIR "" CACHE PATH "Path to kernel sources to compile against") - IF(KERNEL_DIR STREQUAL "") - SET(KERNEL_DIR "/lib/modules/${CMAKE_SYSTEM_VERSION}/build") - ENDIF() - - SET(KBUILD_COMMAND ${CMAKE_MAKE_PROGRAM} -C ${KERNEL_DIR} - M=${CMAKE_BINARY_DIR} modules - ) - - CONFIGURE_FILE(Kbuild.in ${CMAKE_BINARY_DIR}/Kbuild) - - FOREACH(MODULE_SOURCE_FILE ${MODULE_SOURCE_FILES}) - CONFIGURE_FILE(${MODULE_SOURCE_FILE} ${CMAKE_BINARY_DIR} COPYONLY) - ENDFOREACH( MODULE_SOURCE_FILE ) - - FOREACH(MODULE_HEADER_FILE ${MODULE_HEADER_FILES}) - CONFIGURE_FILE(${MODULE_HEADER_FILE} ${CMAKE_BINARY_DIR} COPYONLY) - ENDFOREACH( MODULE_HEADER_FILE ) - - ADD_CUSTOM_COMMAND( - OUTPUT ${CMAKE_BINARY_DIR}/${MODULE_FILE} - COMMAND ${KBUILD_COMMAND} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - DEPENDS ${MODULE_SOURCE_FILES} Kbuild.in - VERBATIM - ) - - ADD_CUSTOM_TARGET(${MODULE_NAME} ALL DEPENDS ${CMAKE_BINARY_DIR}/${MODULE_FILE}) - - INSTALL(FILES ${CMAKE_BINARY_DIR}/${MODULE_NAME}.ko - DESTINATION /lib/modules/${CMAKE_SYSTEM_VERSION}/kernel/drivers/block - PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ - ) - - INSTALL(CODE "EXECUTE_PROCESS(COMMAND depmod -a)") -ENDIF() - - -# -# Other install files -# - -FILE(GLOB conf_files "${CMAKE_CURRENT_SOURCE_DIR}/conf/*") -INSTALL(FILES ${conf_files} DESTINATION /etc/dnbd3-server/sample/) - +cmake_minimum_required(VERSION 3.10) + +# include CMake macros +set(PROJECT_MODULES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cmake) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} + ${PROJECT_MODULES_DIR}) + +# define root CMake project +project(dnbd3 + DESCRIPTION "dnbd3 Linux kernel module, server, clients and utilities" + LANGUAGES C) + +# define project options to define build configuration +OPTION(DNBD3_KERNEL_MODULE "Build the dnbd3 Linux kernel module" ON) +OPTION(DNBD3_BENCHMARK "Enable build of dnbd3-bench" OFF) +OPTION(DNBD3_CLIENT_FUSE "Enable build of dnbd3-fuse" ON) +OPTION(DNBD3_SERVER "Enable build of dnbd3-server" ON) +OPTION(DNBD3_SERVER_FUSE "Enable FUSE-Integration for dnbd3-server" OFF) +OPTION(DNBD3_SERVER_AFL "Build dnbd3-server for usage with afl-fuzz" OFF) +OPTION(DNBD3_SERVER_DEBUG_LOCKS "Add lock debugging code to dnbd3-server" OFF) +OPTION(DNBD3_SERVER_DEBUG_THREADS "Add thread debugging code to dnbd3-server" OFF) +OPTION(DNBD3_RELEASE_HARDEN "Compile dnbd3 programs in Release build with code hardening options" OFF) +OPTION(DNBD3_PACKAGE_DOCKER "Enable packaging of Docker image" OFF) + +# 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) + +# search for required packages +find_package(Git REQUIRED) +find_package(Threads REQUIRED) + +# include project version and build type related macros +include(Version) +include(Build) +include(Lint) + +# check for system and enable or disable built of Linux kernel module +if(NOT CMAKE_SYSTEM_NAME MATCHES "Linux") + # disable build of the dnbd3 Linux kernel module on a system other than Linux, eg. FreeBSD + message(STATUS "Detected non-Linux system: Disable build of the dnbd3 Linux kernel module") + set(DNBD3_KERNEL_MODULE OFF) +endif(NOT CMAKE_SYSTEM_NAME MATCHES "Linux") + +# enable or disable requirements for a built of the Linux kernel module +if(DNBD3_KERNEL_MODULE) + # require Linux kernel headers + find_package(KernelHeaders REQUIRED) + + # 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}) +endif(DNBD3_KERNEL_MODULE) + +# 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 all global header files for the linter +set(DNBD3_HEADER_FILES ${PROJECT_INCLUDE_DIR}/dnbd3/build.h.in + ${PROJECT_INCLUDE_DIR}/dnbd3/config/client.h + ${PROJECT_INCLUDE_DIR}/dnbd3/config.h + ${PROJECT_INCLUDE_DIR}/dnbd3/config/server.h + ${PROJECT_INCLUDE_DIR}/dnbd3/shared/crc32.h + ${PROJECT_INCLUDE_DIR}/dnbd3/shared/fdsignal.h + ${PROJECT_INCLUDE_DIR}/dnbd3/shared/log.h + ${PROJECT_INCLUDE_DIR}/dnbd3/shared/protocol.h + ${PROJECT_INCLUDE_DIR}/dnbd3/shared/serialize.h + ${PROJECT_INCLUDE_DIR}/dnbd3/shared/sockhelper.h + ${PROJECT_INCLUDE_DIR}/dnbd3/shared/timing.h + ${PROJECT_INCLUDE_DIR}/dnbd3/types.h + ${PROJECT_INCLUDE_DIR}/dnbd3/version.h.in) + +# add linter for header files +add_linter(dnbd3-headers-lint "${DNBD3_HEADER_FILES}") +add_linter_fix(dnbd3-headers-lint-fix "${DNBD3_HEADER_FILES}") + +# generate project version C header file from template +# exposes dnbd3-generate-version and dnbd3-version target +set(INCLUDE_VERSION_HEADER ${PROJECT_INCLUDE_DIR}/dnbd3/version.h) +set(INCLUDE_VERSION_HEADER_TEMPLATE ${PROJECT_INCLUDE_DIR}/dnbd3/version.h.in) +set(INCLUDE_VERSION_HEADER_GENERATE ${PROJECT_INCLUDE_GEN_DIR}/dnbd3/version.h) +set(INCLUDE_VERSION_HEADER_GENERATE_PREFIX ${PROJECT_INCLUDE_DIR_PREFIX}/dnbd3) +gen_project_version(${INCLUDE_VERSION_HEADER} ${INCLUDE_VERSION_HEADER_TEMPLATE} ${INCLUDE_VERSION_HEADER_GENERATE} ${GIT_EXECUTABLE} ${CMAKE_SOURCE_DIR}) + +# generate project build type C header file from template +# exposes dnbd3-generate-build and dnbd3-build target +set(INCLUDE_BUILD_HEADER_TEMPLATE ${PROJECT_INCLUDE_DIR}/dnbd3/build.h.in) +set(INCLUDE_BUILD_HEADER_GENERATE ${PROJECT_INCLUDE_GEN_DIR}/dnbd3/build.h) +gen_build_type(${INCLUDE_BUILD_HEADER_TEMPLATE} ${INCLUDE_BUILD_HEADER_GENERATE}) + +# add compile option to handle files greater than 2GB on a 32bit system +add_definitions(-D_FILE_OFFSET_BITS=64) + +# define global C flags for compilation +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11") + +# enable all error warnings in Debug build configuration +set(CMAKE_C_FLAGS_DEBUG "-Wall -Wextra -Wpedantic -Wconversion -Wformat -Wformat-security -Werror=format-security -Wno-sign-conversion") +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") + +if(DNBD3_RELEASE_HARDEN AND CMAKE_BUILD_TYPE MATCHES "Release") + # harden builds with specific C flags + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D_FORTIFY_SOURCE=2 -fstack-protector-all -fstack-clash-protection") + # set specific hardened linker flags + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now,-z,defs -pie") + # print status message of configuration + message(STATUS "Set compilation of DNBD3 with hardened code options - done") +else(DNBD3_RELEASE_HARDEN AND CMAKE_BUILD_TYPE MATCHES "Release") + # print status message of disabled configuration + message(STATUS "Disabled compilation of dnbd3 with hardened code options - done") +endif(DNBD3_RELEASE_HARDEN AND CMAKE_BUILD_TYPE MATCHES "Release") + +# define packaging if Release build is enabled +if(CMAKE_BUILD_TYPE MATCHES Release) + # get version source package or Git repository + get_repository_version(REPOSITORY_VERSION REPOSITORY_VERSION_SHORT REPOSITORY_BRANCH ${INCLUDE_VERSION_HEADER} ${CMAKE_BUILD_TYPE} ${GIT_EXECUTABLE} ${CMAKE_SOURCE_DIR}) + + # define project version + if(KernelHeaders_VERSION) + set(REPOSITORY_VERSION_FULL ${REPOSITORY_VERSION}-${KernelHeaders_VERSION}) + else(KernelHeaders_VERSION) + set(REPOSITORY_VERSION_FULL ${REPOSITORY_VERSION}) + endif(KernelHeaders_VERSION) + + set(CPACK_GENERATOR "DEB;RPM;TGZ") + set(CPACK_PACKAGE_NAME ${CMAKE_PROJECT_NAME}) + set(CPACK_MONOLITHIC_INSTALL True) + 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://github.com/bwLehrpool/dnbd3") + set(CPACK_PACKAGE_CHECKSUM SHA256) + 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 "libc6, libfuse2, libjansson4, libatomic1") + if(DNBD3_KERNEL_MODULE) + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/package/deb/postinst "depmod -a\n") + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/package/deb/postrm "depmod -a\n") + set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA ${CMAKE_CURRENT_BINARY_DIR}/package/deb/postinst + ${CMAKE_CURRENT_BINARY_DIR}/package/deb/postrm) + endif(DNBD3_KERNEL_MODULE) + + # set RPM generator specific packaging options + set(CPACK_RPM_PACKAGE_REQUIRES "glibc, fuse-libs, jansson, libatomic") + set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/lib" + "/lib/modules" + "/lib/modules/${CMAKE_SYSTEM_VERSION}" + "/lib/modules/${CMAKE_SYSTEM_VERSION}/extra" + "/etc" + "/usr" + "/usr/lib" + "/usr/lib/systemd" + "/usr/lib/systemd/system") + if(DNBD3_KERNEL_MODULE) + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/package/rpm/post "depmod -a\n") + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/package/rpm/postun "depmod -a\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(DNBD3_KERNEL_MODULE) + + # 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/" + "/.github/" + ".gitignore" + "version.h.in") + + # include CPack functionality + include(CPack) + + # prepare source packaging + add_custom_command(OUTPUT ${INCLUDE_VERSION_HEADER} + COMMAND ${CMAKE_COMMAND} -D VERSION_HEADER_INPUT_FILE=${INCLUDE_VERSION_HEADER_GENERATE} + -D VERSION_HEADER_OUTPUT_FILE=${INCLUDE_VERSION_HEADER} + -P ${PROJECT_MODULES_DIR}/PreVersionPackaging.cmake + COMMENT "Prepare version.h" + DEPENDS dnbd3-generate-version) + + # main source packaging + add_custom_target(package_source_main + COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target package_source + DEPENDS ${INCLUDE_VERSION_HEADER} + VERBATIM + USES_TERMINAL) + + # post source packaging and exported target to build source packages + add_custom_target(source + COMMAND ${CMAKE_COMMAND} -D VERSION_HEADER_INPUT_FILE=${INCLUDE_VERSION_HEADER_GENERATE} + -D VERSION_HEADER_OUTPUT_FILE=${INCLUDE_VERSION_HEADER} + -P ${PROJECT_MODULES_DIR}/PostVersionPackaging.cmake + COMMENT "Cleanup version.h" + DEPENDS package_source_main) + + # include target to make docker image + if(NOT DNBD3_KERNEL_MODULE AND DNBD3_SERVER AND DNBD3_PACKAGE_DOCKER) + find_package(Docker REQUIRED) + include(DockerImage) + + set(DOCKER_TAG ${CPACK_PACKAGE_NAME}:${REPOSITORY_VERSION_SHORT}) + + # define Ubuntu docker image + set(DOCKER_FILE_UBUNTU ${CMAKE_SOURCE_DIR}/pkg/docker/ubuntu-20-04_dockerfile) + set(PACKAGE_FILE_UBUNTU ${CPACK_PACKAGE_NAME}_${REPOSITORY_VERSION_FULL}_${CMAKE_SYSTEM_PROCESSOR}.deb) + set(DOCKER_IMAGE_UBUNTU ${CPACK_PACKAGE_NAME}_${REPOSITORY_VERSION_FULL}_${CMAKE_SYSTEM_PROCESSOR}_ubuntu-20-04_docker.tar) + add_docker_image(docker-ubuntu-20-04 ${DOCKER_IMAGE_UBUNTU} ${DOCKER_FILE_UBUNTU} ${DOCKER_TAG} ${PACKAGE_FILE_UBUNTU} ${CMAKE_BINARY_DIR}) + + # define Archlinux docker image + set(DOCKER_FILE_ARCHLINUX ${CMAKE_SOURCE_DIR}/pkg/docker/archlinux_dockerfile) + set(PACKAGE_FILE_ARCHLINUX ${CPACK_PACKAGE_NAME}_${REPOSITORY_VERSION_FULL}_${CMAKE_SYSTEM_PROCESSOR}.tar.gz) + set(DOCKER_IMAGE_ARCHLINUX ${CPACK_PACKAGE_NAME}_${REPOSITORY_VERSION_FULL}_${CMAKE_SYSTEM_PROCESSOR}_archlinux_docker.tar) + add_docker_image(docker-archlinux ${DOCKER_IMAGE_ARCHLINUX} ${DOCKER_FILE_ARCHLINUX} ${DOCKER_TAG} ${PACKAGE_FILE_ARCHLINUX} ${CMAKE_BINARY_DIR}) + endif(NOT DNBD3_KERNEL_MODULE AND DNBD3_SERVER AND DNBD3_PACKAGE_DOCKER) +endif(CMAKE_BUILD_TYPE MATCHES Release) + +# add all dnbd3 related projects from the source code directory +add_subdirectory(src) + +# add configuration and operational files for packaging purposes +add_subdirectory(pkg) |