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