CMakeLists.txt 6.9 KB

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