-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
162 lines (139 loc) · 5.01 KB
/
Copy pathCMakeLists.txt
File metadata and controls
162 lines (139 loc) · 5.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
cmake_minimum_required(VERSION 3.25)
project(nova_memoryresource VERSION 0.1.0 LANGUAGES CXX C)
if (NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 20)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if (PROJECT_IS_TOP_LEVEL AND NOT CMAKE_MSVC_DEBUG_INFORMATION_FORMAT)
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "Embedded")
endif()
if(PROJECT_IS_TOP_LEVEL)
add_custom_target(nova_memoryresource_project_files SOURCES
.clang-tidy
.pre-commit-config.yaml
_clang-format
README.md
LICENSE
.github/workflows/ci.yml
)
endif()
function(nova_mr_install_pmr)
if (NOT COMMAND CPMAddPackage)
set(CPM_DOWNLOAD_VERSION 0.42.3)
if(NOT EXISTS "${CMAKE_BINARY_DIR}/cmake/CPM.cmake")
message(STATUS "Downloading CPM.cmake ${CPM_DOWNLOAD_VERSION}...")
file(DOWNLOAD
"https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake"
"${CMAKE_BINARY_DIR}/cmake/CPM.cmake"
)
endif()
include("${CMAKE_BINARY_DIR}/cmake/CPM.cmake")
endif()
endfunction()
# Configuration options
option(NOVA_MR_TLSF "Enable TLSF memory resource" ON)
option(NOVA_MR_MIMALLOC "Enable mimalloc memory resource" ON)
set(NOVA_MR_MIMALLOC_TARGET "mimalloc-static" CACHE STRING "Target name for mimalloc to link against")
# Dependencies
if (NOVA_MR_MIMALLOC AND NOT TARGET ${NOVA_MR_MIMALLOC_TARGET})
nova_mr_install_pmr()
CPMAddPackage(
NAME mimalloc
GITHUB_REPOSITORY microsoft/mimalloc
VERSION 3.3.2
OPTIONS "MI_OVERRIDE OFF"
"MI_BUILD_TESTS OFF"
"MI_BUILD_SHARED OFF"
"MI_BUILD_OBJECT OFF"
)
endif()
if (NOVA_MR_TLSF AND NOT TARGET tlsf)
nova_mr_install_pmr()
CPMAddPackage(
NAME tlsf
GITHUB_REPOSITORY mattconte/tlsf
GIT_TAG master
DOWNLOAD_ONLY YES
)
if (tlsf_ADDED)
add_library(tlsf STATIC "${tlsf_SOURCE_DIR}/tlsf.c" "${tlsf_SOURCE_DIR}/tlsf.h")
target_include_directories(tlsf PUBLIC
$<BUILD_INTERFACE:${tlsf_SOURCE_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
set_target_properties(tlsf PROPERTIES C_STANDARD 99)
install(TARGETS tlsf EXPORT nova_memoryresourceTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
install(FILES "${tlsf_SOURCE_DIR}/tlsf.h" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
endif()
endif()
if (NOT TARGET nova::parameter)
nova_mr_install_pmr()
CPMAddPackage(
NAME nova_parameter
GITHUB_REPOSITORY timblechmann/nova_parameter
VERSION 0.9
)
endif()
add_library(nova_memoryresource INTERFACE)
add_library(nova::memoryresource ALIAS nova_memoryresource)
target_link_libraries(nova_memoryresource INTERFACE nova::parameter)
target_sources(nova_memoryresource PUBLIC FILE_SET HEADERS BASE_DIRS include)
target_sources(nova_memoryresource PUBLIC FILE_SET HEADERS FILES
include/nova/pmr/detail/memlock.hpp
include/nova/pmr/policies.hpp
include/nova/pmr/static_monotonic_buffer_resource.hpp
)
if (NOVA_MR_MIMALLOC)
target_sources(nova_memoryresource PUBLIC FILE_SET HEADERS FILES include/nova/pmr/mimalloc_memory_resource.hpp)
target_link_libraries(nova_memoryresource INTERFACE ${NOVA_MR_MIMALLOC_TARGET})
target_compile_definitions(nova_memoryresource INTERFACE NOVA_MR_HAS_MIMALLOC=1)
endif()
if (NOVA_MR_TLSF)
target_sources(nova_memoryresource PUBLIC FILE_SET HEADERS FILES
include/nova/pmr/tlsf_memory_resource.hpp
)
target_link_libraries(nova_memoryresource INTERFACE tlsf)
target_compile_definitions(nova_memoryresource INTERFACE NOVA_MR_HAS_TLSF=1)
endif()
target_include_directories(nova_memoryresource INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# Testing
option(NOVA_BUILD_TESTS "Build unit tests" ON)
if(NOVA_BUILD_TESTS)
if (NOT TARGET Catch2::Catch2WithMain)
nova_mr_install_pmr()
block()
set(CMAKE_UNITY_BUILD ON)
CPMAddPackage(
NAME Catch2
GITHUB_REPOSITORY catchorg/Catch2
VERSION 3.15.1
)
endblock()
list(APPEND CMAKE_MODULE_PATH ${Catch2_SOURCE_DIR}/extras)
endif()
include(Catch)
add_executable(nova_memoryresource_tests
tests/test_memory_resource.cpp
)
target_link_libraries(nova_memoryresource_tests PRIVATE nova::memoryresource Catch2::Catch2WithMain)
enable_testing()
catch_discover_tests(nova_memoryresource_tests)
endif()
# Installation
include(GNUInstallDirs)
install(TARGETS nova_memoryresource
EXPORT nova_memoryresourceTargets
FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
install(EXPORT nova_memoryresourceTargets
FILE nova_memoryresourceTargets.cmake
NAMESPACE nova::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/nova_memoryresource
)