💿🐜 Antkeeper source code https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

374 lines
12 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. cmake_minimum_required(VERSION 3.7)
  2. project(antkeeper
  3. VERSION "0.0.0"
  4. )
  5. option(STANDALONE "Distribute in a standalone archive." OFF)
  6. set(LANGUAGE "en-us" CACHE STRING "")
  7. # Determine target build platform according to binary dir
  8. get_filename_component(PLATFORM ${PROJECT_BINARY_DIR} NAME CACHE)
  9. # Check for architecture mismatches
  10. if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
  11. if (${PLATFORM} STREQUAL "win64" OR ${PLATFORM} STREQUAL "linux64")
  12. message(FATAL_ERROR "Compiler architecture is 32-bit but target architecture is 64-bit.")
  13. endif()
  14. else()
  15. if (${PLATFORM} STREQUAL "win32" OR ${PLATFORM} STREQUAL "linux32")
  16. message(FATAL_ERROR "Compiler architecture is 64-bit but target architecture is 32-bit.")
  17. endif()
  18. endif()
  19. # Setup configuration strings
  20. set(ANTKEEPER_VERSION ${PROJECT_VERSION})
  21. set(ANTKEEPER_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
  22. set(ANTKEEPER_VERSION_MINOR ${PROJECT_VERSION_MINOR})
  23. set(ANTKEEPER_VERSION_PATCH ${PROJECT_VERSION_PATCH})
  24. if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  25. set(ANTKEEPER_BUILD_TYPE debug)
  26. set(ANTKEEPER_DEBUG ON)
  27. else()
  28. set(ANTKEEPER_BUILD_TYPE release)
  29. set(ANTKEEPER_DEBUG OFF)
  30. endif()
  31. # Setup build type paths
  32. set(BUILD_DIR ${PROJECT_SOURCE_DIR}/bin)
  33. set(BUILD_DEBUG_DIR ${BUILD_DIR}/debug)
  34. set(BUILD_RELEASE_DIR ${BUILD_DIR}/release)
  35. # Set package name
  36. set(PACKAGE_NAME ${PROJECT_NAME}-${PROJECT_VERSION}-${PLATFORM})
  37. set(PACKAGE_BUILD_NAME ${PACKAGE_NAME}-${ANTKEEPER_BUILD_TYPE})
  38. # Set package directory
  39. if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  40. set(PLATFORM_PACKAGE_DIR ${BUILD_DEBUG_DIR}/${PACKAGE_NAME})
  41. else()
  42. set(PLATFORM_PACKAGE_DIR ${BUILD_RELEASE_DIR}/${PACKAGE_NAME})
  43. endif()
  44. # Set C++ compiler flags for debug and release build types
  45. if(MSVC)
  46. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W2")
  47. elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
  48. # Update if necessary
  49. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
  50. set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -O0 -g")
  51. set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O3 -s -DNDEBUG")
  52. endif()
  53. # Set C and C++ compiler flags for the target architecture
  54. if(${PLATFORM} STREQUAL "win32" OR ${PLATFORM} STREQUAL "linux32")
  55. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
  56. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
  57. elseif(${PLATFORM} STREQUAL "win64" OR ${PLATFORM} STREQUAL "linux64")
  58. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64")
  59. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
  60. elseif(${PLATFORM} STREQUAL "osx" AND CMAKE_OSX_ARCHITECTURES STREQUAL "")
  61. # 32-bit
  62. #set(CMAKE_OSX_ARCHITECTURES "i386" CACHE STRING "" FORCE)
  63. # 64-bit
  64. #set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "" FORCE)
  65. # 96-bit universal
  66. set(CMAKE_OSX_ARCHITECTURES "x86_64;i386" CACHE STRING "" FORCE)
  67. endif()
  68. # Disable .manifest generation
  69. if(${PLATFORM} STREQUAL "win32" OR ${PLATFORM} STREQUAL "win64")
  70. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO /OPT:REF /OPT:ICF")
  71. endif()
  72. # Set C++ version
  73. set(CMAKE_CXX_STANDARD 11)
  74. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  75. set(CMAKE_CXX_EXTENSIONS OFF)
  76. # Include ExternalProject_Add command
  77. include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
  78. # Configure, build and install emergent
  79. set(EMERGENT_BUILD_DIR ${PROJECT_BINARY_DIR}/deps/build/emergent)
  80. set(EMERGENT_INSTALL_DIR ${PROJECT_BINARY_DIR}/deps/install/emergent)
  81. set(EMERGENT_INCLUDE_DIR ${EMERGENT_INSTALL_DIR}/include)
  82. set(EMERGENT_GL3W_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/lib/emergent/lib/gl3w/include)
  83. set(EMERGENT_GLM_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/lib/emergent/lib/glm)
  84. set(EMERGENT_STB_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/lib/emergent/lib/stb)
  85. set(EMERGENT_INCLUDE_DIRS
  86. ${EMERGENT_INCLUDE_DIR}
  87. ${EMERGENT_GL3W_INCLUDE_DIR}
  88. ${EMERGENT_GLM_INCLUDE_DIR}
  89. ${EMERGENT_STB_INCLUDE_DIR}
  90. )
  91. set(EMERGENT_LIBRARY emergent)
  92. if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  93. set(FREETYPE_LIBRARY freetyped)
  94. else()
  95. set(FREETYPE_LIBRARY freetype)
  96. endif()
  97. set(EMERGENT_LIBRARIES
  98. ${EMERGENT_LIBRARY}
  99. ${FREETYPE_LIBRARY}
  100. )
  101. ExternalProject_Add(emergent-project
  102. SOURCE_DIR ${PROJECT_SOURCE_DIR}/lib/emergent
  103. CMAKE_ARGS
  104. "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
  105. "-DCMAKE_INSTALL_PREFIX=${EMERGENT_INSTALL_DIR}"
  106. BINARY_DIR ${EMERGENT_BUILD_DIR}
  107. INSTALL_DIR ${EMERGENT_INSTALL_DIR})
  108. # Configure, build and install SDL2
  109. set(SDL2_BUILD_DIR ${PROJECT_BINARY_DIR}/deps/build/SDL2)
  110. set(SDL2_INSTALL_DIR ${PROJECT_BINARY_DIR}/deps/install/SDL2)
  111. set(SDL2_INCLUDE_DIR ${SDL2_INSTALL_DIR}/include)
  112. set(SDL2_LIBRARY SDL2)
  113. set(SDL2main_LIBRARY SDL2main)
  114. set(SDL2_LIBRARIES
  115. ${SDL2main_LIBRARY}
  116. ${SDL2_LIBRARY}
  117. )
  118. if(MSVC)
  119. set(SDL2_LIBRARIES
  120. ${SDL2_LIBRARIES}
  121. dinput8
  122. dxguid
  123. user32
  124. gdi32
  125. winmm
  126. imm32
  127. ole32
  128. oleaut32
  129. shell32
  130. version
  131. uuid
  132. )
  133. else()
  134. set(SDL2_LIBRARIES
  135. ${SDL2_LIBRARIES}
  136. pthread
  137. dl
  138. )
  139. endif()
  140. ExternalProject_Add(SDL2-project
  141. SOURCE_DIR ${PROJECT_SOURCE_DIR}/lib/SDL2
  142. CMAKE_ARGS
  143. "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
  144. "-DCMAKE_INSTALL_PREFIX=${SDL2_INSTALL_DIR}"
  145. "-DSDL_STATIC=true"
  146. "-DSDL_SHARED=false"
  147. BINARY_DIR ${SDL2_BUILD_DIR}
  148. INSTALL_DIR ${SDL2_INSTALL_DIR})
  149. # Configure, build and install dirent
  150. set(DIRENT_BUILD_DIR ${PROJECT_BINARY_DIR}/deps/build/dirent)
  151. set(DIRENT_INSTALL_DIR ${PROJECT_BINARY_DIR}/deps/install/dirent)
  152. set(DIRENT_INCLUDE_DIR ${DIRENT_INSTALL_DIR}/include)
  153. ExternalProject_Add(dirent-project
  154. SOURCE_DIR ${PROJECT_SOURCE_DIR}/lib/dirent
  155. CMAKE_ARGS
  156. "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
  157. "-DCMAKE_INSTALL_PREFIX=${DIRENT_INSTALL_DIR}"
  158. BINARY_DIR ${DIRENT_BUILD_DIR}
  159. INSTALL_DIR ${DIRENT_INSTALL_DIR})
  160. # Find OpenGL
  161. find_package(OpenGL REQUIRED)
  162. # Find executable source directory
  163. set(EXECUTABLE_SOURCE_DIR ${PROJECT_SOURCE_DIR}/src)
  164. # Generate C++ configuration file
  165. configure_file(${EXECUTABLE_SOURCE_DIR}/configuration.hpp.in ${EXECUTABLE_SOURCE_DIR}/configuration.hpp)
  166. # Collect executable source files
  167. set(EXECUTABLE_SOURCES
  168. ${EXECUTABLE_SOURCE_DIR}/configuration.hpp
  169. ${EXECUTABLE_SOURCE_DIR}/controls.cpp
  170. ${EXECUTABLE_SOURCE_DIR}/render-passes.hpp
  171. ${EXECUTABLE_SOURCE_DIR}/settings.cpp
  172. ${EXECUTABLE_SOURCE_DIR}/settings.hpp
  173. ${EXECUTABLE_SOURCE_DIR}/game/terrain.cpp
  174. ${EXECUTABLE_SOURCE_DIR}/game/terrain.hpp
  175. ${EXECUTABLE_SOURCE_DIR}/controls.hpp
  176. ${EXECUTABLE_SOURCE_DIR}/input.cpp
  177. ${EXECUTABLE_SOURCE_DIR}/input.hpp
  178. ${EXECUTABLE_SOURCE_DIR}/main.cpp
  179. ${EXECUTABLE_SOURCE_DIR}/mesh.cpp
  180. ${EXECUTABLE_SOURCE_DIR}/mesh.hpp
  181. ${EXECUTABLE_SOURCE_DIR}/application-state.hpp
  182. ${EXECUTABLE_SOURCE_DIR}/application-state.cpp
  183. ${EXECUTABLE_SOURCE_DIR}/application.hpp
  184. ${EXECUTABLE_SOURCE_DIR}/application.cpp
  185. ${EXECUTABLE_SOURCE_DIR}/states/loading-state.hpp
  186. ${EXECUTABLE_SOURCE_DIR}/states/loading-state.cpp
  187. ${EXECUTABLE_SOURCE_DIR}/states/splash-state.hpp
  188. ${EXECUTABLE_SOURCE_DIR}/states/splash-state.cpp
  189. ${EXECUTABLE_SOURCE_DIR}/states/title-state.hpp
  190. ${EXECUTABLE_SOURCE_DIR}/states/title-state.cpp
  191. ${EXECUTABLE_SOURCE_DIR}/states/game-state.hpp
  192. ${EXECUTABLE_SOURCE_DIR}/states/game-state.cpp
  193. ${EXECUTABLE_SOURCE_DIR}/ui/ui.hpp
  194. ${EXECUTABLE_SOURCE_DIR}/ui/ui.cpp
  195. ${EXECUTABLE_SOURCE_DIR}/ui/menu.hpp
  196. ${EXECUTABLE_SOURCE_DIR}/ui/menu.cpp
  197. ${EXECUTABLE_SOURCE_DIR}/ui/tween.hpp
  198. ${EXECUTABLE_SOURCE_DIR}/ui/tween.cpp
  199. ${EXECUTABLE_SOURCE_DIR}/ui/toolbar.hpp
  200. ${EXECUTABLE_SOURCE_DIR}/ui/toolbar.cpp
  201. ${EXECUTABLE_SOURCE_DIR}/ui/pie-menu.hpp
  202. ${EXECUTABLE_SOURCE_DIR}/ui/pie-menu.cpp
  203. ${EXECUTABLE_SOURCE_DIR}/render-passes.cpp
  204. ${EXECUTABLE_SOURCE_DIR}/game/ant.hpp
  205. ${EXECUTABLE_SOURCE_DIR}/game/ant.cpp
  206. ${EXECUTABLE_SOURCE_DIR}/game/agent.hpp
  207. ${EXECUTABLE_SOURCE_DIR}/game/agent.cpp
  208. ${EXECUTABLE_SOURCE_DIR}/game/colony.hpp
  209. ${EXECUTABLE_SOURCE_DIR}/game/colony.cpp
  210. ${EXECUTABLE_SOURCE_DIR}/game/habitat.hpp
  211. ${EXECUTABLE_SOURCE_DIR}/game/habitat.cpp
  212. ${EXECUTABLE_SOURCE_DIR}/game/nest.hpp
  213. ${EXECUTABLE_SOURCE_DIR}/game/nest.cpp
  214. ${EXECUTABLE_SOURCE_DIR}/game/navmesh.hpp
  215. ${EXECUTABLE_SOURCE_DIR}/game/navmesh.cpp
  216. ${EXECUTABLE_SOURCE_DIR}/game/pheromone-matrix.hpp
  217. ${EXECUTABLE_SOURCE_DIR}/game/pheromone-matrix.cpp
  218. ${EXECUTABLE_SOURCE_DIR}/game/level.hpp
  219. ${EXECUTABLE_SOURCE_DIR}/game/level.cpp
  220. ${EXECUTABLE_SOURCE_DIR}/game/biome.hpp
  221. ${EXECUTABLE_SOURCE_DIR}/game/biome.cpp
  222. ${EXECUTABLE_SOURCE_DIR}/game/tool.cpp
  223. ${EXECUTABLE_SOURCE_DIR}/debug.hpp
  224. ${EXECUTABLE_SOURCE_DIR}/debug.cpp
  225. ${EXECUTABLE_SOURCE_DIR}/camera-rig.hpp
  226. ${EXECUTABLE_SOURCE_DIR}/camera-rig.cpp
  227. ${EXECUTABLE_SOURCE_DIR}/model-loader.hpp
  228. ${EXECUTABLE_SOURCE_DIR}/model-loader.cpp
  229. ${EXECUTABLE_SOURCE_DIR}/material-loader.hpp
  230. ${EXECUTABLE_SOURCE_DIR}/material-loader.cpp
  231. )
  232. # Setup manifest and exe icon for windows
  233. if(${PLATFORM} STREQUAL "win32" OR ${PLATFORM} STREQUAL "win64")
  234. list(APPEND EXECUTABLE_SOURCES "${EXECUTABLE_SOURCE_DIR}/windows/antkeeper.manifest")
  235. if(EXISTS ${PROJECT_SOURCE_DIR}/data)
  236. set(RC_FILES "${PROJECT_SOURCE_DIR}/data/icons/icon.rc")
  237. set(EXECUTABLE_SOURCES "${EXECUTABLE_SOURCES};${RC_FILES}")
  238. endif()
  239. endif()
  240. # Set link directories
  241. link_directories(${EMERGENT_INSTALL_DIR}/lib
  242. ${SDL2_INSTALL_DIR}/lib
  243. )
  244. # Set executable and library output directories
  245. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PLATFORM_PACKAGE_DIR})
  246. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PLATFORM_PACKAGE_DIR})
  247. # Add executable
  248. set(EXECUTABLE_NAME antkeeper)
  249. set(EXECUTABLE_TARGET ${PACKAGE_BUILD_NAME}-executable)
  250. add_executable(${EXECUTABLE_TARGET} ${EXECUTABLE_SOURCES})
  251. add_dependencies(${EXECUTABLE_TARGET} emergent-project SDL2-project dirent-project)
  252. set_target_properties(${EXECUTABLE_TARGET} PROPERTIES OUTPUT_NAME ${EXECUTABLE_NAME})
  253. # Set include directories
  254. target_include_directories(${EXECUTABLE_TARGET} PUBLIC
  255. ${EMERGENT_INCLUDE_DIRS}
  256. ${SDL2_INCLUDE_DIR}
  257. ${DIRENT_INCLUDE_DIR}
  258. ${OPENGL_INCLUDE_DIRS}
  259. )
  260. # Build library list
  261. list(APPEND EXECUTABLE_LIBRARIES
  262. ${SDL2_LIBRARIES}
  263. ${EMERGENT_LIBRARIES}
  264. ${OPENGL_gl_LIBRARY}
  265. ${FREETYPE_LIBRARY}
  266. #m
  267. #stdc++
  268. )
  269. # Link libraries
  270. target_link_libraries(${EXECUTABLE_TARGET} ${EXECUTABLE_LIBRARIES})
  271. # Add run target
  272. if(${PLATFORM} STREQUAL "linux32" OR ${PLATFORM} STREQUAL "linux64")
  273. add_custom_target(run
  274. COMMAND optirun "${PLATFORM_PACKAGE_DIR}/${EXECUTABLE_NAME}"
  275. DEPENDS ${EXECUTABLE_TARGET}
  276. WORKING_DIRECTORY ${PLATFORM_PACKAGE_DIR}
  277. )
  278. else()
  279. add_custom_target(run
  280. COMMAND ${EXECUTABLE_TARGET}
  281. DEPENDS ${EXECUTABLE_TARGET}
  282. WORKING_DIRECTORY ${PLATFORM_PACKAGE_DIR}
  283. )
  284. endif()
  285. # Add dist target
  286. add_custom_target(dist
  287. COMMAND
  288. ${CMAKE_COMMAND} -E tar "cfvz" "${PROJECT_SOURCE_DIR}/dist/${PACKAGE_NAME}.zip" --format=zip
  289. "${PLATFORM_PACKAGE_DIR}")
  290. # Add clean targets
  291. add_custom_target(clean-build
  292. COMMAND git clean -fdX
  293. WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/build"
  294. )
  295. # Add data subdirectory (if it exists)
  296. if(EXISTS ${PROJECT_SOURCE_DIR}/data)
  297. add_subdirectory(${PROJECT_SOURCE_DIR}/data)
  298. endif()
  299. # Distribution
  300. install(TARGETS ${EXECUTABLE_TARGET} DESTINATION ".")
  301. install(DIRECTORY ${PLATFORM_PACKAGE_DIR}/data
  302. DESTINATION .)
  303. set(CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}")
  304. set(CPACK_PACKAGE_VENDOR "C. J. Howard")
  305. set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
  306. set(CPACK_PACKAGE_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}")
  307. set(CPACK_PACKAGE_VERSION_MINOR "${PROJECT_VERSION_MINOR}")
  308. set(CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}")
  309. set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${PLATFORM})
  310. if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  311. set(CPACK_OUTPUT_FILE_PREFIX "${PROJECT_SOURCE_DIR}/dist/debug")
  312. else()
  313. set(CPACK_OUTPUT_FILE_PREFIX "${PROJECT_SOURCE_DIR}/dist/release")
  314. endif()
  315. if(${PLATFORM} STREQUAL "win32" OR ${PLATFORM} STREQUAL "win64")
  316. set(CPACK_GENERATOR "ZIP")
  317. if (NOT STANDALONE)
  318. set(CPACK_GENERATOR "NSIS")
  319. set(CPACK_MONOLITHIC_INSTALL 1)
  320. set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_FILE_NAME}-installer)
  321. set(CPACK_NSIS_MUI_ICON "${PROJECT_SOURCE_DIR}/data/icons/antkeeper-icon.ico")
  322. set(CPACK_PACKAGE_INSTALL_DIRECTORY "Antkeeper")
  323. get_target_property(EXECUTABLE_OUTPUT_NAME ${EXECUTABLE_TARGET} OUTPUT_NAME)
  324. set(CPACK_NSIS_MENU_LINKS "${EXECUTABLE_OUTPUT_NAME}" "Antkeeper")
  325. endif()
  326. elseif(${PLATFORM} STREQUAL "linux32" OR ${PLATFORM} STREQUAL "linux64")
  327. set(CPACK_GENERATOR "TGZ")
  328. if(NOT STANDALONE)
  329. set(CPACK_GENERATOR "DEB")
  330. set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${CPACK_PACKAGE_VENDOR}")
  331. endif()
  332. endif()
  333. include(CPack)