1cmake_minimum_required(VERSION 2.8.12)
2if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND WIN32)
3	set(D "d")
4endif()
5if(WIN32)
6	# Get Qt installation path
7	string(REGEX REPLACE "([^ ]+)[/\\].*" "\\1" QT_BIN_DIR_TMP "${QT_MOC_EXECUTABLE}")
8	string(REGEX REPLACE "\\\\" "/" QT_BIN_DIR "${QT_BIN_DIR_TMP}")
9	unset(QT_BIN_DIR_TMP)
10	function(find_psi_lib LIBLIST PATHES OUTPUT_PATH)
11		set(_LIBS ${LIBLIST})
12		set(_PATHES ${PATHES})
13		set(_OUTPUT_PATH ${OUTPUT_PATH})
14		set(FIXED_PATHES "")
15		foreach(_path ${_PATHES})
16			string(REGEX REPLACE "//bin" "/bin" tmp_path "${_path}")
17			list(APPEND FIXED_PATHES ${tmp_path})
18		endforeach()
19		if(NOT USE_MXE)
20			set(ADDITTIONAL_FLAG "NO_DEFAULT_PATH")
21		else()
22			set(ADDITTIONAL_FLAG "")
23		endif()
24		foreach(_liba ${_LIBS})
25			set(_library _library-NOTFOUND)
26			find_file( _library ${_liba} PATHS ${FIXED_PATHES} ${ADDITTIONAL_FLAG})
27			if( NOT "${_library}" STREQUAL "_library-NOTFOUND" )
28				message("library found ${_library}")
29				copy("${_library}" "${_OUTPUT_PATH}" prepare-bin-libs)
30			endif()
31		endforeach()
32		set(_LIBS "")
33		set(_PATHES "")
34		set(_OUTPUT_PATH "")
35	endfunction()
36	set(SDK_PREFIX "")
37	set(QCA_LIB_SUFF "-qt5")
38	get_filename_component(QT_DIR ${QT_BIN_DIR} DIRECTORY)
39	set(QT_PLUGINS_DIR ${QT_DIR}/plugins)
40	set(QT_TRANSLATIONS_DIR ${QT_DIR}/translations)
41	find_program(WINDEPLOYQTBIN windeployqt ${QT_BIN_DIR})
42	if(NOT "${WINDEPLOYQTBIN}" STREQUAL "WINDEPLOYQTBIN-NOTFOUND")
43		message(STATUS "WinDeployQt utility - FOUND")
44		if(CMAKE_BUILD_TYPE STREQUAL "Debug")
45			list(APPEND WDARGS --debug)
46		elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
47			list(APPEND WDARGS --release-with-debug-info)
48		elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
49			list(APPEND WDARGS --release)
50		endif()
51		add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
52			COMMAND ${WINDEPLOYQTBIN}
53			ARGS
54			${WDARGS}
55			$<TARGET_FILE:${PROJECT_NAME}>
56			WORKING_DIRECTORY
57			${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
58			COMMENT
59			"Preparing Qt runtime dependencies"
60		)
61	else()
62
63		# required libraries
64		set( ICU_LIBS_PREFIXES
65			icudt5
66			icuin5
67			icuuc5
68		)
69		set( ICU_LIBS "" )
70		foreach( icu_prefix ${ICU_LIBS_PREFIXES} )
71			foreach( icu_counter RANGE 9 )
72			find_file( ${icu_prefix}${icu_counter} "${icu_prefix}${icu_counter}.dll" )
73				if( NOT "${${icu_prefix}${icu_counter}}" STREQUAL "${icu_prefix}${icu_counter}-NOTFOUND" )
74					list(APPEND ICU_LIBS
75						"${icu_prefix}${icu_counter}.dll"
76					)
77				endif()
78			endforeach()
79		endforeach()
80		find_psi_lib("${ICU_LIBS}" "${QT_BIN_DIR}" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/")
81		# Qt5 libraries
82		set(QT_LIBAS
83			Qt5Core${D}.dll
84			Qt5Gui${D}.dll
85			Qt5Widgets${D}.dll
86			Qt5Svg${D}.dll
87			Qt5Network${D}.dll
88			Qt5Svg${D}.dll
89			Qt5Script${D}.dll
90			Qt5Xml${D}.dll
91			Qt5XmlPatterns${D}.dll
92			Qt5Sql${D}.dll
93			Qt5WebKit${D}.dll
94			Qt5WebKitWidgets${D}.dll
95			Qt5Qml${D}.dll
96			Qt5Quick${D}.dll
97			Qt5Positioning${D}.dll
98			Qt5WebChannel${D}.dll
99			Qt5Multimedia${D}.dll
100			Qt5MultimediaWidgets${D}.dll
101			Qt5Concurrent${D}.dll
102			Qt5Sensors${D}.dll
103			Qt5OpenGL${D}.dll
104			Qt5PrintSupport${D}.dll
105		)
106		find_psi_lib("${QT_LIBAS}" "${QT_BIN_DIR}" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/")
107		find_psi_lib(qtaudio_windows${D}.dll ${QT_PLUGINS_DIR}/audio/ ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/audio/)
108		set(PLATFORM_PLUGS
109			qminimal${D}.dll
110			qoffscreen${D}.dll
111			qwindows${D}.dll
112		)
113		find_psi_lib("${PLATFORM_PLUGS}" "${QT_PLUGINS_DIR}/platforms/" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/platforms/")
114		set(STYLE_PLUGS
115			qwindowsvistastyle${D}.dll
116		)
117		find_psi_lib("${STYLE_PLUGS}" "${QT_PLUGINS_DIR}/styles/" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/styles/")
118		set(BEARER_PLUGS
119			qgenericbearer${D}.dll
120			qnativewifibearer${D}.dll
121		)
122		find_psi_lib("${BEARER_PLUGS}" "${QT_PLUGINS_DIR}/bearer/" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/bearer/")
123		set(IMAGE_PLUGS
124			qdds${D}.dll
125			qgif${D}.dll
126			qicns${D}.dll
127			qico${D}.dll
128			qjp2${D}.dll
129			qjpeg${D}.dll
130			qmng${D}.dll
131			qsvg${D}.dll
132			qtga${D}.dll
133			qtiff${D}.dll
134			qwbmp${D}.dll
135			qwebp${D}.dll
136		)
137		find_psi_lib("${IMAGE_PLUGS}" "${QT_PLUGINS_DIR}/imageformats/" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/imageformats/")
138		find_psi_lib("windowsprintersupport${D}.dll" "${QT_PLUGINS_DIR}/printsupport/" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/printsupport/")
139		find_psi_lib("qsqlite${D}.dll" "${QT_PLUGINS_DIR}/sqldrivers/" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/sqldrivers/")
140		# Qt translations
141		file(GLOB QT_TRANSLATIONS "${QT_TRANSLATIONS_DIR}/qt_*.qm")
142		foreach(FILE ${QT_TRANSLATIONS})
143			if(NOT FILE MATCHES "_help_")
144				copy(${FILE} "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/translations/" prepare-bin-libs)
145			endif()
146		endforeach()
147		file(GLOB QT_TRANSLATIONS "${QT_TRANSLATIONS_DIR}/qtbase_*.qm")
148		foreach(FILE ${QT_TRANSLATIONS})
149			copy(${FILE} "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/translations/" prepare-bin-libs)
150		endforeach()
151	endif()
152	# psimedia
153	if(EXISTS "${PSIMEDIA_DIR}")
154		find_program(PSIMEDIA_PATH libgstprovider${D}.dll PATHS ${PSIMEDIA_DIR}/plugins )
155		copy(${PSIMEDIA_DIR} "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/" prepare-bin-libs)
156	endif()
157	# psimedia deps
158	find_program(PSIMEDIA_DEPS_PATH libgstvideo-0.10-0.dll PATHS ${GST_SDK}/bin )
159	get_filename_component(PSIMEDIA_DEPS_DIR ${PSIMEDIA_DEPS_PATH} DIRECTORY)
160	set(PSIMEDIA_DEPS
161		libjpeg-9.dll
162		libgettextlib-0-19-6.dll
163		libogg-0.dll
164		libtheoradec-1.dll
165		libgettextpo-0.dll
166		liborc-0.4-0.dll
167		libtheoraenc-1.dll
168		libasprintf-0.dll
169		libgettextsrc-0-19-6.dll
170		liborc-test-0.4-0.dll
171		libvorbis-0.dll
172		libcharset-1.dll
173		libgio-2.0-0.dll
174		libspeex-1.dll
175		libvorbisenc-2.dll
176		libglib-2.0-0.dll
177		libgthread-2.0-0.dll
178		libspeexdsp-1.dll
179		libvorbisfile-3.dll
180		libffi-6.dll
181		libgmodule-2.0-0.dll
182		libgobject-2.0-0.dll
183		libintl-8.dll
184		libtheora-0.dll
185		libgstapp-0.10-0.dll
186		libgstaudio-0.10-0.dll
187		libgstbase-0.10-0.dll
188		libgstcdda-0.10-0.dll
189		libgstcontroller-0.10-0.dll
190		libgstdataprotocol-0.10-0.dll
191		libgstfft-0.10-0.dll
192		libgstinterfaces-0.10-0.dll
193		libgstnet-0.10-0.dll
194		libgstnetbuffer-0.10-0.dll
195		libgstpbutils-0.10-0.dll
196		libgstreamer-0.10-0.dll
197		libgstriff-0.10-0.dll
198		libgstrtp-0.10-0.dll
199		libgstrtsp-0.10-0.dll
200		libgstsdp-0.10-0.dll
201		libgsttag-0.10-0.dll
202		libgstvideo-0.10-0.dll
203	)
204	find_psi_lib("${PSIMEDIA_DEPS}" "${PSIMEDIA_DEPS_DIR}" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/")
205	# streamer plugins
206	set(GSTREAMER_PLUGINS_DIR "${PSIMEDIA_DIR}/gstreamer-0.10")
207	file(GLOB GSTREAMER_PLUGINS "${GSTREAMER_PLUGINS_DIR}/*.dll")
208	find_psi_lib("${GSTREAMER_PLUGINS}" "${GSTREAMER_PLUGINS_DIR}/" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/gstreamer-0.10/")
209	# other libs and executables
210        set( LIBRARIES_LIST
211                libgcc_s_sjlj-1.dll
212                libgcc_s_dw2-1.dll
213                libgcc_s_seh-1.dll
214                libstdc++-6.dll
215                libwinpthread-1.dll
216                gpg.exe
217		libgcrypt-11.dll
218		libgcrypt-20.dll
219		libotr.dll
220		libotr-5.dll
221		libtidy.dll
222		libzlib.dll
223		zlib1.dll
224		libgpg-error-0.dll
225		libidn-11.dll
226		libhunspell.dll
227		libhunspell-1.3-0.dll
228		libhunspell-1.4-0.dll
229		libhunspell-1.5-0.dll
230		libhunspell-1.6-0.dll
231		libeay32.dll
232		ssleay32.dll
233	)
234	set(QCA_PATHES
235		"${QT_BIN_DIR}"
236		"${QCA_DIR}bin"
237		"${QT_PLUGINS_DIR}/crypto"
238		"${QCA_DIR}lib/qca${QCA_LIB_SUFF}/crypto"
239	)
240	find_psi_lib("libqca${QCA_LIB_SUFF}${D}.dll" "${QCA_PATHES}" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/")
241	if(MSVC)
242		list(APPEND LIBRARIES_LIST
243			otr${D}.dll
244			tidy${D}.dll
245			zlib${D}.dll
246			idn${D}.dll
247		)
248		find_psi_lib("qca${QCA_LIB_SUFF}${D}.dll" "${QCA_PATHES}" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/")
249	endif()
250	if(USE_MXE)
251		list(APPEND LIBRARIES_LIST
252			libgpg-error6-0.dll
253			libbz2.dll
254			libfreetype-6.dll
255			libglib-2.0-0.dll
256			libharfbuzz-0.dll
257			libharfbuzz-icu-0.dll
258			libiconv-2.dll
259			libintl-8.dll
260			libjasper-1.dll
261			libjpeg-9.dll
262			liblcms2-2.dll
263			liblzma-5.dll
264			liblzo2-2.dll
265			libmng-2.dll
266			libpcre16-0.dll
267			libpcre2-16-0.dll
268			libpcre-1.dll
269			libpng16-16.dll
270			libssp-0.dll
271			libsqlite3-0.dll
272			libtiff-5.dll
273			libwebp-5.dll
274			libwebpdecoder-1.dll
275			libwebpdemux-1.dll
276			libxml2-2.dll
277                )
278	endif()
279	if(SEPARATE_QJDNS)
280		list(APPEND LIBRARIES_LIST
281			libqjdns.dll
282			libjdns.dll
283		)
284	endif()
285	if(EXISTS "${SDK_PATH}")
286		set(PATHES
287			"${IDN_ROOT}bin"
288			"${HUNSPELL_ROOT}bin"
289			"${LIBGCRYPT_ROOT}bin"
290			"${LIBGPGERROR_ROOT}bin"
291			"${LIBOTR_ROOT}bin"
292			"${LIBTIDY_ROOT}bin"
293			"${QJSON_ROOT}bin"
294			"${ZLIB_ROOT}bin"
295		)
296		if(MSVC)
297			list(APPEND PATHES "${SDK_PATH}/bin")
298		else()
299			list(APPEND PATHES "${SDK_PATH}/openssl/bin")
300		endif()
301		if(SEPARATE_QJDNS)
302			list(APPEND PATHES
303				"${QJDNS_DIR}bin"
304			)
305		endif()
306	endif()
307	find_psi_lib("${LIBRARIES_LIST}" "${PATHES}" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/")
308	# qca and plugins
309	set(QCA_PLUGINS
310		libqca-ossl${D}.dll
311		libqca-gnupg${D}.dll
312	)
313	if(MSVC)
314		list(APPEND QCA_PLUGINS
315			qca-ossl${D}.dll
316			qca-gnupg${D}.dll
317		)
318	endif()
319	find_psi_lib("${QCA_PLUGINS}" "${QCA_PATHES}" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/crypto/")
320endif()
321