forked from Amanieu/asyncplusplus
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathCMakeLists.txt
131 lines (121 loc) · 5.51 KB
/
CMakeLists.txt
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
# Copyright (c) 2015 Amanieu d'Antras
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
cmake_minimum_required(VERSION 3.1)
project(Async C CXX)
option(BUILD_SHARED_LIBS "Build Async as a shared library" ON)
option(USE_CXX_EXCEPTIONS "Enable C exception support" ON)
if (APPLE)
option(BUILD_FRAMEWORK "Build a Mac OS X framework instead of a library" OFF)
if (BUILD_FRAMEWORK AND NOT BUILD_SHARED_LIBS)
message(FATAL_ERROR "Can't build a framework with static libraries")
endif()
endif()
# Add all source and header files so IDEs can see them
set(ASYNCXX_INCLUDE
${PROJECT_SOURCE_DIR}/include/async /aligned_alloc.h
${PROJECT_SOURCE_DIR}/include/async /cancel.h
${PROJECT_SOURCE_DIR}/include/async /continuation_vector.h
${PROJECT_SOURCE_DIR}/include/async /parallel_for.h
${PROJECT_SOURCE_DIR}/include/async /parallel_invoke.h
${PROJECT_SOURCE_DIR}/include/async /parallel_reduce.h
${PROJECT_SOURCE_DIR}/include/async /partitioner.h
${PROJECT_SOURCE_DIR}/include/async /range.h
${PROJECT_SOURCE_DIR}/include/async /ref_count.h
${PROJECT_SOURCE_DIR}/include/async /scheduler.h
${PROJECT_SOURCE_DIR}/include/async /scheduler_fwd.h
${PROJECT_SOURCE_DIR}/include/async /task.h
${PROJECT_SOURCE_DIR}/include/async /task_base.h
${PROJECT_SOURCE_DIR}/include/async /traits.h
${PROJECT_SOURCE_DIR}/include/async /when_all_any.h
)
set(ASYNCXX_SRC
${PROJECT_SOURCE_DIR}/src/internal.h
${PROJECT_SOURCE_DIR}/src/fifo_queue.h
${PROJECT_SOURCE_DIR}/src/scheduler.cpp
${PROJECT_SOURCE_DIR}/src/singleton.h
${PROJECT_SOURCE_DIR}/src/task_wait_event.h
${PROJECT_SOURCE_DIR}/src/threadpool_scheduler.cpp
${PROJECT_SOURCE_DIR}/src/work_steal_queue.h
)
source_group(include FILES ${PROJECT_SOURCE_DIR}/include/async .h ${ASYNCXX_INCLUDE})
source_group(src FILES ${ASYNCXX_SRC})
add_library(Async ${PROJECT_SOURCE_DIR}/include/async .h ${ASYNCXX_INCLUDE} ${ASYNCXX_SRC})
# Async only depends on the C 11 standard libraries, but some implementations
# require the -pthread compiler flag to enable threading functionality.
if (NOT MSVC)
target_compile_options(Async PRIVATE -std=c 11)
endif()
if (APPLE)
# Use libc on Mac because the shipped libstdc version is ancient
target_compile_options(Async PRIVATE -stdlib=libc )
set_target_properties(Async PROPERTIES LINK_FLAGS -stdlib=libc )
endif()
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(Async PUBLIC Threads::Threads)
# Minimize the set of symbols exported by libraries
set_target_properties(Async PROPERTIES CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN ON)
# Set up preprocessor definitions
target_include_directories(Async PRIVATE ${PROJECT_SOURCE_DIR}/include)
set_target_properties(Async PROPERTIES DEFINE_SYMBOL LIBASYNC_BUILD)
if (NOT BUILD_SHARED_LIBS)
target_compile_definitions(Async PUBLIC LIBASYNC_STATIC)
endif()
# Enable warnings for strict C standard conformance
if (NOT MSVC)
target_compile_options(Async PRIVATE -Wall -Wextra -pedantic)
endif()
# Async doesn't make use of RTTI information, so don't generate it
if (MSVC)
target_compile_options(Async PRIVATE /GR-)
else()
target_compile_options(Async PRIVATE -fno-rtti)
endif()
# Allow disabling exceptions, but warn the user about the consequences
if (NOT USE_CXX_EXCEPTIONS)
message(WARNING "Exceptions have been disabled. Any operation that would "
"throw an exception will result in a call to std::abort() instead.")
target_compile_definitions(Async PUBLIC LIBASYNC_NO_EXCEPTIONS)
if (MSVC)
target_compile_options(Async PUBLIC /EHs-c-)
else()
target_compile_options(Async PUBLIC -fno-exceptions)
endif()
endif()
# Install the library and produce a CMake export script
install(TARGETS Async
EXPORT Async
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
FRAMEWORK DESTINATION Frameworks
)
export(EXPORT Async )
install(EXPORT Async DESTINATION cmake)
if (APPLE AND BUILD_FRAMEWORK)
set_target_properties(Async PROPERTIES OUTPUT_NAME Async FRAMEWORK ON)
set_source_files_properties(${ASYNCXX_INCLUDE} PROPERTIES MACOSX_PACKAGE_LOCATION Headers/async )
set_source_files_properties(${PROJECT_SOURCE_DIR}/include/async .h PROPERTIES MACOSX_PACKAGE_LOCATION Headers)
else()
set_target_properties(Async PROPERTIES OUTPUT_NAME async )
target_include_directories(Async INTERFACE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>)
install(FILES ${PROJECT_SOURCE_DIR}/include/async .h DESTINATION include)
install(FILES ${ASYNCXX_INCLUDE} DESTINATION include/async )
endif()