CMakeLists.txt 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768
  1. project(minetest)
  2. cmake_minimum_required( VERSION 2.6 )
  3. INCLUDE(CheckCSourceRuns)
  4. # Set some random things default to not being visible in the GUI
  5. mark_as_advanced(EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH)
  6. mark_as_advanced(SQLITE3_INCLUDE_DIR SQLITE3_LIBRARY)
  7. mark_as_advanced(JSON_INCLUDE_DIR JSON_LIBRARY)
  8. option(ENABLE_CURL "Enable cURL support for fetching media" 1)
  9. if (NOT ENABLE_CURL)
  10. mark_as_advanced(CLEAR CURL_LIBRARY CURL_INCLUDE_DIR)
  11. endif(NOT ENABLE_CURL)
  12. if( ENABLE_CURL )
  13. find_package(CURL)
  14. endif( ENABLE_CURL )
  15. set(USE_CURL 0)
  16. if (CURL_FOUND AND ENABLE_CURL)
  17. message(STATUS "cURL support enabled")
  18. set(USE_CURL 1)
  19. endif(CURL_FOUND AND ENABLE_CURL)
  20. # user-visible option to enable/disable gettext usage
  21. OPTION(ENABLE_GETTEXT "Use GetText for internationalization" 0)
  22. # this is only set to 1 if gettext is enabled _and_ available
  23. set(USE_GETTEXT 0)
  24. if(ENABLE_GETTEXT)
  25. find_package(GettextLib)
  26. else()
  27. MARK_AS_ADVANCED(GETTEXT_ICONV_DLL GETTEXT_INCLUDE_DIR GETTEXT_LIBRARY GETTEXT_MSGFMT)
  28. endif()
  29. if(GETTEXT_FOUND AND ENABLE_GETTEXT)
  30. message(STATUS "gettext include path: ${GETTEXT_INCLUDE_DIR}")
  31. message(STATUS "gettext msgfmt path: ${GETTEXT_MSGFMT}")
  32. if(WIN32)
  33. message(STATUS "gettext library: ${GETTEXT_LIBRARY}")
  34. message(STATUS "gettext dll: ${GETTEXT_DLL}")
  35. message(STATUS "gettext iconv dll: ${GETTEXT_ICONV_DLL}")
  36. endif()
  37. set(USE_GETTEXT 1)
  38. message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
  39. elseif(GETTEXT_FOUND AND NOT ENABLE_GETTEXT)
  40. MESSAGE(STATUS "GetText found but disabled;")
  41. else(GETTEXT_FOUND AND ENABLE_GETTEXT)
  42. message(STATUS "GetText disabled")
  43. endif(GETTEXT_FOUND AND ENABLE_GETTEXT)
  44. # user visible option to enable/disable sound
  45. OPTION(ENABLE_SOUND "Enable sound" ON)
  46. # this is only set to 1 if sound is enabled _and_ available
  47. set(USE_SOUND 0)
  48. set(SOUND_PROBLEM 0)
  49. if(ENABLE_SOUND AND BUILD_CLIENT)
  50. # Sound libraries
  51. find_package(OpenAL)
  52. find_package(Vorbis)
  53. if(NOT OPENAL_FOUND)
  54. message(STATUS "Sound enabled, but OpenAL not found!")
  55. set(SOUND_PROBLEM 1)
  56. MARK_AS_ADVANCED(CLEAR OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
  57. endif()
  58. if(NOT VORBIS_FOUND)
  59. message(STATUS "Sound enabled, but Vorbis libraries not found!")
  60. set(SOUND_PROBLEM 1)
  61. MARK_AS_ADVANCED(CLEAR OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)
  62. endif()
  63. if(OPENAL_FOUND AND VORBIS_FOUND)
  64. set(USE_SOUND 1)
  65. message(STATUS "Sound enabled")
  66. endif()
  67. endif(ENABLE_SOUND AND BUILD_CLIENT)
  68. if(SOUND_PROBLEM)
  69. message(FATAL_ERROR "Sound enabled, but cannot be used.\n"
  70. "To continue, either fill in the required paths or disable sound. (-DENABLE_SOUND=0)")
  71. endif()
  72. if(USE_SOUND)
  73. set(sound_SRCS sound_openal.cpp)
  74. set(SOUND_INCLUDE_DIRS
  75. ${OPENAL_INCLUDE_DIR}
  76. ${VORBIS_INCLUDE_DIR}
  77. ${OGG_INCLUDE_DIR}
  78. )
  79. set(SOUND_LIBRARIES
  80. ${OPENAL_LIBRARY}
  81. ${VORBIS_LIBRARIES}
  82. )
  83. endif()
  84. option(ENABLE_FREETYPE "Enable freetype2 (truetype fonts and basic unicode support)" OFF)
  85. set(USE_FREETYPE 0)
  86. if(ENABLE_FREETYPE)
  87. set(USE_FREETYPE 1)
  88. endif(ENABLE_FREETYPE)
  89. if(NOT MSVC)
  90. set(USE_GPROF 0 CACHE BOOL "Use -pg flag for g++")
  91. endif()
  92. # Use cmake_config.h
  93. add_definitions ( -DUSE_CMAKE_CONFIG_H )
  94. if(WIN32)
  95. # Windows
  96. if(MSVC) # MSVC Specifics
  97. # Surpress some useless warnings
  98. add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
  99. else() # Probably MinGW = GCC
  100. set(PLATFORM_LIBS ws2_32.lib)
  101. endif()
  102. # Zlib stuff
  103. set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
  104. CACHE PATH "Zlib include directory")
  105. set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
  106. CACHE FILEPATH "Path to zlibwapi.lib")
  107. set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
  108. CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
  109. set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
  110. CACHE PATH "irrlicht dir")
  111. if(USE_FREETYPE)
  112. set(FREETYPE_INCLUDE_DIR_ft2build "${PROJECT_SOURCE_DIR}/../../freetype2/include/"
  113. CACHE PATH "freetype include dir")
  114. set(FREETYPE_INCLUDE_DIR_freetype2 "${PROJECT_SOURCE_DIR}/../../freetype2/include/freetype"
  115. CACHE PATH "freetype include dir")
  116. set(FREETYPE_LIBRARY "${PROJECT_SOURCE_DIR}/../../freetype2/objs/win32/vc2005/freetype247.lib"
  117. CACHE FILEPATH "Path to freetype247.lib")
  118. endif(USE_FREETYPE)
  119. if(ENABLE_SOUND)
  120. set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
  121. set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
  122. set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
  123. set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
  124. endif()
  125. else()
  126. # Unix probably
  127. if(BUILD_CLIENT)
  128. find_package(X11 REQUIRED)
  129. find_package(OpenGL REQUIRED)
  130. find_package(JPEG REQUIRED)
  131. find_package(BZip2 REQUIRED)
  132. find_package(PNG REQUIRED)
  133. if(APPLE)
  134. FIND_LIBRARY(CARBON_LIB Carbon)
  135. FIND_LIBRARY(COCOA_LIB Cocoa)
  136. FIND_LIBRARY(IOKIT_LIB IOKit)
  137. mark_as_advanced(
  138. CARBON_LIB
  139. COCOA_LIB
  140. IOKIT_LIB
  141. )
  142. SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
  143. endif(APPLE)
  144. endif(BUILD_CLIENT)
  145. find_package(ZLIB REQUIRED)
  146. set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
  147. if(APPLE)
  148. set(PLATFORM_LIBS "-framework CoreFoundation" ${PLATFORM_LIBS})
  149. else()
  150. set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
  151. endif(APPLE)
  152. #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
  153. # This way Xxf86vm is found on OpenBSD too
  154. find_library(XXF86VM_LIBRARY Xxf86vm)
  155. mark_as_advanced(XXF86VM_LIBRARY)
  156. set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
  157. endif()
  158. find_package(Sqlite3 REQUIRED)
  159. find_package(Json REQUIRED)
  160. option(ENABLE_GLES "Enable OpenGL ES support" 0)
  161. mark_as_advanced(ENABLE_GLES)
  162. if(ENABLE_GLES)
  163. find_package(OpenGLES2)
  164. endif(ENABLE_GLES)
  165. if(USE_FREETYPE)
  166. if(UNIX)
  167. include(FindPkgConfig)
  168. if(PKG_CONFIG_FOUND)
  169. pkg_check_modules(FREETYPE QUIET freetype2)
  170. if(FREETYPE_FOUND)
  171. SET(FREETYPE_PKGCONFIG_FOUND TRUE)
  172. SET(FREETYPE_LIBRARY ${FREETYPE_LIBRARIES})
  173. # because cmake is idiotic
  174. string(REPLACE ";" " " FREETYPE_CFLAGS_STR ${FREETYPE_CFLAGS})
  175. string(REPLACE ";" " " FREETYPE_LDFLAGS_STR ${FREETYPE_LDFLAGS})
  176. endif(FREETYPE_FOUND)
  177. endif(PKG_CONFIG_FOUND)
  178. endif(UNIX)
  179. if(NOT FREETYPE_FOUND)
  180. find_package(Freetype REQUIRED)
  181. endif(NOT FREETYPE_FOUND)
  182. set(CGUITTFONT_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cguittfont")
  183. set(CGUITTFONT_LIBRARY cguittfont)
  184. endif(USE_FREETYPE)
  185. if (NOT DISABLE_LUAJIT)
  186. find_library(LUA_LIBRARY luajit
  187. NAMES luajit-5.1)
  188. find_path(LUA_INCLUDE_DIR luajit.h
  189. NAMES luajit.h
  190. PATH_SUFFIXES luajit-2.0)
  191. message (STATUS "LuaJIT library: ${LUA_LIBRARY}")
  192. message (STATUS "LuaJIT headers: ${LUA_INCLUDE_DIR}")
  193. else (NOT ${DISABLE_LUAJIT} MATCHES "1")
  194. message (STATUS "LuaJIT detection disabled! (DISABLE_LUAJIT=1)")
  195. set(LUA_LIBRARY "")
  196. set(LUA_INCLUDE_DIR "")
  197. endif (NOT DISABLE_LUAJIT)
  198. set(USE_LUAJIT 0)
  199. if(LUA_LIBRARY AND LUA_INCLUDE_DIR)
  200. message (STATUS "LuaJIT found, checking for broken versions...")
  201. if(CMAKE_CROSSCOMPILING)
  202. message(WARNING "Cross-compiling enabled, assuming LuaJIT is not broken")
  203. set(VALID_LUAJIT_VERSION 1)
  204. else(CMAKE_CROSSCOMPILING)
  205. set(BACKUP_REQUIRED_INCS CMAKE_REQUIRED_INCLUDES)
  206. set(CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES} ${LUA_INCLUDE_DIR}")
  207. CHECK_C_SOURCE_RUNS("
  208. #include <luajit.h>
  209. #include <stdio.h>
  210. #include <string.h>
  211. #define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
  212. static char *broken_luajit_versions[] = {
  213. \"LuaJIT 2.0.0-beta7\",
  214. \"LuaJIT 2.0.0-beta6\",
  215. \"LuaJIT 2.0.0-beta5\",
  216. \"LuaJIT 2.0.0-beta4\",
  217. \"LuaJIT 2.0.0-beta3\",
  218. \"LuaJIT 2.0.0-beta2\",
  219. \"LuaJIT 2.0.0-beta1\"
  220. };
  221. int main(int argc, char *argv[]) {
  222. unsigned int i;
  223. for (i = 0; i < ARRAYSIZE(broken_luajit_versions); i++) {
  224. if (strcmp(LUAJIT_VERSION, broken_luajit_versions[i]) == 0) {
  225. return 1;
  226. }
  227. }
  228. return 0;
  229. }
  230. "
  231. VALID_LUAJIT_VERSION)
  232. set(CMAKE_REQUIRED_INCLUDES BACKUP_REQUIRED_INCS)
  233. endif(CMAKE_CROSSCOMPILING)
  234. if (VALID_LUAJIT_VERSION)
  235. message (STATUS "LuaJIT version ok")
  236. set(USE_LUAJIT 1)
  237. else (VALID_LUAJIT_VERSION)
  238. message (STATUS "LuaJIT versions till 2.0.0beta7 known to be broken, update to at least beta8")
  239. set(USE_LUAJIT 0)
  240. endif (VALID_LUAJIT_VERSION)
  241. endif (LUA_LIBRARY AND LUA_INCLUDE_DIR)
  242. if(NOT USE_LUAJIT)
  243. message (STATUS "LuaJIT not found, using bundled Lua.")
  244. set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
  245. set(LUA_LIBRARY "lua")
  246. add_subdirectory(lua)
  247. endif(NOT USE_LUAJIT)
  248. mark_as_advanced(LUA_LIBRARY)
  249. mark_as_advanced(LUA_INCLUDE_DIR)
  250. set(USE_LEVELDB 0)
  251. OPTION(ENABLE_LEVELDB "Enable LevelDB backend")
  252. if(ENABLE_LEVELDB)
  253. find_library(LEVELDB_LIBRARY leveldb)
  254. find_path(LEVELDB_INCLUDE_DIR db.h PATH_SUFFIXES leveldb)
  255. message (STATUS "LevelDB library: ${LEVELDB_LIBRARY}")
  256. message (STATUS "LevelDB headers: ${LEVELDB_INCLUDE_DIR}")
  257. if(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
  258. set(USE_LEVELDB 1)
  259. message(STATUS "LevelDB backend enabled")
  260. include_directories(${LEVELDB_INCLUDE_DIR})
  261. else(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
  262. set(USE_LEVELDB 0)
  263. message(STATUS "LevelDB not found!")
  264. endif(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
  265. endif(ENABLE_LEVELDB)
  266. set(USE_REDIS 0)
  267. OPTION(ENABLE_REDIS "Enable redis backend" 1)
  268. if(ENABLE_REDIS)
  269. find_library(REDIS_LIBRARY hiredis)
  270. find_path(REDIS_INCLUDE_DIR hiredis.h PATH_SUFFIXES hiredis)
  271. message(STATUS "redis library: ${REDIS_LIBRARY}")
  272. message(STATUS "redis headers: ${REDIS_INCLUDE_DIR}")
  273. if(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
  274. set(USE_REDIS 1)
  275. message(STATUS "redis backend enabled")
  276. include_directories(${REDIS_INCLUDE_DIR})
  277. else(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
  278. set(USE_REDIS 0)
  279. message(STATUS "redis not found!")
  280. endif(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
  281. endif(ENABLE_REDIS)
  282. configure_file(
  283. "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
  284. "${PROJECT_BINARY_DIR}/cmake_config.h"
  285. )
  286. # Add a target that always rebuilds cmake_config_githash.h
  287. add_custom_target(GenerateVersion
  288. COMMAND ${CMAKE_COMMAND}
  289. -D "GENERATE_VERSION_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
  290. -D "GENERATE_VERSION_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
  291. -D "VERSION_STRING=${VERSION_STRING}"
  292. -D "VERSION_EXTRA=${VERSION_EXTRA}"
  293. -P "${CMAKE_SOURCE_DIR}/cmake/Modules/GenerateVersion.cmake"
  294. WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
  295. add_subdirectory(jthread)
  296. add_subdirectory(script)
  297. add_subdirectory(util)
  298. set(common_SRCS
  299. version.cpp
  300. rollback_interface.cpp
  301. rollback.cpp
  302. genericobject.cpp
  303. voxelalgorithms.cpp
  304. sound.cpp
  305. quicktune.cpp
  306. subgame.cpp
  307. inventorymanager.cpp
  308. mods.cpp
  309. content_abm.cpp
  310. craftdef.cpp
  311. nameidmapping.cpp
  312. itemdef.cpp
  313. nodedef.cpp
  314. object_properties.cpp
  315. log.cpp
  316. content_sao.cpp
  317. emerge.cpp
  318. mapgen.cpp
  319. mapgen_v6.cpp
  320. mapgen_v7.cpp
  321. mapgen_singlenode.cpp
  322. treegen.cpp
  323. dungeongen.cpp
  324. cavegen.cpp
  325. content_nodemeta.cpp
  326. content_mapnode.cpp
  327. collision.cpp
  328. nodemetadata.cpp
  329. nodetimer.cpp
  330. serverobject.cpp
  331. noise.cpp
  332. porting.cpp
  333. tool.cpp
  334. defaultsettings.cpp
  335. mapnode.cpp
  336. voxel.cpp
  337. inventory.cpp
  338. debug.cpp
  339. serialization.cpp
  340. light.cpp
  341. filesys.cpp
  342. connection.cpp
  343. environment.cpp
  344. server.cpp
  345. clientiface.cpp
  346. socket.cpp
  347. mapblock.cpp
  348. mapsector.cpp
  349. map.cpp
  350. database.cpp
  351. database-dummy.cpp
  352. database-leveldb.cpp
  353. database-sqlite3.cpp
  354. database-redis.cpp
  355. player.cpp
  356. test.cpp
  357. sha1.cpp
  358. base64.cpp
  359. ban.cpp
  360. biome.cpp
  361. staticobject.cpp
  362. serverlist.cpp
  363. pathfinder.cpp
  364. convert_json.cpp
  365. gettext.cpp
  366. httpfetch.cpp
  367. ${JTHREAD_SRCS}
  368. ${common_SCRIPT_SRCS}
  369. ${UTIL_SRCS}
  370. )
  371. # This gives us the icon and file version information
  372. if(WIN32)
  373. set(WINRESOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc)
  374. if(MINGW)
  375. if(NOT CMAKE_RC_COMPILER)
  376. set(CMAKE_RC_COMPILER "windres.exe")
  377. endif()
  378. ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
  379. COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
  380. -i${WINRESOURCE_FILE}
  381. -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
  382. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  383. DEPENDS ${WINRESOURCE_FILE})
  384. SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
  385. else(MINGW) # Probably MSVC
  386. set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
  387. endif(MINGW)
  388. endif()
  389. # Client sources
  390. set(minetest_SRCS
  391. ${common_SRCS}
  392. ${sound_SRCS}
  393. localplayer.cpp
  394. sky.cpp
  395. clientmap.cpp
  396. content_cso.cpp
  397. content_mapblock.cpp
  398. content_cao.cpp
  399. mesh.cpp
  400. mapblock_mesh.cpp
  401. keycode.cpp
  402. camera.cpp
  403. clouds.cpp
  404. particles.cpp
  405. clientobject.cpp
  406. chat.cpp
  407. hud.cpp
  408. guiKeyChangeMenu.cpp
  409. guiFormSpecMenu.cpp
  410. guiTable.cpp
  411. guiPasswordChange.cpp
  412. guiVolumeChange.cpp
  413. guiChatConsole.cpp
  414. client.cpp
  415. clientmedia.cpp
  416. filecache.cpp
  417. tile.cpp
  418. shader.cpp
  419. game.cpp
  420. main.cpp
  421. guiEngine.cpp
  422. guiFileSelectMenu.cpp
  423. convert_json.cpp
  424. drawscene.cpp
  425. ${minetest_SCRIPT_SRCS}
  426. )
  427. list(SORT minetest_SRCS)
  428. # Server sources
  429. set(minetestserver_SRCS
  430. ${common_SRCS}
  431. main.cpp
  432. )
  433. list(SORT minetestserver_SRCS)
  434. include_directories(
  435. ${PROJECT_BINARY_DIR}
  436. ${PROJECT_SOURCE_DIR}
  437. ${IRRLICHT_INCLUDE_DIR}
  438. ${ZLIB_INCLUDE_DIR}
  439. ${CMAKE_BUILD_TYPE}
  440. ${PNG_INCLUDE_DIR}
  441. ${GETTEXT_INCLUDE_DIR}
  442. ${SOUND_INCLUDE_DIRS}
  443. ${SQLITE3_INCLUDE_DIR}
  444. ${LUA_INCLUDE_DIR}
  445. ${JSON_INCLUDE_DIR}
  446. ${PROJECT_SOURCE_DIR}/script
  447. )
  448. if(USE_FREETYPE)
  449. include_directories(
  450. ${FREETYPE_INCLUDE_DIRS}
  451. ${CGUITTFONT_INCLUDE_DIR}
  452. )
  453. endif(USE_FREETYPE)
  454. if(USE_CURL)
  455. include_directories(
  456. ${CURL_INCLUDE_DIR}
  457. )
  458. endif(USE_CURL)
  459. set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
  460. if(BUILD_CLIENT)
  461. add_executable(${PROJECT_NAME} ${minetest_SRCS})
  462. add_dependencies(${PROJECT_NAME} GenerateVersion)
  463. set(minetest_LIBS
  464. ${PROJECT_NAME}
  465. ${ZLIB_LIBRARIES}
  466. ${IRRLICHT_LIBRARY}
  467. ${OPENGL_LIBRARIES}
  468. ${JPEG_LIBRARIES}
  469. ${BZIP2_LIBRARIES}
  470. ${PNG_LIBRARIES}
  471. ${X11_LIBRARIES}
  472. ${GETTEXT_LIBRARY}
  473. ${SOUND_LIBRARIES}
  474. ${SQLITE3_LIBRARY}
  475. ${LUA_LIBRARY}
  476. ${JSON_LIBRARY}
  477. ${OPENGLES2_LIBRARIES}
  478. ${PLATFORM_LIBS}
  479. ${CLIENT_PLATFORM_LIBS}
  480. )
  481. if(APPLE)
  482. target_link_libraries(
  483. ${minetest_LIBS}
  484. ${ICONV_LIBRARY}
  485. )
  486. else()
  487. target_link_libraries(
  488. ${minetest_LIBS}
  489. )
  490. endif()
  491. if(USE_CURL)
  492. target_link_libraries(
  493. ${PROJECT_NAME}
  494. ${CURL_LIBRARY}
  495. )
  496. endif(USE_CURL)
  497. if(USE_FREETYPE)
  498. if(FREETYPE_PKGCONFIG_FOUND)
  499. set_target_properties(${PROJECT_NAME}
  500. PROPERTIES
  501. COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
  502. )
  503. endif(FREETYPE_PKGCONFIG_FOUND)
  504. target_link_libraries(
  505. ${PROJECT_NAME}
  506. ${FREETYPE_LIBRARY}
  507. ${CGUITTFONT_LIBRARY}
  508. )
  509. endif(USE_FREETYPE)
  510. if (USE_LEVELDB)
  511. target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
  512. endif(USE_LEVELDB)
  513. if (USE_REDIS)
  514. target_link_libraries(${PROJECT_NAME} ${REDIS_LIBRARY})
  515. endif(USE_REDIS)
  516. endif(BUILD_CLIENT)
  517. if(BUILD_SERVER)
  518. add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
  519. add_dependencies(${PROJECT_NAME}server GenerateVersion)
  520. target_link_libraries(
  521. ${PROJECT_NAME}server
  522. ${ZLIB_LIBRARIES}
  523. ${SQLITE3_LIBRARY}
  524. ${JSON_LIBRARY}
  525. ${GETTEXT_LIBRARY}
  526. ${LUA_LIBRARY}
  527. ${PLATFORM_LIBS}
  528. )
  529. if (USE_LEVELDB)
  530. target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
  531. endif(USE_LEVELDB)
  532. if (USE_REDIS)
  533. target_link_libraries(${PROJECT_NAME}server ${REDIS_LIBRARY})
  534. endif(USE_REDIS)
  535. if(USE_CURL)
  536. target_link_libraries(
  537. ${PROJECT_NAME}server
  538. ${CURL_LIBRARY}
  539. )
  540. endif(USE_CURL)
  541. endif(BUILD_SERVER)
  542. #
  543. # Set some optimizations and tweaks
  544. #
  545. include(CheckCXXCompilerFlag)
  546. if(MSVC)
  547. # Visual Studio
  548. # EHa enables SEH exceptions (used for catching segfaults)
  549. set(CMAKE_CXX_FLAGS_RELEASE "/EHa /O2 /Ob2 /Oi /Ot /Oy /GL /FD /MT /GS- /arch:SSE /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
  550. #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
  551. set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
  552. # Debug build doesn't catch exceptions by itself
  553. # Add some optimizations because otherwise it's VERY slow
  554. set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
  555. # Flags for C files (sqlite)
  556. # /MT = Link statically with standard library stuff
  557. set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
  558. if(BUILD_SERVER)
  559. set_target_properties(${PROJECT_NAME}server PROPERTIES
  560. COMPILE_DEFINITIONS "SERVER")
  561. endif(BUILD_SERVER)
  562. else()
  563. # Probably GCC
  564. if(APPLE)
  565. SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
  566. endif()
  567. if(WARN_ALL)
  568. set(RELEASE_WARNING_FLAGS "-Wall")
  569. else()
  570. set(RELEASE_WARNING_FLAGS "")
  571. endif()
  572. if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  573. CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
  574. if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
  575. set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
  576. endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
  577. endif()
  578. if(MINGW)
  579. set(OTHER_FLAGS "-mthreads -fexceptions")
  580. endif()
  581. set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops")
  582. if(APPLE)
  583. set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
  584. else()
  585. set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -fomit-frame-pointer")
  586. endif(APPLE)
  587. set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}")
  588. if(USE_GPROF)
  589. set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
  590. endif()
  591. if(BUILD_SERVER)
  592. set_target_properties(${PROJECT_NAME}server PROPERTIES
  593. COMPILE_DEFINITIONS "SERVER")
  594. endif(BUILD_SERVER)
  595. endif()
  596. #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
  597. #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
  598. #
  599. # Installation
  600. #
  601. if(WIN32)
  602. if(USE_SOUND)
  603. if(OPENAL_DLL)
  604. install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
  605. endif()
  606. if(OGG_DLL)
  607. install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
  608. endif()
  609. if(VORBIS_DLL)
  610. install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
  611. endif()
  612. if(VORBISFILE_DLL)
  613. install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
  614. endif()
  615. endif()
  616. if(CURL_DLL)
  617. install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
  618. endif()
  619. if(ZLIB_DLL)
  620. install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
  621. endif()
  622. if(ZLIBWAPI_DLL)
  623. install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
  624. endif()
  625. if(FREETYPE_DLL)
  626. install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
  627. endif()
  628. if(LEVELDB_DLL)
  629. install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
  630. endif()
  631. endif()
  632. if(BUILD_CLIENT)
  633. install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
  634. if(USE_GETTEXT)
  635. foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
  636. set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
  637. set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
  638. install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
  639. endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
  640. endif()
  641. if(WIN32)
  642. if(DEFINED IRRLICHT_DLL)
  643. install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
  644. endif()
  645. if(USE_GETTEXT)
  646. if(DEFINED GETTEXT_DLL)
  647. install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
  648. endif()
  649. if(DEFINED GETTEXT_ICONV_DLL)
  650. install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
  651. endif()
  652. endif(USE_GETTEXT)
  653. endif()
  654. endif(BUILD_CLIENT)
  655. if(BUILD_SERVER)
  656. install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
  657. endif(BUILD_SERVER)
  658. if (USE_GETTEXT)
  659. set(MO_FILES)
  660. foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
  661. set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
  662. set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
  663. set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
  664. add_custom_command(OUTPUT ${MO_BUILD_PATH}
  665. COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
  666. COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
  667. add_custom_command(
  668. OUTPUT ${MO_FILE_PATH}
  669. COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
  670. DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
  671. WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
  672. COMMENT "mo-update [${LOCALE}]: Creating mo file."
  673. )
  674. set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
  675. endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
  676. add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
  677. endif(USE_GETTEXT)
  678. # Subdirectories
  679. if (SQLITE3_FOUND)
  680. else (SQLITE3_FOUND)
  681. add_subdirectory(sqlite)
  682. endif (SQLITE3_FOUND)
  683. if (BUILD_CLIENT AND USE_FREETYPE)
  684. add_subdirectory(cguittfont)
  685. endif (BUILD_CLIENT AND USE_FREETYPE)
  686. if (JSON_FOUND)
  687. else (JSON_FOUND)
  688. add_subdirectory(json)
  689. endif (JSON_FOUND)
  690. #end