-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
149 lines (122 loc) · 4.9 KB
/
CMakeLists.txt
File metadata and controls
149 lines (122 loc) · 4.9 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
cmake_minimum_required(VERSION 3.14)
project(c89atomic VERSION 1.0)
# Options
option(C89ATOMIC_BUILD_EXAMPLES "Build c89atomic examples" OFF)
option(C89ATOMIC_BUILD_TESTS "Build c89atomic tests" OFF)
option(C89ATOMIC_BUILD_TOOLS "Build c89atomic tools" OFF)
option(C89ATOMIC_FORCE_CXX "Force compilation as C++" OFF)
option(C89ATOMIC_FORCE_C89 "Force compilation as C89" OFF)
option(C89ATOMIC_MODERN_GCC "Force the modern GCC code path" OFF)
option(C89ATOMIC_LEGACY_GCC "Force the legacy GCC code path" OFF)
option(C89ATOMIC_LEGACY_GCC_ASM "Force the legacy GCC ASM code path" OFF)
option(C89ATOMIC_MODERN_MSVC "Force the modern MSVC code path" OFF)
option(C89ATOMIC_LEGACY_MSVC "Force the legacy MSVC code path" OFF)
option(C89ATOMIC_LEGACY_MSVC_ASM "Force the legacy MSVC ASM code path" OFF)
# Construct compiler options.
set(COMPILE_OPTIONS)
if(C89ATOMIC_FORCE_CXX AND C89ATOMIC_FORCE_C89)
message(FATAL_ERROR "C89ATOMIC_FORCE_CXX and C89ATOMIC_FORCE_C89 cannot be enabled at the same time.")
endif()
if(C89ATOMIC_FORCE_CXX)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
message(STATUS "Compiling as C++ (GNU/Clang)")
list(APPEND COMPILE_OPTIONS -x c++)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
message(STATUS "Compiling as C++ (MSVC)")
list(APPEND COMPILE_OPTIONS /TP)
else()
message(WARNING "C89ATOMIC_FORCE_CXX is enabled but the compiler does not support it. Ignoring.")
endif()
endif()
if(C89ATOMIC_FORCE_C89)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
message(STATUS "Compiling as C89")
list(APPEND COMPILE_OPTIONS -std=c89)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
message(WARNING "MSVC does not support forcing C89. C89ATOMIC_FORCE_C89 ignored.")
else()
message(WARNING "C89ATOMIC_FORCE_C89 is enabled but the compiler does not support it. Ignoring.")
endif()
endif()
# Warnings
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
list(APPEND COMPILE_OPTIONS -Wall -Wextra -pedantic)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
#list(APPEND COMPILE_OPTIONS /W4)
endif()
# Some options are incompatible depending on the compiler.
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(C89ATOMIC_MODERN_MSVC OFF)
set(C89ATOMIC_LEGACY_MSVC OFF)
set(C89ATOMIC_LEGACY_MSVC_ASM OFF)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
set(C89ATOMIC_MODERN_GCC OFF)
set(C89ATOMIC_LEGACY_GCC OFF)
set(C89ATOMIC_LEGACY_GCC_ASM OFF)
endif()
# Construct compiler defines
set(COMPILE_DEFINES)
if(C89ATOMIC_MODERN_GCC)
list(APPEND COMPILE_DEFINES C89ATOMIC_MODERN_GCC)
endif()
if(C89ATOMIC_LEGACY_GCC)
list(APPEND COMPILE_DEFINES C89ATOMIC_LEGACY_GCC)
endif()
if(C89ATOMIC_LEGACY_GCC_ASM)
list(APPEND COMPILE_DEFINES C89ATOMIC_LEGACY_GCC_ASM)
endif()
if(C89ATOMIC_MODERN_MSVC)
list(APPEND COMPILE_DEFINES C89ATOMIC_MODERN_MSVC)
endif()
if(C89ATOMIC_LEGACY_MSVC)
list(APPEND COMPILE_DEFINES C89ATOMIC_LEGACY_MSVC)
endif()
if(C89ATOMIC_LEGACY_MSVC_ASM)
list(APPEND COMPILE_DEFINES C89ATOMIC_LEGACY_MSVC_ASM)
endif()
# Link libraries
set(COMMON_LINK_LIBRARIES)
if (UNIX)
if(NOT MINGW AND NOT MSYS AND NOT CYGWIN)
find_library(LIB_ATOMIC NAMES atomic)
if(LIB_ATOMIC)
list(APPEND COMMON_LINK_LIBRARIES ${LIB_ATOMIC})
endif()
find_library(LIB_PTHREAD NAMES pthread)
if(LIB_PTHREAD)
list(APPEND COMMON_LINK_LIBRARIES ${LIB_PTHREAD})
endif()
endif()
endif()
# Common interface
add_library(c89atomic_common INTERFACE)
target_compile_options (c89atomic_common INTERFACE ${COMPILE_OPTIONS})
target_link_libraries (c89atomic_common INTERFACE ${COMMON_LINK_LIBRARIES})
target_compile_definitions(c89atomic_common INTERFACE ${COMPILE_DEFINES})
# Main library
add_library(c89atomic STATIC
c89atomic.c
c89atomic.h
)
target_include_directories(c89atomic PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/>
$<INSTALL_INTERFACE:/>
)
target_link_libraries(c89atomic PRIVATE c89atomic_common)
# Ring Buffer
add_library(c89atomic_ring_buffer STATIC
extras/c89atomic_ring_buffer.c
extras/c89atomic_ring_buffer.h
)
target_include_directories(c89atomic_ring_buffer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/extras)
target_link_libraries (c89atomic_ring_buffer PRIVATE c89atomic_common)
# Tests
if(C89ATOMIC_BUILD_TESTS)
enable_testing()
add_executable(c89atomic_basic tests/c89atomic_basic.c)
target_link_libraries(c89atomic_basic PRIVATE c89atomic)
#add_test(NAME c89atomic_basic COMMAND c89atomic_basic)
# sandbox. Don't add a test for this.
#add_executable(c89atomic_sandbox tests/c89atomic_sandbox.c)
#target_link_libraries(c89atomic_sandbox PRIVATE c89atomic)
endif()