bffc1f7eb7306dfd2f0dec77076868ead98a4a48
[oweals/minetest.git] / src / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.6)
2
3 project(minetest)
4
5 INCLUDE(CheckIncludeFiles)
6
7 # Add custom SemiDebug build mode
8 set(CMAKE_CXX_FLAGS_SEMIDEBUG "-O1 -g -Wall -Wabi" CACHE STRING
9         "Flags used by the C++ compiler during semidebug builds."
10         FORCE
11 )
12 set(CMAKE_C_FLAGS_SEMIDEBUG "-O1 -g -Wall -pedantic" CACHE STRING
13         "Flags used by the C compiler during semidebug builds."
14         FORCE
15 )
16 mark_as_advanced(
17         CMAKE_CXX_FLAGS_SEMIDEBUG
18         CMAKE_C_FLAGS_SEMIDEBUG
19 )
20 set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING
21         "Choose the type of build. Options are: None Debug SemiDebug RelWithDebInfo MinSizeRel."
22         FORCE
23 )
24
25
26 # Set some random things default to not being visible in the GUI
27 mark_as_advanced(EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH)
28
29
30 if(NOT (BUILD_CLIENT OR BUILD_SERVER))
31         message(WARNING "Neither BUILD_CLIENT nor BUILD_SERVER is set! Setting BUILD_SERVER=true")
32         set(BUILD_SERVER TRUE)
33 endif()
34
35
36 option(ENABLE_CURL "Enable cURL support for fetching media" TRUE)
37 set(USE_CURL FALSE)
38
39 if(ENABLE_CURL)
40         find_package(CURL)
41         if (CURL_FOUND)
42                 message(STATUS "cURL support enabled.")
43                 set(USE_CURL TRUE)
44         endif()
45 else()
46         mark_as_advanced(CLEAR CURL_LIBRARY CURL_INCLUDE_DIR)
47 endif()
48
49 if(NOT USE_CURL)
50         if(BUILD_CLIENT)
51                 message(WARNING "cURL is required to load the server list")
52         endif()
53         if(BUILD_SERVER)
54                 message(WARNING "cURL is required to announce to the server list")
55         endif()
56 endif()
57
58
59 option(ENABLE_GETTEXT "Use GetText for internationalization" FALSE)
60 set(USE_GETTEXT FALSE)
61
62 if(ENABLE_GETTEXT)
63         find_package(GettextLib)
64         if(GETTEXT_FOUND)
65                 if(WIN32)
66                         message(STATUS "GetText library: ${GETTEXT_LIBRARY}")
67                         message(STATUS "GetText DLL: ${GETTEXT_DLL}")
68                         message(STATUS "GetText iconv DLL: ${GETTEXT_ICONV_DLL}")
69                 endif()
70                 set(USE_GETTEXT TRUE)
71                 message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
72         endif(GETTEXT_FOUND)
73 else()
74         mark_as_advanced(GETTEXT_ICONV_DLL GETTEXT_INCLUDE_DIR GETTEXT_LIBRARY GETTEXT_MSGFMT)
75         message(STATUS "GetText disabled.")
76 endif()
77
78
79 option(ENABLE_SOUND "Enable sound" TRUE)
80 set(USE_SOUND FALSE)
81
82 if(BUILD_CLIENT AND ENABLE_SOUND)
83         # Sound libraries
84         find_package(OpenAL)
85         find_package(Vorbis)
86         if(NOT OPENAL_FOUND)
87                 message(STATUS "Sound enabled, but OpenAL not found!")
88                 mark_as_advanced(CLEAR OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
89         endif()
90         if(NOT VORBIS_FOUND)
91                 message(STATUS "Sound enabled, but Vorbis libraries not found!")
92                 mark_as_advanced(CLEAR OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)
93         endif()
94         if(OPENAL_FOUND AND VORBIS_FOUND)
95                 set(USE_SOUND TRUE)
96                 message(STATUS "Sound enabled.")
97         else()
98                 message(FATAL_ERROR "Sound enabled, but cannot be used.\n"
99                         "To continue, either fill in the required paths or disable sound. (-DENABLE_SOUND=0)")
100         endif()
101 endif()
102
103 if(USE_SOUND)
104         set(sound_SRCS sound_openal.cpp)
105         set(SOUND_INCLUDE_DIRS
106                 ${OPENAL_INCLUDE_DIR}
107                 ${VORBIS_INCLUDE_DIR}
108                 ${OGG_INCLUDE_DIR}
109                 )
110         set(SOUND_LIBRARIES
111                 ${OPENAL_LIBRARY}
112                 ${VORBIS_LIBRARIES}
113                 )
114 endif()
115
116
117 option(ENABLE_GLES "Enable OpenGL ES support" FALSE)
118 mark_as_advanced(ENABLE_GLES)
119 if(ENABLE_GLES)
120         find_package(OpenGLES2)
121 endif()
122
123
124 option(ENABLE_FREETYPE "Enable FreeType2 (TrueType fonts and basic unicode support)" TRUE)
125 set(USE_FREETYPE FALSE)
126
127 if(ENABLE_FREETYPE)
128 ##
129 ## Note: FindFreetype.cmake seems to have been fixed in recent versions of
130 ## CMake. If issues persist, re-enable this workaround specificially for the
131 ## failing platforms.
132 ##
133 #       if(UNIX)
134 #               include(FindPkgConfig)
135 #               if(PKG_CONFIG_FOUND)
136 #                       pkg_check_modules(FREETYPE QUIET freetype2)
137 #                       if(FREETYPE_FOUND)
138 #                               SET(FREETYPE_PKGCONFIG_FOUND TRUE)
139 #                               SET(FREETYPE_LIBRARY ${FREETYPE_LIBRARIES})
140 #                               # Because CMake is idiotic
141 #                               string(REPLACE ";" " " FREETYPE_CFLAGS_STR ${FREETYPE_CFLAGS})
142 #                               string(REPLACE ";" " " FREETYPE_LDFLAGS_STR ${FREETYPE_LDFLAGS})
143 #                       endif(FREETYPE_FOUND)
144 #               endif(PKG_CONFIG_FOUND)
145 #       endif(UNIX)
146 #       if(NOT FREETYPE_FOUND)
147 #               find_package(Freetype)
148 #       endif()
149         find_package(Freetype)
150         if(FREETYPE_FOUND)
151                 message(STATUS "Freetype enabled.")
152                 set(USE_FREETYPE TRUE)
153                 set(CGUITTFONT_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cguittfont")
154                 set(CGUITTFONT_LIBRARY cguittfont)
155         endif()
156 endif(ENABLE_FREETYPE)
157
158 # LuaJIT
159 option(ENABLE_LUAJIT "Enable LuaJIT support" TRUE)
160 set(USE_LUAJIT FALSE)
161 if(ENABLE_LUAJIT)
162         find_package(LuaJIT)
163         if(LUAJIT_FOUND)
164                 set(USE_LUAJIT TRUE)
165         endif(LUAJIT_FOUND)
166 else()
167         message (STATUS "LuaJIT detection disabled! (ENABLE_LUAJIT=0)")
168 endif()
169 if(NOT USE_LUAJIT)
170         message(STATUS "LuaJIT not found, using bundled Lua.")
171         set(LUA_LIBRARY "lua")
172         set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
173         add_subdirectory(lua)
174 endif()
175
176 find_package(GMP REQUIRED)
177
178 option(ENABLE_CURSES "Enable ncurses console" TRUE)
179 set(USE_CURSES FALSE)
180
181 if(ENABLE_CURSES)
182         find_package(Ncursesw)
183         if(CURSES_FOUND)
184                 set(USE_CURSES TRUE)
185                 message(STATUS "ncurses console enabled.")
186                 include_directories(${CURSES_INCLUDE_DIRS})
187         else()
188                 message(STATUS "ncurses not found!")
189         endif()
190 endif(ENABLE_CURSES)
191
192 option(ENABLE_POSTGRESQL "Enable PostgreSQL backend" TRUE)
193 set(USE_POSTGRESQL FALSE)
194
195 if(ENABLE_POSTGRESQL)
196         find_program(POSTGRESQL_CONFIG_EXECUTABLE pg_config DOC "pg_config")
197         find_library(POSTGRESQL_LIBRARY pq)
198         if(POSTGRESQL_CONFIG_EXECUTABLE)
199                 execute_process(COMMAND ${POSTGRESQL_CONFIG_EXECUTABLE} --includedir-server
200                         OUTPUT_VARIABLE POSTGRESQL_SERVER_INCLUDE_DIRS
201                         OUTPUT_STRIP_TRAILING_WHITESPACE)
202                 execute_process(COMMAND ${POSTGRESQL_CONFIG_EXECUTABLE}
203                         OUTPUT_VARIABLE POSTGRESQL_CLIENT_INCLUDE_DIRS
204                         OUTPUT_STRIP_TRAILING_WHITESPACE)
205                 # This variable is case sensitive for the cmake PostgreSQL module
206                 set(PostgreSQL_ADDITIONAL_SEARCH_PATHS ${POSTGRESQL_SERVER_INCLUDE_DIRS} ${POSTGRESQL_CLIENT_INCLUDE_DIRS})
207         endif()
208
209         find_package("PostgreSQL")
210
211         if(POSTGRESQL_FOUND)
212                 set(USE_POSTGRESQL TRUE)
213                 message(STATUS "PostgreSQL backend enabled")
214                 # This variable is case sensitive, don't try to change it to POSTGRESQL_INCLUDE_DIR
215                 message(STATUS "PostgreSQL includes: ${PostgreSQL_INCLUDE_DIR}")
216                 include_directories(${PostgreSQL_INCLUDE_DIR})
217         else()
218                 message(STATUS "PostgreSQL not found!")
219         endif()
220 endif(ENABLE_POSTGRESQL)
221
222 option(ENABLE_LEVELDB "Enable LevelDB backend" TRUE)
223 set(USE_LEVELDB FALSE)
224
225 if(ENABLE_LEVELDB)
226         find_library(LEVELDB_LIBRARY leveldb)
227         find_path(LEVELDB_INCLUDE_DIR db.h PATH_SUFFIXES leveldb)
228         if(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
229                 set(USE_LEVELDB TRUE)
230                 message(STATUS "LevelDB backend enabled.")
231                 include_directories(${LEVELDB_INCLUDE_DIR})
232         else()
233                 message(STATUS "LevelDB not found!")
234         endif()
235 endif(ENABLE_LEVELDB)
236
237
238 OPTION(ENABLE_REDIS "Enable Redis backend" TRUE)
239 set(USE_REDIS FALSE)
240
241 if(ENABLE_REDIS)
242         find_library(REDIS_LIBRARY hiredis)
243         find_path(REDIS_INCLUDE_DIR hiredis.h PATH_SUFFIXES hiredis)
244         if(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
245                 set(USE_REDIS TRUE)
246                 message(STATUS "Redis backend enabled.")
247                 include_directories(${REDIS_INCLUDE_DIR})
248         else(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
249                 message(STATUS "Redis not found!")
250         endif(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
251 endif(ENABLE_REDIS)
252
253
254 find_package(SQLite3 REQUIRED)
255 find_package(Json REQUIRED)
256
257 OPTION(ENABLE_SPATIAL "Enable SpatialIndex AreaStore backend" TRUE)
258 set(USE_SPATIAL FALSE)
259
260 if(ENABLE_SPATIAL)
261         find_library(SPATIAL_LIBRARY spatialindex)
262         find_path(SPATIAL_INCLUDE_DIR spatialindex/SpatialIndex.h)
263         if(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
264                 set(USE_SPATIAL TRUE)
265                 message(STATUS "SpatialIndex AreaStore backend enabled.")
266                 include_directories(${SPATIAL_INCLUDE_DIR})
267         else(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
268                 message(STATUS "SpatialIndex not found!")
269         endif(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
270 endif(ENABLE_SPATIAL)
271
272
273 if(NOT MSVC)
274         set(USE_GPROF FALSE CACHE BOOL "Use -pg flag for g++")
275 endif()
276
277 # Use cmake_config.h
278 add_definitions(-DUSE_CMAKE_CONFIG_H)
279
280 if(WIN32)
281         # Windows
282         if(MSVC) # MSVC Specifics
283                 set(PLATFORM_LIBS dbghelp.lib ${PLATFORM_LIBS})
284                 # Surpress some useless warnings
285                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
286         else() # Probably MinGW = GCC
287                 set(PLATFORM_LIBS "")
288         endif()
289         set(PLATFORM_LIBS ws2_32.lib shlwapi.lib ${PLATFORM_LIBS})
290
291         # Zlib stuff
292         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
293                         CACHE PATH "Zlib include directory")
294         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
295                         CACHE FILEPATH "Path to zlibwapi.lib")
296         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
297                         CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
298         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
299                         CACHE PATH "irrlicht dir")
300         if(USE_FREETYPE)
301                 set(FREETYPE_INCLUDE_DIR_ft2build "${PROJECT_SOURCE_DIR}/../../freetype2/include/"
302                                 CACHE PATH "freetype include dir")
303                 set(FREETYPE_INCLUDE_DIR_freetype2 "${PROJECT_SOURCE_DIR}/../../freetype2/include/freetype"
304                                 CACHE PATH "freetype include dir")
305                 set(FREETYPE_LIBRARY "${PROJECT_SOURCE_DIR}/../../freetype2/objs/win32/vc2005/freetype247.lib"
306                                 CACHE FILEPATH "Path to freetype247.lib")
307         endif()
308         if(ENABLE_SOUND)
309                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
310                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
311                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
312                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
313         endif()
314 else()
315         # Unix probably
316         if(BUILD_CLIENT)
317                 find_package(X11 REQUIRED)
318                 find_package(OpenGL REQUIRED)
319                 find_package(JPEG REQUIRED)
320                 find_package(BZip2 REQUIRED)
321                 find_package(PNG REQUIRED)
322                 if(APPLE)
323                         find_library(CARBON_LIB Carbon)
324                         find_library(COCOA_LIB Cocoa)
325                         find_library(IOKIT_LIB IOKit)
326                         mark_as_advanced(
327                                 CARBON_LIB
328                                 COCOA_LIB
329                                 IOKIT_LIB
330                         )
331                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
332                 endif(APPLE)
333         endif(BUILD_CLIENT)
334         find_package(ZLIB REQUIRED)
335         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
336         if(APPLE)
337                 set(PLATFORM_LIBS "-framework CoreFoundation" ${PLATFORM_LIBS})
338         else()
339                 check_library_exists(rt clock_gettime "" HAVE_LIBRT)
340                 if (HAVE_LIBRT)
341                         set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
342                 endif(HAVE_LIBRT)
343         endif(APPLE)
344
345         # This way Xxf86vm is found on OpenBSD too
346         find_library(XXF86VM_LIBRARY Xxf86vm)
347         mark_as_advanced(XXF86VM_LIBRARY)
348         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
349
350         # Prefer local iconv if installed
351         find_library(ICONV_LIBRARY iconv)
352         mark_as_advanced(ICONV_LIBRARY)
353         if (ICONV_LIBRARY)
354                 set(PLATFORM_LIBS ${PLATFORM_LIBS} ${ICONV_LIBRARY})
355         endif()
356 endif()
357
358 check_include_files(endian.h HAVE_ENDIAN_H)
359
360 configure_file(
361         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
362         "${PROJECT_BINARY_DIR}/cmake_config.h"
363 )
364
365
366 # Add a target that always rebuilds cmake_config_githash.h
367 add_custom_target(GenerateVersion
368         COMMAND ${CMAKE_COMMAND}
369         -D "GENERATE_VERSION_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
370         -D "GENERATE_VERSION_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
371         -D "VERSION_STRING=${VERSION_STRING}"
372         -D "DEVELOPMENT_BUILD=${DEVELOPMENT_BUILD}"
373         -P "${CMAKE_SOURCE_DIR}/cmake/Modules/GenerateVersion.cmake"
374         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
375
376
377 add_subdirectory(threading)
378 add_subdirectory(network)
379 add_subdirectory(script)
380 add_subdirectory(unittest)
381 add_subdirectory(util)
382 add_subdirectory(irrlicht_changes)
383
384 set(common_SRCS
385         ban.cpp
386         cavegen.cpp
387         chat.cpp
388         clientiface.cpp
389         collision.cpp
390         content_abm.cpp
391         content_mapnode.cpp
392         content_nodemeta.cpp
393         content_sao.cpp
394         convert_json.cpp
395         craftdef.cpp
396         database-dummy.cpp
397         database-leveldb.cpp
398         database-postgresql.cpp
399         database-redis.cpp
400         database-sqlite3.cpp
401         database.cpp
402         debug.cpp
403         defaultsettings.cpp
404         dungeongen.cpp
405         emerge.cpp
406         environment.cpp
407         filesys.cpp
408         genericobject.cpp
409         gettext.cpp
410         httpfetch.cpp
411         inventory.cpp
412         inventorymanager.cpp
413         itemdef.cpp
414         light.cpp
415         log.cpp
416         map.cpp
417         mapblock.cpp
418         mapgen.cpp
419         mapgen_flat.cpp
420         mapgen_fractal.cpp
421         mapgen_singlenode.cpp
422         mapgen_v5.cpp
423         mapgen_v6.cpp
424         mapgen_v7.cpp
425         mapgen_valleys.cpp
426         mapnode.cpp
427         mapsector.cpp
428         mg_biome.cpp
429         mg_decoration.cpp
430         mg_ore.cpp
431         mg_schematic.cpp
432         mods.cpp
433         nameidmapping.cpp
434         nodedef.cpp
435         nodemetadata.cpp
436         nodetimer.cpp
437         noise.cpp
438         objdef.cpp
439         object_properties.cpp
440         pathfinder.cpp
441         player.cpp
442         porting.cpp
443         profiler.cpp
444         quicktune.cpp
445         rollback.cpp
446         rollback_interface.cpp
447         serialization.cpp
448         server.cpp
449         serverlist.cpp
450         serverobject.cpp
451         settings.cpp
452         socket.cpp
453         sound.cpp
454         staticobject.cpp
455         subgame.cpp
456         terminal_chat_console.cpp
457         tool.cpp
458         treegen.cpp
459         version.cpp
460         voxel.cpp
461         voxelalgorithms.cpp
462         ${common_network_SRCS}
463         ${JTHREAD_SRCS}
464         ${common_SCRIPT_SRCS}
465         ${UTIL_SRCS}
466         ${UNITTEST_SRCS}
467 )
468
469
470 # This gives us the icon and file version information
471 if(WIN32)
472         set(WINRESOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc")
473         if(MINGW)
474                 if(NOT CMAKE_RC_COMPILER)
475                         set(CMAKE_RC_COMPILER "windres.exe")
476                 endif()
477                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
478                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
479                         -i${WINRESOURCE_FILE}
480                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
481                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
482                         DEPENDS ${WINRESOURCE_FILE})
483                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
484         else(MINGW) # Probably MSVC
485                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
486         endif(MINGW)
487 endif()
488
489
490 # Client sources
491 if (BUILD_CLIENT)
492         add_subdirectory(client)
493 endif(BUILD_CLIENT)
494
495 set(client_SRCS
496         ${client_SRCS}
497         ${common_SRCS}
498         ${sound_SRCS}
499         ${client_network_SRCS}
500         ${client_irrlicht_changes_SRCS}
501         camera.cpp
502         client.cpp
503         clientmap.cpp
504         clientmedia.cpp
505         clientobject.cpp
506         clouds.cpp
507         content_cao.cpp
508         content_cso.cpp
509         content_mapblock.cpp
510         convert_json.cpp
511         drawscene.cpp
512         filecache.cpp
513         fontengine.cpp
514         game.cpp
515         guiChatConsole.cpp
516         guiEngine.cpp
517         guiFileSelectMenu.cpp
518         guiFormSpecMenu.cpp
519         guiKeyChangeMenu.cpp
520         guiPasswordChange.cpp
521         guiscalingfilter.cpp
522         guiTable.cpp
523         guiVolumeChange.cpp
524         hud.cpp
525         imagefilters.cpp
526         intlGUIEditBox.cpp
527         keycode.cpp
528         localplayer.cpp
529         main.cpp
530         mapblock_mesh.cpp
531         mesh.cpp
532         minimap.cpp
533         particles.cpp
534         shader.cpp
535         sky.cpp
536         wieldmesh.cpp
537         ${client_SCRIPT_SRCS}
538 )
539 list(SORT client_SRCS)
540
541 # Server sources
542 set(server_SRCS
543         ${common_SRCS}
544         main.cpp
545 )
546 list(SORT server_SRCS)
547
548 include_directories(
549         ${PROJECT_BINARY_DIR}
550         ${PROJECT_SOURCE_DIR}
551         ${IRRLICHT_INCLUDE_DIR}
552         ${ZLIB_INCLUDE_DIR}
553         ${CMAKE_BUILD_TYPE}
554         ${PNG_INCLUDE_DIR}
555         ${GETTEXT_INCLUDE_DIR}
556         ${SOUND_INCLUDE_DIRS}
557         ${SQLITE3_INCLUDE_DIR}
558         ${LUA_INCLUDE_DIR}
559         ${GMP_INCLUDE_DIR}
560         ${JSON_INCLUDE_DIR}
561         ${X11_INCLUDE_DIR}
562         ${PROJECT_SOURCE_DIR}/script
563 )
564
565
566 if(USE_FREETYPE)
567         include_directories(${FREETYPE_INCLUDE_DIRS} ${CGUITTFONT_INCLUDE_DIR})
568 endif()
569
570 if(USE_CURL)
571         include_directories(${CURL_INCLUDE_DIR})
572 endif()
573
574
575 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
576
577
578 if(BUILD_CLIENT)
579         add_executable(${PROJECT_NAME} ${client_SRCS})
580         add_dependencies(${PROJECT_NAME} GenerateVersion)
581         set(client_LIBS
582                 ${PROJECT_NAME}
583                 ${ZLIB_LIBRARIES}
584                 ${IRRLICHT_LIBRARY}
585                 ${OPENGL_LIBRARIES}
586                 ${JPEG_LIBRARIES}
587                 ${BZIP2_LIBRARIES}
588                 ${PNG_LIBRARIES}
589                 ${X11_LIBRARIES}
590                 ${GETTEXT_LIBRARY}
591                 ${SOUND_LIBRARIES}
592                 ${SQLITE3_LIBRARY}
593                 ${LUA_LIBRARY}
594                 ${GMP_LIBRARY}
595                 ${JSON_LIBRARY}
596                 ${OPENGLES2_LIBRARIES}
597                 ${PLATFORM_LIBS}
598                 ${CLIENT_PLATFORM_LIBS}
599         )
600         if(APPLE)
601                 target_link_libraries(
602                         ${client_LIBS}
603                         ${ICONV_LIBRARY}
604                 )
605         else()
606                 target_link_libraries(
607                         ${client_LIBS}
608                 )
609         endif()
610         if(USE_CURL)
611                 target_link_libraries(
612                         ${PROJECT_NAME}
613                         ${CURL_LIBRARY}
614                 )
615         endif()
616         if(USE_FREETYPE)
617                 if(FREETYPE_PKGCONFIG_FOUND)
618                         set_target_properties(${PROJECT_NAME}
619                                 PROPERTIES
620                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
621                         )
622                 endif()
623                 target_link_libraries(
624                         ${PROJECT_NAME}
625                         ${FREETYPE_LIBRARY}
626                         ${CGUITTFONT_LIBRARY}
627                 )
628         endif()
629         if (USE_CURSES)
630                 target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES})
631         endif()
632         if (USE_POSTGRESQL)
633                 target_link_libraries(${PROJECT_NAME} ${POSTGRESQL_LIBRARY})
634         endif()
635         if (USE_LEVELDB)
636                 target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
637         endif()
638         if (USE_REDIS)
639                 target_link_libraries(${PROJECT_NAME} ${REDIS_LIBRARY})
640         endif()
641         if (USE_SPATIAL)
642                 target_link_libraries(${PROJECT_NAME} ${SPATIAL_LIBRARY})
643         endif()
644 endif(BUILD_CLIENT)
645
646
647 if(BUILD_SERVER)
648         add_executable(${PROJECT_NAME}server ${server_SRCS})
649         add_dependencies(${PROJECT_NAME}server GenerateVersion)
650         target_link_libraries(
651                 ${PROJECT_NAME}server
652                 ${ZLIB_LIBRARIES}
653                 ${SQLITE3_LIBRARY}
654                 ${JSON_LIBRARY}
655                 ${GETTEXT_LIBRARY}
656                 ${LUA_LIBRARY}
657                 ${GMP_LIBRARY}
658                 ${PLATFORM_LIBS}
659         )
660         set_target_properties(${PROJECT_NAME}server PROPERTIES
661                         COMPILE_DEFINITIONS "SERVER")
662         if (USE_CURSES)
663                 target_link_libraries(${PROJECT_NAME}server ${CURSES_LIBRARIES})
664         endif()
665         if (USE_POSTGRESQL)
666                 target_link_libraries(${PROJECT_NAME}server ${POSTGRESQL_LIBRARY})
667         endif()
668         if (USE_LEVELDB)
669                 target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
670         endif()
671         if (USE_REDIS)
672                 target_link_libraries(${PROJECT_NAME}server ${REDIS_LIBRARY})
673         endif()
674         if (USE_SPATIAL)
675                 target_link_libraries(${PROJECT_NAME}server ${SPATIAL_LIBRARY})
676         endif()
677         if(USE_CURL)
678                 target_link_libraries(
679                         ${PROJECT_NAME}server
680                         ${CURL_LIBRARY}
681                 )
682         endif()
683 endif(BUILD_SERVER)
684
685
686 # Set some optimizations and tweaks
687
688 include(CheckCXXCompilerFlag)
689
690 if(MSVC)
691         # Visual Studio
692
693         # EHa enables SEH exceptions (used for catching segfaults)
694         set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /Ob2 /Oi /Ot /Oy /GL /FD /MT /GS- /arch:SSE /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
695         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
696         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
697
698         set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
699
700         # Debug build doesn't catch exceptions by itself
701         # Add some optimizations because otherwise it's VERY slow
702         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
703
704         # Flags for C files (sqlite)
705         # /MT = Link statically with standard library stuff
706         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
707 else()
708         # Probably GCC
709         if(APPLE)
710                 SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
711         endif()
712         if(WARN_ALL)
713                 set(RELEASE_WARNING_FLAGS "-Wall")
714         else()
715                 set(RELEASE_WARNING_FLAGS "")
716         endif()
717
718         if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
719                 # clang does not understand __extern_always_inline but libc headers use it
720                 set(OTHER_FLAGS "${OTHER_FLAGS} \"-D__extern_always_inline=extern __always_inline\"")
721                 set(OTHER_FLAGS "${OTHER_FLAGS} -Wsign-compare")
722         endif()
723
724         if(MINGW)
725                 set(OTHER_FLAGS "-mthreads -fexceptions")
726         endif()
727
728         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops")
729         if(APPLE)
730                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
731         else()
732                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -fomit-frame-pointer")
733         endif(APPLE)
734         set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
735         set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
736
737         if(USE_GPROF)
738                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
739         endif()
740 endif()
741
742
743 # Installation
744
745 if(WIN32)
746         if(USE_SOUND)
747                 if(OPENAL_DLL)
748                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
749                 endif()
750                 if(OGG_DLL)
751                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
752                 endif()
753                 if(VORBIS_DLL)
754                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
755                 endif()
756                 if(VORBISFILE_DLL)
757                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
758                 endif()
759         endif()
760         if(CURL_DLL)
761                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
762         endif()
763         if(ZLIB_DLL)
764                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
765         endif()
766         if(ZLIBWAPI_DLL)
767                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
768         endif()
769         if(FREETYPE_DLL)
770                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
771         endif()
772         if(SQLITE3_DLL)
773                 install(FILES ${SQLITE3_DLL} DESTINATION ${BINDIR})
774         endif()
775         if(LEVELDB_DLL)
776                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
777         endif()
778 endif()
779
780 if(BUILD_CLIENT)
781         install(TARGETS ${PROJECT_NAME}
782                 RUNTIME DESTINATION ${BINDIR}
783                 LIBRARY DESTINATION ${BINDIR}
784                 ARCHIVE DESTINATION ${BINDIR}
785                 BUNDLE DESTINATION .
786         )
787
788         if(APPLE)
789                 install(CODE "
790                         set(BU_CHMOD_BUNDLE_ITEMS ON)
791                         include(BundleUtilities)
792                         fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${BUNDLE_PATH}\" \"\" \"\${CMAKE_INSTALL_PREFIX}/${BINDIR}\")
793                 " COMPONENT Runtime)
794         endif()
795
796         if(USE_GETTEXT)
797                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
798                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
799                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
800                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
801                 endforeach()
802         endif()
803
804         if(WIN32)
805                 if(DEFINED IRRLICHT_DLL)
806                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
807                 endif()
808                 if(USE_GETTEXT)
809                         if(DEFINED GETTEXT_DLL)
810                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
811                         endif()
812                         if(DEFINED GETTEXT_ICONV_DLL)
813                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
814                         endif()
815                 endif()
816         endif()
817 endif(BUILD_CLIENT)
818
819 if(BUILD_SERVER)
820         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
821 endif()
822
823 if (USE_GETTEXT)
824         set(MO_FILES)
825
826         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
827                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME}.po")
828                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
829                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
830
831                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
832                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
833                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
834
835                 add_custom_command(
836                         OUTPUT ${MO_FILE_PATH}
837                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
838                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
839                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
840                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
841                         )
842
843                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
844         endforeach()
845
846         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
847 endif()
848
849
850 # Subdirectories
851
852 if (BUILD_CLIENT AND USE_FREETYPE)
853         add_subdirectory(cguittfont)
854 endif()
855