wlfreerdp: add keyboard and mouse wheel support, fix bugs
[platform/upstream/freerdp.git] / channels / CMakeLists.txt
1 # FreeRDP: A Remote Desktop Protocol Implementation
2 # FreeRDP cmake build script
3 #
4 # Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
5 #
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
9 #
10 #     http://www.apache.org/licenses/LICENSE-2.0
11 #
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.
17
18 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
19
20 include(CMakeParseArguments)
21 include(CMakeDependentOption)
22
23 macro(define_channel_options)
24         set(PREFIX "CHANNEL")
25
26         cmake_parse_arguments(${PREFIX}
27                 ""
28                 "NAME;TYPE;DESCRIPTION;SPECIFICATIONS;DEFAULT"
29                 ""
30                 ${ARGN})
31
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)
35         
36         if(${${CHANNEL_CLIENT_OPTION}})
37                 set(OPTION_CLIENT_DEFAULT ${${CHANNEL_CLIENT_OPTION}})
38         endif()
39         
40         if(${${CHANNEL_SERVER_OPTION}})
41                 set(OPTION_SERVER_DEFAULT ${${CHANNEL_SERVER_OPTION}})
42         endif()
43         
44         if(${${CHANNEL_OPTION}})
45                 set(OPTION_DEFAULT ${${CHANNEL_OPTION}})
46         endif()
47         
48         if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT})
49                 set(OPTION_DEFAULT "ON")
50         endif()
51         
52         set(CHANNEL_DEFAULT ${OPTION_DEFAULT})
53                 
54         set(CHANNEL_OPTION_DOC "Build ${CHANNEL_NAME} ${CHANNEL_TYPE} channel")
55         option(${CHANNEL_OPTION} "${CHANNEL_OPTION_DOC}" ${CHANNEL_DEFAULT})
56
57 endmacro(define_channel_options)
58
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)
66
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)
74
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)
80
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)
86
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)
92
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)
102         else()
103                 set(MODULE_NAME "${CHANNEL_NAME}-client-${CHANNEL_SUBSYSTEM}")
104                 string(TOUPPER "CHANNEL_${CHANNEL_NAME}_CLIENT_${CHANNEL_SUBSYSTEM}" MODULE_PREFIX)
105         endif()
106 endmacro(define_channel_client_subsystem)
107
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)
114
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)
123         endif()
124 endmacro(add_channel_client)
125
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)
134         endif()
135 endmacro(add_channel_server)
136
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)
143         else()
144                 string(TOUPPER "CHANNEL_${_channel_name}_CLIENT_${_subsystem}" _subsystem_prefix)
145         endif()
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}")
150                 else()
151                         set(SUBSYSTEMS ${SUBSYSTEMS} ${_subsystem})
152                 endif()
153                 set_target_properties(${_channel_module_name} PROPERTIES SUBSYSTEMS "${SUBSYSTEMS}")
154         endif()
155 endmacro(add_channel_client_subsystem)
156
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)
160         endif()
161         if(${_dynamic} AND (NOT STATIC_CHANNELS))
162                 add_library(${_module_name} ${${_module_prefix}_SRCS})
163         else()
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})
169         endif()
170 endmacro(add_channel_client_library)
171
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)
175         endif()
176         if(${_dynamic} AND (NOT STATIC_CHANNELS))
177                 add_library(${_module_name} ${${_module_prefix}_SRCS})
178         else()
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})
183         endif()
184 endmacro(add_channel_client_subsystem_library)
185
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)
189         endif()
190         if(${_dynamic} AND (NOT STATIC_CHANNELS))
191                 add_library(${_module_name} ${${_module_prefix}_SRCS})
192         else()
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})
198         endif()
199 endmacro(add_channel_server_library)
200
201 set(FILENAME "ChannelOptions.cmake")
202 file(GLOB FILEPATHS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/${FILENAME}")
203
204 foreach(FILEPATH ${FILEPATHS})
205         if(${FILEPATH} MATCHES "^([^/]*)//${FILENAME}")
206                 string(REGEX REPLACE "^([^/]*)//${FILENAME}" "\\1" DIR ${FILEPATH})
207                 set(CHANNEL_OPTION)
208                 include(${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")
213                         endif()
214                         if(${CHANNEL_SERVER_OPTION})
215                                 set(CHANNEL_MESSAGE "${CHANNEL_MESSAGE} server")
216                         endif()
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})
221                 endif()
222         endif()
223 endforeach(FILEPATH)
224
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)
229 endif()
230
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)
235 endif()