CMakeLists.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
  2. # Protop: run cmake like this: cmake -G "<generator>" -H. -Bbuild
  3. message(FATAL_ERROR "Prevented in-tree build.")
  4. endif()
  5. cmake_minimum_required(VERSION 3.1)
  6. include(ExternalProject)
  7. project(megasource)
  8. set(MEGA TRUE)
  9. set (CMAKE_CXX_STANDARD 11)
  10. if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  11. set(MEGA_X64 TRUE)
  12. set(MEGA_ARCH x64)
  13. else()
  14. set(MEGA_X86 TRUE)
  15. set(MEGA_ARCH x86)
  16. endif()
  17. if(MSVC)
  18. set(CMAKE_SUPPRESS_REGENERATION TRUE)
  19. endif()
  20. if(MSVC)
  21. set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MP")
  22. set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MP")
  23. if(MEGA_X86)
  24. # This prevents usage of SSE2.
  25. set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /arch:SSE")
  26. set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /arch:SSE")
  27. endif()
  28. message(STATUS "CMAKE_CXX_FLAGS_RELEASE: ${CMAKE_CXX_FLAGS_RELEASE}")
  29. message(STATUS "CMAKE_C_FLAGS_RELEASE: ${CMAKE_C_FLAGS_RELEASE}")
  30. endif()
  31. function(add_move_dll ARG_POST_TARGET ARG_TARGET)
  32. add_custom_command(TARGET ${ARG_POST_TARGET} POST_BUILD
  33. COMMAND ${CMAKE_COMMAND} -E copy
  34. $<TARGET_FILE:${ARG_TARGET}>
  35. ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>/$<TARGET_FILE_NAME:${ARG_TARGET}>)
  36. endfunction()
  37. function(add_move_file ARG_POST_TARGET ARG_FILE)
  38. get_filename_component(TEMP_FILENAME ${ARG_FILE} NAME)
  39. add_custom_command(TARGET ${ARG_POST_TARGET} POST_BUILD
  40. COMMAND ${CMAKE_COMMAND} -E copy
  41. ${ARG_FILE}
  42. ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>/${TEMP_FILENAME})
  43. endfunction()
  44. function(disable_warnings ARG_TARGET)
  45. get_target_property(OLD_FLAGS ${ARG_TARGET} COMPILE_FLAGS)
  46. if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  47. set(NEW_FLAGS -w)
  48. else ()
  49. set(NEW_FLAGS -W0)
  50. endif ()
  51. if(OLD_FLAGS)
  52. set(NEW_FLAGS "${OLD_FLAGS} ${NEW_FLAGS}")
  53. endif()
  54. set_target_properties(${ARG_TARGET} PROPERTIES COMPILE_FLAGS ${NEW_FLAGS})
  55. endfunction()
  56. # Find vcvarsall.bat and look for dynamic runtime DLLs.
  57. if(MSVC)
  58. if(NOT(MSVC_TOOLSET_VERSION STREQUAL ""))
  59. set(VSVERSION "${MSVC_TOOLSET_VERSION}")
  60. elseif((MSVC_VERSION GREATER 1909) AND (MSVC_VERSION LESS 1920))
  61. set(VSVERSION "141")
  62. elseif(MSVC_VERSION EQUAL 1900)
  63. set(VSVERSION "140")
  64. elseif(MSVC_VERSION EQUAL 1800)
  65. set(VSVERSION "120")
  66. elseif(MSVC_VERSION LESS 1800)
  67. message(WARNING "Visual Studio 2013 (VS12) or newer is required!")
  68. else()
  69. message(WARNING "Cannot determine Visual Studio version!")
  70. endif()
  71. set(PROGRAMFILES_X86_STR "ProgramFiles(x86)")
  72. set(PROGRAMFILES_X86 "$ENV{${PROGRAMFILES_X86_STR}}")
  73. set(VSCOMNTOOLSSTRING "VS${VSVERSION}COMNTOOLS")
  74. set(VSCOMNTOOLS "$ENV{${VSCOMNTOOLSSTRING}}")
  75. if(VSCOMNTOOLS STREQUAL "")
  76. set(VSWHERE_PATH "${PROGRAMFILES_X86}\\Microsoft Visual Studio\\Installer\\vswhere.exe")
  77. execute_process(COMMAND ${VSWHERE_PATH} "-property" "installationPath" OUTPUT_VARIABLE VS_INSTALL_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
  78. if(NOT(VS_INSTALL_DIR STREQUAL ""))
  79. set(VSCOMNTOOLS "${VS_INSTALL_DIR}\\Common7\\Tools")
  80. endif()
  81. endif()
  82. if(VSCOMNTOOLS STREQUAL "")
  83. message(WARNING "Environment variable VSCOMNTOOLS not defined and vswhere.exe could not be found. Is Visual Studio properly installed?")
  84. else()
  85. # Find vcvarsall.bat.
  86. get_filename_component(VS_VCVARSALL_BAT ${VSCOMNTOOLS}/../../VC/Auxiliary/Build/vcvarsall.bat ABSOLUTE)
  87. if(NOT(EXISTS ${VS_VCVARSALL_BAT}))
  88. # older VS versions have it here
  89. get_filename_component(VS_VCVARSALL_BAT ${VSCOMNTOOLS}/../../VC/vcvarsall.bat ABSOLUTE)
  90. endif()
  91. if(EXISTS ${VS_VCVARSALL_BAT})
  92. message(STATUS "Found vcvarsall.bat")
  93. set(MEGA_MSVC_VCVARSALL_BAT ${VS_VCVARSALL_BAT})
  94. if(MEGA_X86)
  95. set(MEGA_MSVC_VCVARSALL_BAT_ARG "x86")
  96. else()
  97. set(MEGA_MSVC_VCVARSALL_BAT_ARG "x86_amd64")
  98. endif()
  99. else()
  100. message(WARNING "Could not find vsvarsall.bat")
  101. endif()
  102. endif()
  103. # We currently ship on platforms which might not have the Universal C Runtime installed.
  104. set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE)
  105. set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE)
  106. # TODO: The code for InstallRequiredSystemLibraries needs the UCRTVersion and WindowsSDKVersion
  107. # environment variables set by vcvarsall in order to detect the correct version of the UCRT, in
  108. # newer Windows SDK versions. We don't gurantee that vcvarsall has been loaded before running...
  109. include(InstallRequiredSystemLibraries)
  110. foreach(RUNTIME_LIB ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS})
  111. if(RUNTIME_LIB MATCHES "concrt")
  112. set(MSVC_RUNTIME_CONCRT_PATH ${RUNTIME_LIB})
  113. elseif(RUNTIME_LIB MATCHES "msvcp")
  114. set(MSVC_RUNTIME_MSVCP_PATH ${RUNTIME_LIB})
  115. endif()
  116. endforeach()
  117. # InstallRequiredSystemLibraries adds the concrt dll to its list, but we don't need it.
  118. if (EXISTS ${MSVC_RUNTIME_CONCRT_PATH})
  119. list(REMOVE_ITEM CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS "${MSVC_RUNTIME_CONCRT_PATH}")
  120. endif()
  121. # InstallRequiredSystemLibraries (as of CMake 3.14.5) doesn't include msvcp140_1.dll or msvcp140_2.dll in its list.
  122. if(EXISTS ${MSVC_RUNTIME_MSVCP_PATH})
  123. get_filename_component(MSVC_RUNTIME_MSVCP_DIR ${MSVC_RUNTIME_MSVCP_PATH} DIRECTORY)
  124. message(STATUS "Found MSVC Redist directory: ${MSVC_RUNTIME_MSVCP_DIR}")
  125. file(GLOB MSVC_RUNTIME_MSVCP_FILES "${MSVC_RUNTIME_MSVCP_DIR}/msvcp*.dll")
  126. set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} ${MSVC_RUNTIME_MSVCP_FILES})
  127. list(REMOVE_DUPLICATES CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS)
  128. else()
  129. message(WARNING "InstallRequiredSystemLibraries did not find any msvcp runtime dll")
  130. endif()
  131. list(LENGTH CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS MSVC_RUNTIME_COUNT)
  132. message(STATUS "Found ${MSVC_RUNTIME_COUNT} Visual C/C++ Runtime files")
  133. set(MEGA_MSVC_DLLS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS})
  134. endif()
  135. set(MEGA_ZLIB_VER "1.2.12")
  136. set(MEGA_LUA51_VER "5.1.5")
  137. set(MEGA_LUAJIT_VER "2.1.0-e826d0c")
  138. set(MEGA_LIBOGG_VER "1.3.2")
  139. set(MEGA_LIBVORBIS_VER "1.3.5")
  140. set(MEGA_LIBTHEORA_VER "1.1.1")
  141. set(MEGA_MPG123_VER "1.25.6")
  142. set(MEGA_FREETYPE_VER "2.8.1")
  143. set(MEGA_SDL2_VER "2.28.5")
  144. set(MEGA_OPENAL_VER "1.19.1")
  145. set(MEGA_MODPLUG_VER "0.8.8.4")
  146. set(SKIP_INSTALL_ALL TRUE)
  147. set(ZLIB_FOUND TRUE)
  148. set(ZLIB_LIBRARY zlibstatic)
  149. set(ZLIB_INCLUDE_DIR .)
  150. set(OGG_LIBRARY ogg-static)
  151. message(STATUS "-----------------------------------------------------")
  152. message(STATUS "Configuring: zlib ${MEGA_ZLIB_VER}")
  153. message(STATUS "-----------------------------------------------------")
  154. add_subdirectory("libs/zlib-${MEGA_ZLIB_VER}" ${CMAKE_BINARY_DIR}/zlib)
  155. set(MEGA_ZLIB zlibstatic)
  156. message(STATUS "-----------------------------------------------------")
  157. message(STATUS "Configuring: lua ${MEGA_LUA51_VER}")
  158. message(STATUS "-----------------------------------------------------")
  159. add_subdirectory("libs/lua-${MEGA_LUA51_VER}" ${CMAKE_BINARY_DIR}/lua51)
  160. set(MEGA_LUA51 lua51)
  161. message(STATUS "-----------------------------------------------------")
  162. message(STATUS "Configuring: libogg ${MEGA_LIBOGG_VER}")
  163. message(STATUS "-----------------------------------------------------")
  164. add_subdirectory("libs/libogg-${MEGA_LIBOGG_VER}" ${CMAKE_BINARY_DIR}/libogg)
  165. set(MEGA_LIBOGG ogg-static)
  166. message(STATUS "-----------------------------------------------------")
  167. message(STATUS "Configuring: libvorbis ${MEGA_LIBVORBIS_VER}")
  168. message(STATUS "-----------------------------------------------------")
  169. add_subdirectory("libs/libvorbis-${MEGA_LIBVORBIS_VER}" ${CMAKE_BINARY_DIR}/libvorbis)
  170. set(MEGA_LIBVORBIS vorbis-static)
  171. set(MEGA_LIBVORBISFILE vorbisfile-static)
  172. message(STATUS "-----------------------------------------------------")
  173. message(STATUS "Configuring: libtheora ${MEGA_LIBTHEORA_VER}")
  174. message(STATUS "-----------------------------------------------------")
  175. add_subdirectory("libs/libtheora-${MEGA_LIBTHEORA_VER}" ${CMAKE_BINARY_DIR}/libtheora)
  176. set(MEGA_LIBTHEORA theora-static)
  177. message(STATUS "-----------------------------------------------------")
  178. message(STATUS "Configuring: mpg123 ${MEGA_MPG123_VER}")
  179. message(STATUS "-----------------------------------------------------")
  180. add_subdirectory("libs/mpg123-${MEGA_MPG123_VER}" ${CMAKE_BINARY_DIR}/mpg123)
  181. set(MEGA_MPEG123 mpg123)
  182. message(STATUS "-----------------------------------------------------")
  183. message(STATUS "Configuring: freetype ${MEGA_FREETYPE_VER}")
  184. message(STATUS "-----------------------------------------------------")
  185. add_subdirectory("libs/freetype-${MEGA_FREETYPE_VER}" ${CMAKE_BINARY_DIR}/freetype)
  186. set(MEGA_FREETYPE freetype)
  187. message(STATUS "-----------------------------------------------------")
  188. message(STATUS "Configuring: SDL2 ${MEGA_SDL2_VER}")
  189. message(STATUS "-----------------------------------------------------")
  190. add_subdirectory("libs/SDL2" ${CMAKE_BINARY_DIR}/SDL2)
  191. set(MEGA_SDL2 SDL2)
  192. set(MEGA_SDL2MAIN SDL2main)
  193. message(STATUS "-----------------------------------------------------")
  194. message(STATUS "Configuring: openal-soft ${MEGA_OPENAL_VER}")
  195. message(STATUS "-----------------------------------------------------")
  196. add_subdirectory("libs/openal-soft" ${CMAKE_BINARY_DIR}/openal-soft)
  197. set(MEGA_OPENAL ${OPENAL_LIB_NAME})
  198. message(STATUS "-----------------------------------------------------")
  199. message(STATUS "Configuring: libmodplug ${MEGA_MODPLUG_VER}")
  200. message(STATUS "-----------------------------------------------------")
  201. add_subdirectory("libs/libmodplug-${MEGA_MODPLUG_VER}" ${CMAKE_BINARY_DIR}/libmodplug)
  202. set(MEGA_MODPLUG modplug-static)
  203. # LuaJIT
  204. if(MSVC)
  205. message(STATUS "-----------------------------------------------------")
  206. message(STATUS "Configuring: LuaJIT ${MEGA_LUAJIT_VER}")
  207. message(STATUS "-----------------------------------------------------")
  208. set(MEGA_LUAJIT_DIR "LuaJIT")
  209. # Copy LuaJIT source to binary dir. LuaJIT builds in-source,
  210. # and we don't want to modify the original source tree, so
  211. # we copy it.
  212. file(COPY libs/${MEGA_LUAJIT_DIR} DESTINATION libs)
  213. set(MEGA_LUAJIT_SOURCE_DIR ${CMAKE_BINARY_DIR}/libs/${MEGA_LUAJIT_DIR})
  214. set(MEGA_LUAJIT_BUILD_BAT "
  215. @echo off
  216. call \"${MEGA_MSVC_VCVARSALL_BAT}\" ${MEGA_MSVC_VCVARSALL_BAT_ARG}
  217. cd \"${MEGA_LUAJIT_SOURCE_DIR}/src\"
  218. if %1 == \"\" shift /1
  219. msvcbuild.bat %1 %2
  220. ")
  221. file(WRITE ${MEGA_LUAJIT_SOURCE_DIR}/megabuild.bat ${MEGA_LUAJIT_BUILD_BAT})
  222. ExternalProject_Add(luajit
  223. SOURCE_DIR ${MEGA_LUAJIT_SOURCE_DIR}
  224. BUILD_IN_SOURCE 1
  225. CONFIGURE_COMMAND ""
  226. BUILD_COMMAND "${MEGA_LUAJIT_SOURCE_DIR}/megabuild.bat" $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:debug> $<$<NOT:$<CONFIG:Debug>>:amalg>
  227. INSTALL_COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/bin
  228. COMMAND cmake -E copy ${MEGA_LUAJIT_SOURCE_DIR}/src/lua51.dll ${CMAKE_BINARY_DIR}/bin
  229. COMMAND cmake -E copy ${MEGA_LUAJIT_SOURCE_DIR}/src/lua51.lib ${CMAKE_BINARY_DIR}/bin)
  230. set(MEGA_LUAJIT_LIB ${CMAKE_BINARY_DIR}/bin/lua51.lib)
  231. set(MEGA_LUAJIT_DLL ${CMAKE_BINARY_DIR}/bin/lua51.dll)
  232. set(MEGA_LUAJIT_INCLUDE ${MEGA_LUAJIT_SOURCE_DIR}/src)
  233. endif()
  234. set(MEGA_3P
  235. ${MEGA_ZLIB}
  236. ${MEGA_LUA51}
  237. ${MEGA_LIBOGG}
  238. ${MEGA_LIBVORBIS}
  239. ${MEGA_LIBVORBISFILE}
  240. ${MEGA_LIBTHEORA}
  241. ${MEGA_MPEG123}
  242. ${MEGA_FREETYPE}
  243. ${MEGA_SDL2}
  244. ${MEGA_SDL2MAIN}
  245. ${MEGA_OPENAL}
  246. ${MEGA_MODPLUG}
  247. )
  248. # Set to directory of love source. Defaults to ./libs/love.
  249. if(NOT MEGA_LOVE)
  250. set(MEGA_LOVE ${CMAKE_CURRENT_SOURCE_DIR}/libs/love)
  251. endif()
  252. if(EXISTS ${MEGA_LOVE}/CMakeLists.txt)
  253. message(STATUS "-----------------------------------------------------")
  254. message(STATUS "Configuring: love")
  255. message(STATUS "-----------------------------------------------------")
  256. add_subdirectory(${MEGA_LOVE} ${CMAKE_BINARY_DIR}/love)
  257. # Turn off third-party warnings when building with LOVE.
  258. foreach(MEGA_LIB ${MEGA_3P})
  259. disable_warnings(${MEGA_LIB})
  260. endforeach()
  261. if(MSVC)
  262. set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT love)
  263. endif()
  264. else()
  265. message(STATUS "LOVE was not found")
  266. endif()
  267. link_directories(${SDL_LINK_DIR})
  268. add_executable(megatest src/test.cpp)
  269. target_link_libraries(megatest ${MEGA_3P})
  270. add_move_dll(megatest ${MEGA_MPEG123})
  271. add_move_dll(megatest ${MEGA_SDL2})
  272. add_move_dll(megatest ${MEGA_OPENAL})
  273. add_move_dll(megatest ${MEGA_LUA51})