CMakeLists.txt 7.3 KB

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