1 # FreeRDP: A Remote Desktop Protocol Implementation
2 # FreeRDP cmake build script
4 # Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
10 # http://www.apache.org/licenses/LICENSE-2.0
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
18 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
20 include(CMakeParseArguments)
21 include(CMakeDependentOption)
23 macro(define_channel_options)
26 cmake_parse_arguments(${PREFIX}
28 "NAME;TYPE;DESCRIPTION;SPECIFICATIONS;DEFAULT"
32 string(TOUPPER "CHANNEL_${CHANNEL_NAME}" CHANNEL_OPTION)
33 string(TOUPPER "CHANNEL_${CHANNEL_NAME}_CLIENT" CHANNEL_CLIENT_OPTION)
34 string(TOUPPER "CHANNEL_${CHANNEL_NAME}_SERVER" CHANNEL_SERVER_OPTION)
36 if(${${CHANNEL_CLIENT_OPTION}})
37 set(OPTION_CLIENT_DEFAULT ${${CHANNEL_CLIENT_OPTION}})
40 if(${${CHANNEL_SERVER_OPTION}})
41 set(OPTION_SERVER_DEFAULT ${${CHANNEL_SERVER_OPTION}})
44 if(${${CHANNEL_OPTION}})
45 set(OPTION_DEFAULT ${${CHANNEL_OPTION}})
48 if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT})
49 set(OPTION_DEFAULT "ON")
52 set(CHANNEL_DEFAULT ${OPTION_DEFAULT})
54 set(CHANNEL_OPTION_DOC "Build ${CHANNEL_NAME} ${CHANNEL_TYPE} channel")
55 option(${CHANNEL_OPTION} "${CHANNEL_OPTION_DOC}" ${CHANNEL_DEFAULT})
57 endmacro(define_channel_options)
59 macro(define_channel_client_options _channel_client_default)
60 string(TOUPPER "CHANNEL_${CHANNEL_NAME}_CLIENT" CHANNEL_CLIENT_OPTION)
61 set(CHANNEL_CLIENT_OPTION_DOC "Build ${CHANNEL_NAME} ${CHANNEL_TYPE} channel client")
62 option(${CHANNEL_CLIENT_OPTION} "${CHANNEL_CLIENT_OPTION_DOC}" ${_channel_client_default})
63 cmake_dependent_option(${CHANNEL_CLIENT_OPTION} "${CHANNEL_CLIENT_OPTION_DOC}"
64 ${_channel_client_default} "${CHANNEL_OPTION}" OFF)
65 endmacro(define_channel_client_options)
67 macro(define_channel_server_options _channel_server_default)
68 string(TOUPPER "CHANNEL_${CHANNEL_NAME}_SERVER" CHANNEL_SERVER_OPTION)
69 set(CHANNEL_SERVER_OPTION_DOC "Build ${CHANNEL_NAME} ${CHANNEL_TYPE} channel server")
70 option(${CHANNEL_SERVER_OPTION} "${CHANNEL_SERVER_OPTION_DOC}" ${_channel_server_default})
71 cmake_dependent_option(${CHANNEL_SERVER_OPTION} "${CHANNEL_SERVER_OPTION_DOC}"
72 ${_channel_server_default} "${CHANNEL_OPTION}" OFF)
73 endmacro(define_channel_server_options)
75 macro(define_channel _channel_name)
76 set(CHANNEL_NAME ${_channel_name})
77 set(MODULE_NAME ${CHANNEL_NAME})
78 string(TOUPPER "CHANNEL_${CHANNEL_NAME}" MODULE_PREFIX)
79 endmacro(define_channel)
81 macro(define_channel_client _channel_name)
82 set(CHANNEL_NAME ${_channel_name})
83 set(MODULE_NAME "${CHANNEL_NAME}-client")
84 string(TOUPPER "CHANNEL_${CHANNEL_NAME}_CLIENT" MODULE_PREFIX)
85 endmacro(define_channel_client)
87 macro(define_channel_server _channel_name)
88 set(CHANNEL_NAME ${_channel_name})
89 set(MODULE_NAME "${CHANNEL_NAME}-server")
90 string(TOUPPER "CHANNEL_${CHANNEL_NAME}_SERVER" MODULE_PREFIX)
91 endmacro(define_channel_server)
93 macro(define_channel_client_subsystem _channel_name _subsystem _type)
94 set(CHANNEL_NAME ${_channel_name})
95 set(CHANNEL_SUBSYSTEM ${_subsystem})
96 string(LENGTH "${_type}" _type_length)
97 string(TOUPPER "CHANNEL_${CHANNEL_NAME}_CLIENT" CHANNEL_PREFIX)
98 if(_type_length GREATER 0)
99 set(SUBSYSTEM_TYPE ${_type})
100 set(MODULE_NAME "${CHANNEL_NAME}-client-${CHANNEL_SUBSYSTEM}-${SUBSYSTEM_TYPE}")
101 string(TOUPPER "CHANNEL_${CHANNEL_NAME}_CLIENT_${CHANNEL_SUBSYSTEM}_${SUBSYSTEM_TYPE}" MODULE_PREFIX)
103 set(MODULE_NAME "${CHANNEL_NAME}-client-${CHANNEL_SUBSYSTEM}")
104 string(TOUPPER "CHANNEL_${CHANNEL_NAME}_CLIENT_${CHANNEL_SUBSYSTEM}" MODULE_PREFIX)
106 endmacro(define_channel_client_subsystem)
108 macro(define_channel_server_subsystem _channel_name _subsystem _type)
109 set(CHANNEL_NAME ${_channel_name})
110 set(CHANNEL_SUBSYSTEM ${_subsystem})
111 set(MODULE_NAME "${CHANNEL_NAME}-server-${CHANNEL_SUBSYSTEM}")
112 string(TOUPPER "CHANNEL_${CHANNEL_NAME}_server_${CHANNEL_SUBSYSTEM}" MODULE_PREFIX)
113 endmacro(define_channel_server_subsystem)
115 macro(add_channel_client _channel_prefix _channel_name)
116 add_subdirectory(client)
117 if(${${_channel_prefix}_CLIENT_STATIC})
118 set(CHANNEL_STATIC_CLIENT_MODULES ${CHANNEL_STATIC_CLIENT_MODULES} ${_channel_prefix} PARENT_SCOPE)
119 set(${_channel_prefix}_CLIENT_NAME ${${_channel_prefix}_CLIENT_NAME} PARENT_SCOPE)
120 set(${_channel_prefix}_CLIENT_CHANNEL ${${_channel_prefix}_CLIENT_CHANNEL} PARENT_SCOPE)
121 set(${_channel_prefix}_CLIENT_ENTRY ${${_channel_prefix}_CLIENT_ENTRY} PARENT_SCOPE)
122 set(CHANNEL_STATIC_CLIENT_ENTRIES ${CHANNEL_STATIC_CLIENT_ENTRIES} ${${_channel_prefix}_CLIENT_ENTRY} PARENT_SCOPE)
124 endmacro(add_channel_client)
126 macro(add_channel_server _channel_prefix _channel_name)
127 add_subdirectory(server)
128 if(${${_channel_prefix}_SERVER_STATIC})
129 set(CHANNEL_STATIC_SERVER_MODULES ${CHANNEL_STATIC_SERVER_MODULES} ${_channel_prefix} PARENT_SCOPE)
130 set(${_channel_prefix}_SERVER_NAME ${${_channel_prefix}_SERVER_NAME} PARENT_SCOPE)
131 set(${_channel_prefix}_SERVER_CHANNEL ${${_channel_prefix}_SERVER_CHANNEL} PARENT_SCOPE)
132 set(${_channel_prefix}_SERVER_ENTRY ${${_channel_prefix}_SERVER_ENTRY} PARENT_SCOPE)
133 set(CHANNEL_STATIC_SERVER_ENTRIES ${CHANNEL_STATIC_SERVER_ENTRIES} ${${_channel_prefix}_SERVER_ENTRY} PARENT_SCOPE)
135 endmacro(add_channel_server)
137 macro(add_channel_client_subsystem _channel_prefix _channel_name _subsystem _type)
138 add_subdirectory(${_subsystem})
139 set(_channel_module_name "${_channel_name}-client")
140 string(LENGTH "${_type}" _type_length)
141 if(_type_length GREATER 0)
142 string(TOUPPER "CHANNEL_${_channel_name}_CLIENT_${_subsystem}_${_type}" _subsystem_prefix)
144 string(TOUPPER "CHANNEL_${_channel_name}_CLIENT_${_subsystem}" _subsystem_prefix)
146 if(${${_subsystem_prefix}_STATIC})
147 get_target_property(CHANNEL_SUBSYSTEMS ${_channel_module_name} SUBSYSTEMS)
148 if(_type_length GREATER 0)
149 set(SUBSYSTEMS ${SUBSYSTEMS} "${_subsystem}-${_type}")
151 set(SUBSYSTEMS ${SUBSYSTEMS} ${_subsystem})
153 set_target_properties(${_channel_module_name} PROPERTIES SUBSYSTEMS "${SUBSYSTEMS}")
155 endmacro(add_channel_client_subsystem)
157 macro(add_channel_client_library _module_prefix _module_name _channel_name _dynamic _entry)
158 if(${_dynamic} AND MSVC AND (NOT STATIC_CHANNELS))
159 set(${_module_prefix}_SRCS ${${_module_prefix}_SRCS} module.def)
161 if(${_dynamic} AND (NOT STATIC_CHANNELS))
162 add_library(${_module_name} ${${_module_prefix}_SRCS})
164 set(${_module_prefix}_STATIC ON PARENT_SCOPE)
165 set(${_module_prefix}_NAME ${_module_name} PARENT_SCOPE)
166 set(${_module_prefix}_CHANNEL ${_channel_name} PARENT_SCOPE)
167 set(${_module_prefix}_ENTRY ${_entry} PARENT_SCOPE)
168 add_library(${_module_name} STATIC ${${_module_prefix}_SRCS})
170 endmacro(add_channel_client_library)
172 macro(add_channel_client_subsystem_library _module_prefix _module_name _channel_name _type _dynamic _entry)
173 if(${_dynamic} AND MSVC AND (NOT STATIC_CHANNELS))
174 set(${_module_prefix}_SRCS ${${_module_prefix}_SRCS} module.def)
176 if(${_dynamic} AND (NOT STATIC_CHANNELS))
177 add_library(${_module_name} ${${_module_prefix}_SRCS})
179 set(${_module_prefix}_STATIC ON PARENT_SCOPE)
180 set(${_module_prefix}_NAME ${_module_name} PARENT_SCOPE)
181 set(${_module_prefix}_TYPE ${_type} PARENT_SCOPE)
182 add_library(${_module_name} STATIC ${${_module_prefix}_SRCS})
184 endmacro(add_channel_client_subsystem_library)
186 macro(add_channel_server_library _module_prefix _module_name _channel_name _dynamic _entry)
187 if(${_dynamic} AND MSVC AND (NOT STATIC_CHANNELS))
188 set(${_module_prefix}_SRCS ${${_module_prefix}_SRCS} module.def)
190 if(${_dynamic} AND (NOT STATIC_CHANNELS))
191 add_library(${_module_name} ${${_module_prefix}_SRCS})
193 set(${_module_prefix}_STATIC ON PARENT_SCOPE)
194 set(${_module_prefix}_NAME ${_module_name} PARENT_SCOPE)
195 set(${_module_prefix}_CHANNEL ${_channel_name} PARENT_SCOPE)
196 set(${_module_prefix}_ENTRY ${_entry} PARENT_SCOPE)
197 add_library(${_module_name} STATIC ${${_module_prefix}_SRCS})
199 endmacro(add_channel_server_library)
201 set(FILENAME "ChannelOptions.cmake")
202 file(GLOB FILEPATHS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/${FILENAME}")
204 foreach(FILEPATH ${FILEPATHS})
205 if(${FILEPATH} MATCHES "^([^/]*)//${FILENAME}")
206 string(REGEX REPLACE "^([^/]*)//${FILENAME}" "\\1" DIR ${FILEPATH})
209 if(${CHANNEL_OPTION})
210 set(CHANNEL_MESSAGE "Adding ${CHANNEL_TYPE} channel")
211 if(${CHANNEL_CLIENT_OPTION})
212 set(CHANNEL_MESSAGE "${CHANNEL_MESSAGE} client")
214 if(${CHANNEL_SERVER_OPTION})
215 set(CHANNEL_MESSAGE "${CHANNEL_MESSAGE} server")
217 set(CHANNEL_MESSAGE "${CHANNEL_MESSAGE} \"${CHANNEL_NAME}\"")
218 set(CHANNEL_MESSAGE "${CHANNEL_MESSAGE}: ${CHANNEL_DESCRIPTION}")
219 message(STATUS "${CHANNEL_MESSAGE}")
220 add_subdirectory(${DIR})
225 if(WITH_CLIENT_CHANNELS)
226 add_subdirectory(client)
227 set(FREERDP_CHANNELS_CLIENT_SRCS ${FREERDP_CHANNELS_CLIENT_SRCS} PARENT_SCOPE)
228 set(FREERDP_CHANNELS_CLIENT_LIBS ${FREERDP_CHANNELS_CLIENT_LIBS} PARENT_SCOPE)
231 if(WITH_SERVER_CHANNELS)
232 add_subdirectory(server)
233 set(FREERDP_CHANNELS_SERVER_SRCS ${FREERDP_CHANNELS_SERVER_SRCS} PARENT_SCOPE)
234 set(FREERDP_CHANNELS_SERVER_LIBS ${FREERDP_CHANNELS_SERVER_LIBS} PARENT_SCOPE)