# Low Latency IPC Library for high-speed traffic # Copyright (C) 2019 Michael Fabian Dirks # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . ################################################################################ # CMake Bootstrap ################################################################################ # CMake Setup cmake_minimum_required(VERSION 3.1.0) ################################################################################ # Project Bootstrap ################################################################################ # Automatic Versioning set(VERSION_MAJOR 0) set(VERSION_MINOR 1) set(VERSION_PATCH 0) set(VERSION_TWEAK 0) set(PROJECT_COMMIT "N/A") if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git") set(GIT_RESULT "") set(GIT_OUTPUT "") execute_process( COMMAND git rev-list --count --topo-order ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}..HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE GIT_RESULT OUTPUT_VARIABLE GIT_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET ) if(GIT_RESULT EQUAL 0) set(VERSION_TWEAK ${GIT_OUTPUT}) endif() execute_process( COMMAND git rev-parse HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE GIT_RESULT OUTPUT_VARIABLE GIT_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET ) if(GIT_RESULT EQUAL 0) set(PROJECT_COMMIT ${GIT_OUTPUT}) endif() endif() # Define Project project( datapath VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK} ) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake/modules/") # Check if we are compiling standalone set(IsStandalone false) if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) set(IsStandalone true) endif() # Modules include("util") if(IsStandalone) include("cppcheck") endif() # Detect Build Type if(IsStandalone) set(PropertyPrefix "") else() set(PropertyPrefix "${PROJECT_NAME}_") endif() # Detect Architecture math(EXPR BITS "8*${CMAKE_SIZEOF_VOID_P}") if("${BITS}" STREQUAL "32") set(ARCH "x86") else() set(ARCH "x64") endif() # Configure Version Header configure_file( "${PROJECT_SOURCE_DIR}/cmake/version.hpp.in" "${PROJECT_BINARY_DIR}/include/version.hpp" ) ################################################################################ # Options ################################################################################ # Static or Dynamic? option(${OPTIONPREFIX}MAKE_STATIC "Make Static Library" ON) option(${OPTIONPREFIX}MAKE_DYNAMIC "Make Dynamic Library" OFF) option(${OPTIONPREFIX}MAKE_MODULE "Make Module Library" OFF) # Tests & Samples option(${PropertyPrefix}BUILD_TESTS "Build Tests" ON) option(${PropertyPrefix}BUILD_SAMPLES "Build Samples" ON) if(!IsStandalone) CacheSet("${PropertyPrefix}BUILD_TESTS" OFF) CacheSet("${PropertyPrefix}BUILD_SAMPLES" OFF) endif() ################################################################################ # Source ################################################################################ # Public (exported with module) set(PROJECT_PUBLIC "include/bitmask.hpp" "include/datapath.hpp" "include/error.hpp" "include/event.hpp" "include/isocket.hpp" "include/iserver.hpp" "include/itask.hpp" "include/waitable.hpp" "include/permissions.hpp" ) set(PROJECT_PUBLIC_GENERATED "${PROJECT_BINARY_DIR}/include/version.hpp" ) set(PROJECT_DATA "README.md" "LICENSE" ) # Private (only compiled/used locally) set(PROJECT_PRIVATE "source/datapath.cpp" ) # Libraries set(PROJECT_LIBRARIES ) # Defines set(PROJECT_DEFINES ) # Platforms if(WIN32) # Windows list(APPEND PROJECT_LIBRARIES advapi32 ) list(APPEND PROJECT_DEFINES _CRT_SECURE_NO_WARNINGS WIN32_LEAN_AND_MEAN NOGPICAPMASKS NOVIRTUALKEYCODES NOWINMESSAGES NOWINSTYLES NOSYSMETRICS NOMENUS NOICONS NOKEYSTATES NOSYSCOMMANDS NORASTEROPS NOSHOWWINDOW NOATOM NOCLIPBOARD NOCOLOR NOCTLMGR NODRAWTEXT NOGDI NOKERNEL #NOUSER #NONLS NOMB NOMEMMGR NOMETAFILE NOMINMAX NOMSG NOOPENFILE NOSCROLL NOSERVICE NOSOUND NOTEXTMETRIC NOWH NOWINOFFSETS NOCOMM NOKANJI NOHELP NOPROFILER NODEFERWINDOWPOS NOMCX NOIME NOMDI NOINOUT ) list(APPEND PROJECT_PRIVATE "source/windows/overlapped.hpp" "source/windows/overlapped.cpp" "source/windows/socket.hpp" "source/windows/socket.cpp" "source/windows/server.hpp" "source/windows/server.cpp" "source/windows/task.hpp" "source/windows/task.cpp" "source/windows/utility.hpp" "source/windows/waitable.cpp" ) elseif(APPLE) # MacOSX list(APPEND PROJECT_PRIVATE ) elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") # Linux list(APPEND PROJECT_PRIVATE ) elseif("${CMAKE_SYSTEM_NAME}" MATCHES "FreeBSD") # FreeBSD list(APPEND PROJECT_PRIVATE ) endif() # Grouping source_group("Data Files" FILES $PROJECT_DATA) source_group(TREE "${PROJECT_SOURCE_DIR}/source" PREFIX "Source" FILES ${PROJECT_PRIVATE}) source_group(TREE "${PROJECT_SOURCE_DIR}/include" PREFIX "Include" FILES ${PROJECT_PUBLIC}) source_group(TREE "${PROJECT_BINARY_DIR}" PREFIX "Generated" FILES ${PROJECT_PUBLIC_GENERATED}) ################################################################################ # Building ################################################################################ # Library definition if(${OPTIONPREFIX}MAKE_STATIC) add_library(${PROJECT_NAME} STATIC ${PROJECT_PRIVATE} ${PROJECT_PUBLIC} ${PROJECT_PUBLIC_GENERATED} ${PROJECT_DATA} ) elseif(${PropertyPrefix}MAKE_DYNAMIC) add_library(${PROJECT_NAME} SHARED ${PROJECT_PRIVATE} ${PROJECT_PUBLIC} ${PROJECT_PUBLIC_GENERATED} ${PROJECT_DATA} ) elseif(${OPTIONPREFIX}MAKE_MODULE) add_library(${PROJECT_NAME} MODULE ${PROJECT_PRIVATE} ${PROJECT_PUBLIC} ${PROJECT_PUBLIC_GENERATED} ${PROJECT_DATA} ) else() message(CRITICAL "Building nothing completed, aborting. Check MAKE_STATIC, MAKE_DYNAMIC and MAKE_DYNAMIC.") return() endif() # Includes target_include_directories(${PROJECT_NAME} PRIVATE source PUBLIC include ) # Defines target_compile_definitions(${PROJECT_NAME} PRIVATE ${PROJECT_DEFINES} ) # Linking Directories link_directories( ) # Linking target_link_libraries(${PROJECT_NAME} ${PROJECT_LIBRARIES} ) # File Version if(WIN32) set_target_properties( ${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK} SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK} ) else() set_target_properties( ${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK} SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK} ) endif() # CPPCheck if(IsStandalone) cppcheck() cppcheck_add_project(${PROJECT_NAME}) endif() ################################################################################ # Samples ################################################################################ if(${PropertyPrefix}BUILD_SAMPLES) add_subdirectory(${PROJECT_SOURCE_DIR}/samples) endif() ################################################################################ # Tests ################################################################################ if(${PropertyPrefix}BUILD_TESTS) add_subdirectory(${PROJECT_SOURCE_DIR}/tests) endif()