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