CMakeLists.txt 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. if(ENABLE_INNOEXTRACT)
  2. add_subdirectory("lib/innoextract")
  3. endif()
  4. set(launcher_SRCS
  5. StdInc.cpp
  6. aboutProject/aboutproject_moc.cpp
  7. modManager/cdownloadmanager_moc.cpp
  8. modManager/modstateitemmodel_moc.cpp
  9. modManager/cmodlistview_moc.cpp
  10. modManager/modstatecontroller.cpp
  11. modManager/modstatemodel.cpp
  12. modManager/modstate.cpp
  13. modManager/imageviewer_moc.cpp
  14. modManager/chroniclesextractor.cpp
  15. settingsView/csettingsview_moc.cpp
  16. settingsView/configeditordialog_moc.cpp
  17. startGame/StartGameTab.cpp
  18. firstLaunch/firstlaunch_moc.cpp
  19. main.cpp
  20. helper.cpp
  21. innoextract.cpp
  22. mainwindow_moc.cpp
  23. languages.cpp
  24. updatedialog_moc.cpp
  25. prepare.cpp
  26. )
  27. if(APPLE_IOS)
  28. list(APPEND launcher_SRCS
  29. ios/launchGame.m
  30. ios/revealdirectoryinfiles.h
  31. ios/revealdirectoryinfiles.mm
  32. ios/selectdirectory.h
  33. ios/selectdirectory.mm
  34. prepare_ios.mm
  35. )
  36. elseif(ANDROID)
  37. list(APPEND launcher_SRCS
  38. prepare_android.cpp
  39. )
  40. endif()
  41. set(launcher_HEADERS
  42. StdInc.h
  43. aboutProject/aboutproject_moc.h
  44. modManager/cdownloadmanager_moc.h
  45. modManager/modstateitemmodel_moc.h
  46. modManager/cmodlistview_moc.h
  47. modManager/modstatecontroller.h
  48. modManager/modstatemodel.h
  49. modManager/modstate.h
  50. modManager/imageviewer_moc.h
  51. modManager/chroniclesextractor.h
  52. settingsView/configeditordialog_moc.h
  53. settingsView/csettingsview_moc.h
  54. startGame/StartGameTab.h
  55. firstLaunch/firstlaunch_moc.h
  56. mainwindow_moc.h
  57. languages.h
  58. updatedialog_moc.h
  59. main.h
  60. helper.h
  61. innoextract.h
  62. prepare.h
  63. prepare_p.h
  64. )
  65. set(launcher_FORMS
  66. aboutProject/aboutproject_moc.ui
  67. modManager/cmodlistview_moc.ui
  68. modManager/imageviewer_moc.ui
  69. settingsView/configeditordialog_moc.ui
  70. settingsView/csettingsview_moc.ui
  71. firstLaunch/firstlaunch_moc.ui
  72. mainwindow_moc.ui
  73. startGame/StartGameTab.ui
  74. updatedialog_moc.ui
  75. )
  76. set(launcher_RESOURCES
  77. resources.qrc
  78. )
  79. set(translationsDir "translation")
  80. set(launcher_TS
  81. "${translationsDir}/belarusian.ts"
  82. "${translationsDir}/bulgarian.ts"
  83. "${translationsDir}/chinese.ts"
  84. "${translationsDir}/czech.ts"
  85. "${translationsDir}/english.ts"
  86. "${translationsDir}/finnish.ts"
  87. "${translationsDir}/french.ts"
  88. "${translationsDir}/german.ts"
  89. "${translationsDir}/greek.ts"
  90. "${translationsDir}/hungarian.ts"
  91. "${translationsDir}/italian.ts"
  92. "${translationsDir}/japanese.ts"
  93. "${translationsDir}/korean.ts"
  94. "${translationsDir}/norwegian.ts"
  95. "${translationsDir}/polish.ts"
  96. "${translationsDir}/portuguese.ts"
  97. "${translationsDir}/romanian.ts"
  98. "${translationsDir}/russian.ts"
  99. "${translationsDir}/spanish.ts"
  100. "${translationsDir}/swedish.ts"
  101. "${translationsDir}/turkish.ts"
  102. "${translationsDir}/ukrainian.ts"
  103. "${translationsDir}/vietnamese.ts"
  104. )
  105. if(ENABLE_TRANSLATIONS)
  106. if(TARGET Qt5::Core)
  107. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${translationsDir}")
  108. set_source_files_properties(${launcher_TS} PROPERTIES OUTPUT_LOCATION "${translationsDir}")
  109. qt5_add_translation(launcher_QM ${launcher_TS})
  110. set(translationsResource "${CMAKE_CURRENT_BINARY_DIR}/translations.qrc")
  111. list(APPEND launcher_RESOURCES "${translationsResource}")
  112. set(rccQmFiles "")
  113. foreach(qmFile ${launcher_QM})
  114. string(APPEND rccQmFiles "<file>${qmFile}</file>\n")
  115. endforeach()
  116. file(WRITE "${translationsResource}"
  117. "<!DOCTYPE RCC>
  118. <RCC version=\"1.0\">
  119. <qresource prefix=\"/\">
  120. ${rccQmFiles}
  121. </qresource>
  122. </RCC>"
  123. )
  124. endif()
  125. endif()
  126. if(WIN32)
  127. set(launcher_ICON VCMI_launcher.rc)
  128. endif()
  129. assign_source_group(${launcher_SRCS} ${launcher_HEADERS} ${launcher_RESOURCES} ${launcher_TS} ${launcher_ICON})
  130. set(CMAKE_AUTOMOC ON)
  131. set(CMAKE_AUTOUIC ON)
  132. set(CMAKE_AUTORCC ON)
  133. if(POLICY CMP0071)
  134. cmake_policy(SET CMP0071 NEW)
  135. endif()
  136. # As moc files are generated in the binary dir, tell CMake
  137. # to always look for includes there:
  138. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  139. if(ENABLE_SINGLE_APP_BUILD OR ANDROID)
  140. add_library(vcmilauncher OBJECT ${launcher_QM})
  141. else()
  142. add_executable(vcmilauncher WIN32 ${launcher_QM} ${launcher_ICON})
  143. endif()
  144. if(ENABLE_TRANSLATIONS)
  145. if(TARGET Qt6::Core)
  146. qt_add_translations(vcmilauncher
  147. TS_FILES ${launcher_TS}
  148. RESOURCE_PREFIX "/${translationsDir}"
  149. INCLUDE_DIRECTORIES
  150. ${CMAKE_CURRENT_BINARY_DIR})
  151. endif()
  152. endif()
  153. if(ANDROID)
  154. get_target_property(rccPath Qt${QT_VERSION_MAJOR}::rcc IMPORTED_LOCATION)
  155. get_filename_component(qtDir "${rccPath}/../../" ABSOLUTE)
  156. set(qtDir "${qtDir}" PARENT_SCOPE)
  157. function(generate_binary_resource resourceName resourceDir)
  158. file(CREATE_LINK "${resourceDir}" "${CMAKE_CURRENT_BINARY_DIR}/${resourceName}"
  159. COPY_ON_ERROR
  160. SYMBOLIC
  161. )
  162. set(qrcFile "${CMAKE_CURRENT_BINARY_DIR}/${resourceName}.qrc")
  163. execute_process(COMMAND
  164. "${rccPath}" --project
  165. WORKING_DIRECTORY "${resourceDir}"
  166. OUTPUT_VARIABLE rccOutput
  167. )
  168. # add parent directory
  169. string(REPLACE "<file>." "<file>${resourceName}" rccOutput "${rccOutput}")
  170. file(WRITE "${qrcFile}" "${rccOutput}")
  171. endfunction()
  172. generate_binary_resource("config" "${CMAKE_SOURCE_DIR}/config")
  173. list(APPEND launcher_RESOURCES "${CMAKE_CURRENT_BINARY_DIR}/config.qrc")
  174. generate_binary_resource("Mods" "${CMAKE_SOURCE_DIR}/Mods")
  175. list(APPEND launcher_RESOURCES "${CMAKE_CURRENT_BINARY_DIR}/Mods.qrc")
  176. endif()
  177. target_sources(vcmilauncher PRIVATE
  178. ${launcher_SRCS}
  179. ${launcher_HEADERS}
  180. ${launcher_RESOURCES}
  181. ${launcher_FORMS}
  182. )
  183. if(WIN32)
  184. set_target_properties(vcmilauncher
  185. PROPERTIES
  186. OUTPUT_NAME "VCMI_launcher"
  187. PROJECT_LABEL "VCMI_launcher"
  188. )
  189. # FIXME: Can't to get CMP0020 working with Vcpkg and CMake 3.8.2
  190. # So far I tried:
  191. # - cmake_minimum_required set to 2.8.11 globally and in this file
  192. # - cmake_policy in all possible places
  193. # - used NO_POLICY_SCOPE to make sure no other parts reset policies
  194. # Still nothing worked, warning kept appearing and WinMain didn't link automatically
  195. target_link_libraries(vcmilauncher Qt${QT_VERSION_MAJOR}::WinMain)
  196. endif()
  197. if(APPLE)
  198. # This makes Xcode project prettier by moving vcmilauncher_autogen directory into vcmiclient subfolder
  199. set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER vcmilauncher)
  200. endif()
  201. if(ANDROID)
  202. target_link_libraries(vcmilauncher Qt${QT_VERSION_MAJOR}::AndroidExtras)
  203. elseif(NOT APPLE_IOS)
  204. target_link_libraries(vcmilauncher SDL2::SDL2)
  205. endif()
  206. if(ENABLE_STATIC_LIBS OR NOT (ENABLE_EDITOR AND ENABLE_LAUNCHER))
  207. target_compile_definitions(vcmilauncher PRIVATE VCMIQT_STATIC)
  208. endif()
  209. target_link_libraries(vcmilauncher vcmi vcmiqt Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Network)
  210. target_include_directories(vcmilauncher
  211. PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
  212. )
  213. vcmi_set_output_dir(vcmilauncher "")
  214. enable_pch(vcmilauncher)
  215. if(ENABLE_INNOEXTRACT)
  216. target_compile_definitions(vcmilauncher PRIVATE ENABLE_INNOEXTRACT)
  217. target_link_libraries(vcmilauncher innoextract)
  218. endif()
  219. if(APPLE_IOS)
  220. target_link_libraries(vcmilauncher
  221. iOS_utils
  222. "-framework UniformTypeIdentifiers"
  223. )
  224. # TODO: remove after switching prebuilt deps to a newer Conan's Qt recipe
  225. if(XCODE_VERSION VERSION_GREATER_EQUAL 14.0)
  226. target_link_libraries(vcmilauncher "-framework IOKit")
  227. endif()
  228. # workaround https://github.com/conan-io/conan-center-index/issues/13332
  229. if(USING_CONAN)
  230. file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/QIOSIntegrationPlugin.h
  231. "#include <QtPlugin>\nQ_IMPORT_PLUGIN(QIOSIntegrationPlugin)"
  232. )
  233. target_link_libraries(vcmilauncher
  234. Qt${QT_VERSION_MAJOR}::QIOSIntegrationPlugin
  235. qt::QIOSIntegrationPlugin
  236. )
  237. endif()
  238. elseif(ANDROID)
  239. set(androidSdkDir "$ENV{ANDROID_HOME}")
  240. configure_file(
  241. "${androidPackageSourceDir}/androiddeployqt.json.in"
  242. "${CMAKE_BINARY_DIR}/androiddeployqt.json"
  243. @ONLY
  244. )
  245. else()
  246. install(TARGETS vcmilauncher DESTINATION ${BIN_DIR})
  247. # Install icons and desktop file on Linux
  248. if(NOT WIN32 AND NOT APPLE)
  249. install(FILES "vcmilauncher.desktop" DESTINATION share/applications)
  250. install(FILES "eu.vcmi.VCMI.metainfo.xml" DESTINATION share/metainfo)
  251. endif()
  252. endif()