Files
DataPath/CMakeLists.txt
T

327 lines
8.3 KiB
CMake
Raw Normal View History

2019-01-06 11:11:21 +01:00
# Low Latency IPC Library for high-speed traffic
2019-01-06 11:17:01 +01:00
# Copyright (C) 2019 Michael Fabian Dirks <info@xaymar.com>
2019-01-06 11:11:21 +01:00
#
# 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 <https://www.gnu.org/licenses/>.
2020-01-23 01:12:06 +01:00
#================================================================================#
# Define Project
#================================================================================#
cmake_minimum_required(VERSION 3.15.0)
2019-01-06 11:11:21 +01:00
# 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(
2020-01-23 02:16:21 +01:00
datapath
2019-01-06 11:11:21 +01:00
VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}
)
2020-01-23 01:12:06 +01:00
set(PROJECT_FULL_NAME "DataPath IPC Library")
set(PROJECT_DESCRIPTION "High Performance Synchronous and Asynchronous IPC Library")
set(PROJECT_AUTHORS "Michael Fabian 'Xaymar' Dirks <info@xaymar.com>")
set(PROJECT_COPYRIGHT_YEARS "2018 - 2020")
2019-01-06 11:11:21 +01:00
2020-01-23 01:12:06 +01:00
#================================================================================#
# CMake Tools & Modules
#================================================================================#
# CMake Modules
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/clang")
2019-01-06 11:11:21 +01:00
include("util")
2020-01-23 01:12:06 +01:00
include("Clang")
2019-01-06 11:11:21 +01:00
# Detect Build Type
2020-01-23 01:12:06 +01:00
if(NOT "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
2019-01-06 11:11:21 +01:00
set(PropertyPrefix "${PROJECT_NAME}_")
2020-01-23 01:12:06 +01:00
else()
set(PropertyPrefix "")
2019-01-06 11:11:21 +01:00
endif()
# Detect Architecture
math(EXPR BITS "8*${CMAKE_SIZEOF_VOID_P}")
if("${BITS}" STREQUAL "32")
set(ARCH "x86")
else()
set(ARCH "x64")
endif()
2020-01-23 01:12:06 +01:00
#================================================================================#
2019-01-06 11:11:21 +01:00
# Options
2020-01-23 01:12:06 +01:00
#================================================================================#
2019-01-06 11:11:21 +01:00
# Static or Dynamic?
2020-01-23 01:51:15 +01:00
option(${PropertyPrefix}MAKE_DYNAMIC "Create dynamically linked library instead of static library." OFF)
option(${PropertyPrefix}MAKE_MODULE "Create dynamically linked module instead of dynamically linked library." OFF)
option(${PropertyPrefix}BUILD_SAMPLES "Build Samples" ON)
2019-01-06 11:11:21 +01:00
2020-01-23 01:12:06 +01:00
#================================================================================#
# Sources
2020-01-23 01:51:15 +01:00
#================================================================================#
2019-01-06 11:11:21 +01:00
2020-01-23 01:12:06 +01:00
# Configure Version Header
configure_file(
"${PROJECT_SOURCE_DIR}/cmake/version.hpp.in"
2020-01-23 01:51:15 +01:00
"${PROJECT_BINARY_DIR}/generated/version.hpp"
2020-01-23 01:12:06 +01:00
)
2020-01-23 01:51:15 +01:00
# Source Files
set(PROJECT_PUBLIC "")
list(APPEND PROJECT_PUBLIC
2019-01-06 11:11:21 +01:00
"include/datapath.hpp"
"include/error.hpp"
2020-01-23 01:51:15 +01:00
"include/bitmask.hpp"
2019-01-06 11:11:21 +01:00
"include/event.hpp"
"include/isocket.hpp"
"include/iserver.hpp"
"include/itask.hpp"
"include/waitable.hpp"
"include/permissions.hpp"
2019-04-11 17:00:40 +02:00
"include/threadpool.hpp"
2019-01-06 11:11:21 +01:00
)
2020-01-23 01:51:15 +01:00
set(PROJECT_PRIVATE "")
list(APPEND PROJECT_PRIVATE
"source/threadpool.cpp"
2019-01-06 11:11:21 +01:00
)
2020-01-23 01:51:15 +01:00
set(PROJECT_TEMPLATES "")
list(APPEND PROJECT_TEMPLATES
"${PROJECT_SOURCE_DIR}/cmake/version.hpp.in"
2019-01-06 11:11:21 +01:00
)
2020-01-23 01:51:15 +01:00
set(PROJECT_GENERATED "")
list(APPEND PROJECT_GENERATED
"${PROJECT_BINARY_DIR}/generated/version.hpp"
2019-01-06 11:11:21 +01:00
)
2020-01-23 01:51:15 +01:00
set(PROJECT_DATA "")
list(APPEND PROJECT_DATA
"README.md"
"LICENSE"
2019-01-06 11:11:21 +01:00
)
2020-01-23 01:51:15 +01:00
set(PROJECT_LIBRARIES "")
set(PROJECT_DEFINES "")
2019-01-06 11:11:21 +01:00
# Platforms
if(WIN32)
# Windows
list(APPEND PROJECT_LIBRARIES
advapi32
)
list(APPEND PROJECT_DEFINES
_CRT_SECURE_NO_WARNINGS
2020-01-23 01:51:15 +01:00
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
2019-01-06 11:11:21 +01:00
)
list(APPEND PROJECT_PRIVATE
2019-04-11 01:43:17 +02:00
"source/windows/datapath.cpp"
2019-01-06 11:11:21 +01:00
"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
2020-01-23 01:51:15 +01:00
source_group(TREE "${PROJECT_SOURCE_DIR}" PREFIX "Data Files" FILES ${PROJECT_DATA})
source_group(TREE "${PROJECT_SOURCE_DIR}/cmake" PREFIX "Template Files" FILES ${PROJECT_TEMPLATES})
source_group(TREE "${PROJECT_BINARY_DIR}/generated" PREFIX "Generated Files" FILES ${PROJECT_GENERATED})
source_group(TREE "${PROJECT_SOURCE_DIR}/include" PREFIX "Exported Files" FILES ${PROJECT_PUBLIC})
# Filter Sources
set(_TMP_SOURCE ${PROJECT_PRIVATE})
list(FILTER _TMP_SOURCE INCLUDE REGEX "\.(c|cpp)$")
source_group(TREE "${PROJECT_SOURCE_DIR}/source" PREFIX "Source Files" FILES ${_TMP_SOURCE})
# Filter Headers
set(_TMP_HEADER ${PROJECT_PRIVATE})
list(FILTER _TMP_HEADER INCLUDE REGEX "\.(h|hpp)$")
source_group(TREE "${PROJECT_SOURCE_DIR}/source" PREFIX "Header Files" FILES ${_TMP_HEADER})
2019-01-06 11:11:21 +01:00
2020-01-23 01:12:06 +01:00
#================================================================================#
2019-01-06 11:11:21 +01:00
# Building
2020-01-23 01:12:06 +01:00
#================================================================================#
2020-01-23 01:51:15 +01:00
2019-01-06 11:11:21 +01:00
# Library definition
2020-01-23 01:51:15 +01:00
set(_BUILD_TYPE)
if(${PropertyPrefix}MAKE_DYNAMIC)
if(${PropertyPrefix}MAKE_MODULE)
set(_BUILD_TYPE MODULE)
else()
set(_BUILD_TYPE SHARED)
endif()
2019-01-06 11:11:21 +01:00
else()
2020-01-23 01:51:15 +01:00
set(_BUILD_TYPE STATIC)
endif()
add_library(${PROJECT_NAME} ${_BUILD_TYPE}
${PROJECT_PUBLIC}
${PROJECT_PRIVATE}
${PROJECT_GENERATED}
${PROJECT_TEMPLATES}
${PROJECT_DATA}
)
# Clang
if("${PropertyPrefix}" STREQUAL "")
clang_format(
TARGETS ${PROJECT_NAME}
DEPENDENCY
VERSION 9.0.0
)
2019-01-06 11:11:21 +01:00
endif()
# Includes
target_include_directories(${PROJECT_NAME}
2020-01-23 02:16:21 +01:00
INTERFACE
"${PROJECT_SOURCE_DIR}/include"
PUBLIC
"${PROJECT_SOURCE_DIR}/include"
PRIVATE
"${PROJECT_SOURCE_DIR}/source"
2019-01-06 11:11:21 +01:00
)
# 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()
2020-01-23 01:51:15 +01:00
#================================================================================#
2019-01-06 11:11:21 +01:00
# Samples
2020-01-23 01:51:15 +01:00
#================================================================================#
2019-01-06 11:11:21 +01:00
if(${PropertyPrefix}BUILD_SAMPLES)
add_subdirectory(${PROJECT_SOURCE_DIR}/samples)
endif()