/ CMakeLists.txt
CMakeLists.txt
  1  project(darlingserver)
  2  
  3  cmake_minimum_required(VERSION 3.13)
  4  
  5  option(DSERVER_TOOLS "Build darlingserver tools (for debugging)" OFF)
  6  option(DSERVER_ASAN "Build darlingserver with ASAN" OFF)
  7  option(DSERVER_UBSAN "Build darlingserver with UBSAN" OFF)
  8  
  9  if (DSERVER_TOOLS)
 10  	add_subdirectory(tools)
 11  endif()
 12  
 13  if (DSERVER_ASAN)
 14  	add_compile_definitions(
 15  		DSERVER_ASAN=1
 16  	)
 17  else()
 18  	add_compile_definitions(
 19  		DSERVER_ASAN=0
 20  	)
 21  endif()
 22  
 23  if (DSERVER_UBSAN)
 24  	add_compile_definitions(
 25  		DSERVER_UBSAN=1
 26  	)
 27  else()
 28  	add_compile_definitions(
 29  		DSERVER_UBSAN=0
 30  	)
 31  endif()
 32  
 33  set(dserver_sanitizers "")
 34  if (DSERVER_ASAN)
 35  	if (NOT (dserver_sanitizers STREQUAL ""))
 36  		set(dserver_sanitizers "${dserver_sanitizers},")
 37  	endif()
 38  	set(dserver_sanitizers "${dserver_sanitizers}address")
 39  endif()
 40  if (DSERVER_UBSAN)
 41  	if (NOT (dserver_sanitizers STREQUAL ""))
 42  		set(dserver_sanitizers "${dserver_sanitizers},")
 43  	endif()
 44  	set(dserver_sanitizers "${dserver_sanitizers}undefined")
 45  endif()
 46  
 47  option(DSERVER_EXTENDED_DEBUG "Build darlingserver with extended debugging support" OFF)
 48  
 49  if (DSERVER_EXTENDED_DEBUG)
 50  	add_compile_definitions(
 51  		DSERVER_EXTENDED_DEBUG=1
 52  	)
 53  else()
 54  	add_compile_definitions(
 55  		DSERVER_EXTENDED_DEBUG=0
 56  	)
 57  endif()
 58  
 59  option(DSERVER_SINGLE_THREADED "Only use a single thread per workqueue in darlingserver" ON)
 60  
 61  if (DSERVER_SINGLE_THREADED)
 62  	add_compile_definitions(
 63  		DSERVER_SINGLE_THREADED=1
 64  	)
 65  else()
 66  	add_compile_definitions(
 67  		DSERVER_SINGLE_THREADED=0
 68  	)
 69  endif()
 70  
 71  add_subdirectory(duct-tape)
 72  
 73  set(DARLINGSERVER_INIT_PROCESS "/sbin/launchd" CACHE STRING "The init process darlingserver should execute (default is \"/sbin/launchd\")")
 74  set(DARLINGSERVER_XDG_USER_DIR_CMD "xdg-user-dir" CACHE STRING "The xdg-user-dir binary darlingserver should execute (default is \"xdg-user-dir\")")
 75  
 76  include_directories(
 77  	include
 78  	internal-include
 79  	${CMAKE_CURRENT_BINARY_DIR}/include
 80  	${CMAKE_CURRENT_BINARY_DIR}/internal-include
 81  	${CMAKE_BINARY_DIR}/src/startup # for `rtsig.h`
 82  )
 83  
 84  add_custom_command(
 85  	OUTPUT
 86  		${CMAKE_CURRENT_BINARY_DIR}/include/darlingserver/rpc.h
 87  		${CMAKE_CURRENT_BINARY_DIR}/internal-include/darlingserver/rpc.internal.h
 88  		${CMAKE_CURRENT_BINARY_DIR}/src/rpc.c
 89  	COMMAND
 90  		${CMAKE_CURRENT_SOURCE_DIR}/scripts/generate-rpc-wrappers.py
 91  		${CMAKE_CURRENT_BINARY_DIR}/include/darlingserver/rpc.h
 92  		${CMAKE_CURRENT_BINARY_DIR}/internal-include/darlingserver/rpc.internal.h
 93  		${CMAKE_CURRENT_BINARY_DIR}/src/rpc.c
 94  		\"../include/darlingserver/rpc.h\"
 95  	VERBATIM
 96  	MAIN_DEPENDENCY
 97  		${CMAKE_CURRENT_SOURCE_DIR}/scripts/generate-rpc-wrappers.py
 98  )
 99  
100  add_custom_target(generate_dserver_rpc_wrappers
101  	ALL
102  	DEPENDS
103  		${CMAKE_CURRENT_BINARY_DIR}/include/darlingserver/rpc.h
104  		${CMAKE_CURRENT_BINARY_DIR}/internal-include/darlingserver/rpc.internal.h
105  		${CMAKE_CURRENT_BINARY_DIR}/src/rpc.c
106  )
107  
108  add_executable(darlingserver
109  	src/darlingserver.cpp
110  	src/server.cpp
111  	src/message.cpp
112  	src/call.cpp
113  	src/registry.cpp
114  	src/logging.cpp
115  	src/process.cpp
116  	src/thread.cpp
117  	src/utility.cpp
118  	src/kqchan.cpp
119  	src/async-writer.cpp
120  	src/stack-pool.cpp
121  )
122  
123  add_dependencies(darlingserver
124  	generate_dserver_rpc_wrappers
125  	rtsig_h
126  )
127  
128  target_link_libraries(darlingserver PRIVATE
129  	darlingserver_duct_tape
130  )
131  
132  target_compile_options(darlingserver PRIVATE
133  	-pthread
134  	-std=c++17
135  )
136  target_link_options(darlingserver PRIVATE
137  	-pthread
138  	-Wl,--gc-sections
139  )
140  
141  if (DSERVER_ASAN OR DSERVER_UBSAN)
142  	target_compile_options(darlingserver PRIVATE
143  		-fsanitize=${dserver_sanitizers}
144  		-fsanitize-recover=all
145  		-fno-omit-frame-pointer
146  		-g
147  		-Og
148  	)
149  	target_link_options(darlingserver PRIVATE
150  		-fsanitize=${dserver_sanitizers}
151  		-fsanitize-recover=all
152  	)
153  endif()
154  
155  if (DSERVER_EXTENDED_DEBUG)
156  	target_compile_options(darlingserver PRIVATE
157  		-fno-omit-frame-pointer
158  	)
159  endif()
160  
161  install(TARGETS darlingserver DESTINATION bin)
162  
163  #file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/${DARLING_SDK_RELATIVE_PATH}/usr/include/darlingserver")
164  #create_symlink(
165  #	"${DARLING_ROOT_RELATIVE_TO_SDK}/../../../src/darlingserver/include/darlingserver/rpc.h"
166  #	"${CMAKE_BINARY_DIR}/${DARLING_SDK_RELATIVE_PATH}/usr/include/darlingserver/rpc.h"
167  #)
168  
169  if (NOT "${DARLINGSERVER_INIT_PROCESS}" STREQUAL "")
170  	target_compile_definitions(darlingserver PRIVATE
171  		DARLINGSERVER_INIT_PROCESS="${DARLINGSERVER_INIT_PROCESS}"
172  	)
173  endif()
174  
175  if (NOT "${DARLINGSERVER_XDG_USER_DIR_CMD}" STREQUAL "")
176  	target_compile_definitions(darlingserver PRIVATE
177  		DARLINGSERVER_XDG_USER_DIR_CMD="${DARLINGSERVER_XDG_USER_DIR_CMD}"
178  	)
179  endif()