CMakeLists.txt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. #####################################################################
  2. #
  3. # "Getting Started with CMake", a tutorial video by Eric Wing.
  4. # Part 1 of 6: http://www.youtube.com/watch?v=CLvZTyji_Uw
  5. # Part 2 of 6: http://www.youtube.com/watch?v=gUW-RrRQjEg
  6. # Part 3 of 6: http://www.youtube.com/watch?v=sz6cPhbuTk4
  7. # Part 4 of 6: http://www.youtube.com/watch?v=JICZOkyNXbg
  8. # Part 5 of 6: http://www.youtube.com/watch?v=lAiuLHy4dCk
  9. # Part 6 of 6: http://www.youtube.com/watch?v=fAtJNzDZdH8
  10. #
  11. # You can use notepad++ for syntax highlighting.
  12. # Naming conventions:
  13. # WITH_* : option to use an external package or not
  14. # ENABLE_* : option to use an internal feature/code or not
  15. # HAVE_* : internal variable indicating if we have and are using something
  16. #
  17. # Example (build in subdir 'build' and install to source dir):
  18. # mkdir build
  19. # cd build
  20. # cmake -G"Unix Makefiles" -DINSTALL_TO_SOURCE:bool=ON ..
  21. # make install
  22. # cd ..
  23. # rm -rf build
  24. #
  25. #####################################################################
  26. #cmake_minimum_required( VERSION 2.8.4 )
  27. # Functional changes from 2.8.3 to 2.8.4:
  28. # string(SUBSTRING) works with length -1 as "rest of string"
  29. # changes to some CPack generators
  30. # CYGWIN no longer defines WIN32
  31. # CMP0017: Prefer files from the CMake module directory when including from there.
  32. set( CMAKE_LEGACY_CYGWIN_WIN32 0 )
  33. cmake_minimum_required( VERSION 2.8.3 )
  34. project( eAthena )
  35. if( CYGWIN )
  36. unset( WIN32 )
  37. endif()
  38. #
  39. # Prevent building in the source directory by default
  40. #
  41. if( ALLOW_SAME_DIRECTORY )
  42. elseif( "${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}" )
  43. option( ALLOW_SAME_DIRECTORY "Allow CMake to build in the source directory." OFF )
  44. message( FATAL_ERROR "Do not use the source directory to build your files, instead create a separate folder and build there.\nExample:\n mkdir build\n cd build\n cmake -G\"Unix Makefiles\" ..\n make install\nTo skip this check, set ALLOW_SAME_DIRECTORY to 1 or ON" )
  45. endif()
  46. #
  47. # Global stuff
  48. #
  49. set( GLOBAL_LIBRARIES CACHE INTERNAL "" )
  50. set( GLOBAL_INCLUDE_DIRS CACHE INTERNAL "" )
  51. set( GLOBAL_DEFINITIONS CACHE INTERNAL "" )
  52. mark_as_advanced( GLOBAL_LIBRARIES GLOBAL_INCLUDE_DIRS GLOBAL_DEFINITIONS )
  53. if( WIN32 )
  54. list( APPEND GLOBAL_DEFINITIONS FD_SETSIZE=4096 )
  55. list( APPEND GLOBAL_LIBRARIES "oldnames.lib" "ws2_32.lib" )
  56. endif()
  57. if( MSVC )
  58. list( APPEND GLOBAL_DEFINITIONS _CRT_SECURE_NO_DEPRECATE _CRT_NONSTDC_NO_DEPRECATE DB_MANUAL_CAST_TO_UNION )
  59. endif()
  60. #
  61. # Find svnversion
  62. #
  63. message( STATUS "Detecting svnversion" )
  64. find_program( SVNVERSION_EXECUTABLE svnversion )
  65. mark_as_advanced( SVNVERSION_EXECUTABLE )
  66. if( SVNVERSION_EXECUTABLE )
  67. message( STATUS "Found svnversion: ${SVNVERSION_EXECUTABLE}" )
  68. endif()
  69. message( STATUS "Detecting svnversion - done" )
  70. #
  71. # Find Subversion
  72. #
  73. message( STATUS "Detecting Subversion" )
  74. find_package( Subversion )
  75. message( STATUS "Detecting Subversion - done" )
  76. #
  77. # Find math library (FreeBSD)
  78. #
  79. message( STATUS "Detecting math library" )
  80. find_library( M_LIBRARIES m )
  81. mark_as_advanced( M_LIBRARIES )
  82. if( M_LIBRARIES )
  83. message( STATUS "Found m: ${M_LIBRARIES}" )
  84. list( APPEND GLOBAL_LIBRARIES ${M_LIBRARIES} )
  85. endif()
  86. message( STATUS "Detecting math library - done" )
  87. #
  88. # PACKETVER
  89. #
  90. set( PACKETVER CACHE STRING "Sets the PACKETVER define of the servers. (see src/common/mmo.h)" )
  91. if( PACKETVER )
  92. list( APPEND GLOBAL_DEFINITIONS PACKETVER=${PACKETVER} )
  93. endif()
  94. #
  95. # SVNVERSION
  96. #
  97. if( SVNVERSION_EXECUTABLE )
  98. execute_process( COMMAND ${SVNVERSION_EXECUTABLE} ${PROJECT_SOURCE_DIR}
  99. OUTPUT_VARIABLE SVNVERSION
  100. OUTPUT_STRIP_TRAILING_WHITESPACE )
  101. string( REGEX REPLACE "[^1234567890MSexported]" "_" SVNVERSION ${SVNVERSION} )
  102. endif()
  103. if( Subversion_FOUND AND SVNVERSION )
  104. Subversion_WC_INFO( ${PROJECT_SOURCE_DIR} eAthena )
  105. if( eAthena_WC_URL )
  106. string( REGEX MATCH "[^/]+$" BRANCH ${eAthena_WC_URL} )
  107. set( SVNVERSION "${BRANCH}-${SVNVERSION}" )
  108. endif()
  109. endif()
  110. #
  111. # 3rdparty
  112. #
  113. add_subdirectory( 3rdparty )
  114. #####################################################################
  115. # package stuff
  116. #
  117. set( CPACK_PACKAGE_NAME "eAthena" )
  118. set( CPACK_PACKAGE_DESCRIPTION_SUMMARY "MMORPG server package" )
  119. set( CPACK_PACKAGE_VERSION ${SVNVERSION} )
  120. set( CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE )
  121. #set( CPACK_MONOLITHIC_INSTALL ON )
  122. include( CPACK OPTIONAL RESULT_VARIABLE HAVE_CPACK )
  123. if( NOT HAVE_CPACK )
  124. # empty replacements
  125. macro( cpack_add_component_group )
  126. endmacro()
  127. macro( cpack_add_component )
  128. endmacro()
  129. message( STATUS "CPACK not found, package creation disabled" )
  130. endif()
  131. set( Runtime "Runtime files" CACHE INTERNAL "" )
  132. set( Runtime_base "configurations, dbs, npcs, docs, ..." CACHE INTERNAL "" )
  133. set( Runtime_templates "conf/import and save (generated from conf/import-tmpl and save-tmpl)" CACHE INTERNAL "" )
  134. cpack_add_component_group( Runtime DESCRIPTION ${Runtime} DISPLAY_NAME "Runtime" )
  135. cpack_add_component( Runtime_base DESCRIPTION ${Runtime_base} DISPLAY_NAME "Base files" GROUP Runtime )
  136. cpack_add_component( Runtime_templates DESCRIPTION ${Runtime_templates} DISPLAY_NAME "Base templates" GROUP Runtime )
  137. set( Development "Development files" CACHE INTERNAL "" )
  138. set( Development_base "projects, 3rdparty, sources, templates" CACHE INTERNAL "" )
  139. cpack_add_component_group( Development DESCRIPTION ${Development} DISPLAY_NAME "Development" )
  140. cpack_add_component( Development_base DESCRIPTION ${Development_base} DISPLAY_NAME "Base files" GROUP Development )
  141. #
  142. # install stuff
  143. #
  144. option( WITH_COMPONENT_RUNTIME "install/package files needed to run the project" ON )
  145. option( WITH_COMPONENT_DEVELOPMENT "install/package files needed to build the project" OFF )
  146. option( INSTALL_TO_PATH "copy files to INSTALL_PATH" OFF )
  147. option( INSTALL_TO_SOURCE "copy files to source directory, skips what is already there (${CMAKE_CURRENT_SOURCE_DIR})" OFF )
  148. option( INSTALL_TO_SUBDIR "copy files to subdirectory (${CMAKE_CURRENT_BINARY_DIR}/install)" OFF )
  149. set( INSTALL_PATH "${CMAKE_INSTALL_PREFIX}" CACHE STRING "install path (only used when INSTALL_TO_PATH is set)" )
  150. mark_as_advanced( CMAKE_INSTALL_PREFIX )
  151. if( INSTALL_TO_PATH AND NOT ("${INSTALL_TO}" STREQUAL "path") )# changed to path
  152. set_property( CACHE INSTALL_TO_SOURCE INSTALL_TO_SUBDIR PROPERTY VALUE OFF )
  153. elseif( INSTALL_TO_SOURCE AND NOT ("${INSTALL_TO}" STREQUAL "source") )# changed to source
  154. set_property( CACHE INSTALL_TO_PATH INSTALL_TO_SUBDIR PROPERTY VALUE OFF )
  155. elseif( INSTALL_TO_SUBDIR AND NOT ("${INSTALL_TO}" STREQUAL "subdir") )# changed to subdir
  156. set_property( CACHE INSTALL_TO_PATH INSTALL_TO_SOURCE PROPERTY VALUE OFF )
  157. elseif( NOT INSTALL_TO_PATH AND NOT INSTALL_TO_SOURCE AND NOT INSTALL_TO_SUBDIR )# default
  158. set_property( CACHE INSTALL_TO_SUBDIR PROPERTY VALUE ON )
  159. endif()
  160. if( INSTALL_TO_PATH )
  161. set( INSTALL_TO "path" CACHE INTERNAL "" )
  162. set_property( CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${INSTALL_PATH}" )
  163. elseif( INSTALL_TO_SOURCE )
  164. set( INSTALL_TO "source" CACHE INTERNAL "" )
  165. set_property( CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${CMAKE_CURRENT_SOURCE_DIR}" )
  166. elseif( INSTALL_TO_SUBDIR )
  167. set( INSTALL_TO "subdir" CACHE INTERNAL "" )
  168. set_property( CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${CMAKE_CURRENT_BINARY_DIR}/install" )
  169. endif()
  170. set( SVN_FOLDER_PATTERN "[\\.]svn" CACHE STRING "pattern of svn folder that we exclude from instalations" )
  171. mark_as_advanced( SVN_FOLDER_PATTERN )
  172. set( DEVELOPMENT_FILES
  173. "${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt"
  174. "${CMAKE_CURRENT_SOURCE_DIR}/configure"
  175. "${CMAKE_CURRENT_SOURCE_DIR}/configure.in"
  176. "${CMAKE_CURRENT_SOURCE_DIR}/eAthena-6.dsw"
  177. "${CMAKE_CURRENT_SOURCE_DIR}/eAthena-7.1.sln"
  178. "${CMAKE_CURRENT_SOURCE_DIR}/eAthena-8.sln"
  179. "${CMAKE_CURRENT_SOURCE_DIR}/eAthena-9.sln"
  180. "${CMAKE_CURRENT_SOURCE_DIR}/eAthena-10.sln"
  181. )
  182. set( DEVELOPMENT_DIRECTORIES
  183. "3rdparty"
  184. "conf/import-tmpl"
  185. "save-tmpl"
  186. "src"
  187. "vcproj-6"
  188. "vcproj-7.1"
  189. "vcproj-8"
  190. "vcproj-9"
  191. "vcproj-10"
  192. )
  193. set( RUNTIME_FILES
  194. "${CMAKE_CURRENT_SOURCE_DIR}/athena-start"
  195. "${CMAKE_CURRENT_SOURCE_DIR}/Changelog-Trunk.txt"
  196. "${CMAKE_CURRENT_SOURCE_DIR}/char-server.sh"
  197. "${CMAKE_CURRENT_SOURCE_DIR}/charserv-sql.bat"
  198. "${CMAKE_CURRENT_SOURCE_DIR}/charserv.bat"
  199. "${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll"
  200. "${CMAKE_CURRENT_SOURCE_DIR}/libmysql.dll"
  201. "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE"
  202. "${CMAKE_CURRENT_SOURCE_DIR}/login-server.sh"
  203. "${CMAKE_CURRENT_SOURCE_DIR}/logserv-sql.bat"
  204. "${CMAKE_CURRENT_SOURCE_DIR}/logserv.bat"
  205. "${CMAKE_CURRENT_SOURCE_DIR}/map-server.sh"
  206. "${CMAKE_CURRENT_SOURCE_DIR}/mapserv-sql.bat"
  207. "${CMAKE_CURRENT_SOURCE_DIR}/mapserv.bat"
  208. "${CMAKE_CURRENT_SOURCE_DIR}/notice.txt"
  209. "${CMAKE_CURRENT_SOURCE_DIR}/pcre3.dll"
  210. "${CMAKE_CURRENT_SOURCE_DIR}/readme.html"
  211. "${CMAKE_CURRENT_SOURCE_DIR}/runserver-sql.bat"
  212. "${CMAKE_CURRENT_SOURCE_DIR}/runserver.bat"
  213. "${CMAKE_CURRENT_SOURCE_DIR}/serv.bat"
  214. "${CMAKE_CURRENT_SOURCE_DIR}/start"
  215. "${CMAKE_CURRENT_SOURCE_DIR}/zlib1.dll"
  216. )
  217. set( RUNTIME_DIRECTORIES
  218. "conf"
  219. "db"
  220. "doc"
  221. "log"
  222. "npc"
  223. "plugins"
  224. "readme"
  225. "sql-files"
  226. "tools"
  227. )
  228. if( INSTALL_TO_SOURCE )# skip, already in the source dir
  229. else()
  230. if( WITH_COMPONENT_RUNTIME )
  231. install( FILES ${RUNTIME_FILES}
  232. DESTINATION "."
  233. COMPONENT Runtime_base )
  234. foreach( DIR IN ITEMS ${RUNTIME_DIRECTORIES} )
  235. install( DIRECTORY "${DIR}/"
  236. DESTINATION "${DIR}"
  237. COMPONENT Runtime_base
  238. PATTERN ${SVN_FOLDER_PATTERN} EXCLUDE
  239. PATTERN "conf/import-tmpl" EXCLUDE )
  240. endforeach()
  241. endif()
  242. if( WITH_COMPONENT_DEVELOPMENT )
  243. install( FILES ${DEVELOPMENT_FILES}
  244. DESTINATION "."
  245. COMPONENT Development_base )
  246. foreach( DIR IN ITEMS ${DEVELOPMENT_DIRECTORIES} )
  247. install( DIRECTORY "${DIR}/"
  248. DESTINATION "${DIR}"
  249. COMPONENT Development_base
  250. PATTERN ${SVN_FOLDER_PATTERN} EXCLUDE )
  251. endforeach()
  252. endif()
  253. endif()
  254. if( WITH_COMPONENT_RUNTIME )
  255. # templates
  256. install( DIRECTORY "save-tmpl/"
  257. DESTINATION "save"
  258. COMPONENT Runtime_templates
  259. PATTERN ${SVN_FOLDER_PATTERN} EXCLUDE )
  260. install( DIRECTORY "conf/import-tmpl/"
  261. DESTINATION "conf/import"
  262. COMPONENT Runtime_templates
  263. PATTERN ${SVN_FOLDER_PATTERN} EXCLUDE )
  264. endif()
  265. #
  266. # sources
  267. #
  268. set( TARGET_LIST CACHE INTERNAL "" )
  269. add_subdirectory( src )
  270. #####################################################################
  271. # final checks and warnings
  272. #
  273. if( CMAKE_SIZEOF_VOID_P EQUAL 8 )
  274. message( WARNING "64bit should work, but is not recommended." )
  275. elseif( NOT CMAKE_SIZEOF_VOID_P EQUAL 4 )
  276. message( FATAL_ERROR "unexpected architecture (CMAKE_SIZEOF_VOID_P=${CMAKE_SIZEOF_VOID_P})" )
  277. endif()
  278. list( LENGTH TARGET_LIST _LEN )
  279. if( _LEN EQUAL 0 )
  280. message( FATAL_ERROR "no targets available" )
  281. endif()
  282. message( STATUS "Available targets:" )
  283. foreach( _TARGET IN ITEMS ${TARGET_LIST} )
  284. message( STATUS "\t${_TARGET}" )
  285. endforeach()