]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
Fix things for cross-compiling using mingw
[minetest.git] / src / CMakeLists.txt
1 project(minetest)
2 cmake_minimum_required( VERSION 2.6 )
3
4 if(RUN_IN_PLACE)
5         add_definitions ( -DRUN_IN_PLACE )
6 endif(RUN_IN_PLACE)
7
8 # Set some random things default to not being visible in the GUI
9 mark_as_advanced(EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH)
10 mark_as_advanced(JTHREAD_INCLUDE_DIR JTHREAD_LIBRARY)
11 mark_as_advanced(SQLITE3_INCLUDE_DIR SQLITE3_LIBRARY)
12
13 # user-visible option to enable/disable gettext usage
14 OPTION(ENABLE_GETTEXT "Use GetText for internationalization" 0)
15
16 # this is only set to 1 if gettext is enabled _and_ available
17 set(USE_GETTEXT 0)
18
19 if(ENABLE_GETTEXT)
20         find_package(GettextLib)
21 else()
22         MARK_AS_ADVANCED(GETTEXT_ICONV_DLL GETTEXT_INCLUDE_DIR GETTEXT_LIBRARY GETTEXT_MSGFMT)
23 endif()
24
25 if(GETTEXT_FOUND AND ENABLE_GETTEXT)
26         message(STATUS "gettext include path: ${GETTEXT_INCLUDE_DIR}")
27         message(STATUS "gettext msgfmt path: ${GETTEXT_MSGFMT}")
28         if(WIN32)
29                 message(STATUS "gettext library: ${GETTEXT_LIBRARY}")
30                 message(STATUS "gettext dll: ${GETTEXT_DLL}")
31                 message(STATUS "gettext iconv dll: ${GETTEXT_ICONV_DLL}")
32         endif()
33         set(USE_GETTEXT 1)
34         message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
35 elseif(GETTEXT_FOUND AND NOT ENABLE_GETTEXT)
36         MESSAGE(STATUS "GetText found but disabled;")
37 else(GETTEXT_FOUND AND ENABLE_GETTEXT)
38         message(STATUS "GetText disabled")
39 endif(GETTEXT_FOUND AND ENABLE_GETTEXT)
40
41 # user visible option to enable/disable sound
42 OPTION(ENABLE_SOUND "Enable sound" ON)
43
44 # this is only set to 1 if sound is enabled _and_ available
45 set(USE_SOUND 0)
46 set(SOUND_PROBLEM 0)
47
48 if(ENABLE_SOUND AND BUILD_CLIENT)
49         # Sound libraries
50         find_package(OpenAL)
51         find_package(Vorbis)
52         if(NOT OPENAL_FOUND)
53                 message(STATUS "Sound enabled, but OpenAL not found!")
54                 set(SOUND_PROBLEM 1)
55                 MARK_AS_ADVANCED(CLEAR OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
56         endif()
57         if(NOT VORBIS_FOUND)
58                 message(STATUS "Sound enabled, but Vorbis libraries not found!")
59                 set(SOUND_PROBLEM 1)
60                 MARK_AS_ADVANCED(CLEAR OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)
61         endif()
62         if(OPENAL_FOUND AND VORBIS_FOUND)
63                 set(USE_SOUND 1)
64                 message(STATUS "Sound enabled")
65         endif()
66 endif(ENABLE_SOUND AND BUILD_CLIENT)
67
68 if(SOUND_PROBLEM)
69         message(FATAL_ERROR "Sound enabled, but cannot be used.\n"
70                 "To continue, either fill in the required paths or disable sound. (-DENABLE_SOUND=0)")
71 endif()
72 if(USE_SOUND)
73         set(sound_SRCS sound_openal.cpp)
74         set(SOUND_INCLUDE_DIRS
75                 ${OPENAL_INCLUDE_DIR}
76                 ${VORBIS_INCLUDE_DIR}
77                 ${OGG_INCLUDE_DIR}
78                 )
79         set(SOUND_LIBRARIES
80                 ${OPENAL_LIBRARY}
81                 ${VORBIS_LIBRARIES}
82                 )
83 endif()
84
85 if(NOT MSVC)
86         set(USE_GPROF 0 CACHE BOOL "Use -pg flag for g++")
87 endif()
88
89 # Use cmake_config.h
90 add_definitions ( -DUSE_CMAKE_CONFIG_H )
91
92 if(WIN32)
93         # Windows
94         if(MSVC) # MSVC Specifics
95                 # Surpress some useless warnings
96                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
97         else() # Probably MinGW = GCC
98                 set(PLATFORM_LIBS ws2_32.lib)
99         endif()
100         # Zlib stuff
101         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
102                         CACHE PATH "Zlib include directory")
103         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
104                         CACHE FILEPATH "Path to zlibwapi.lib")
105         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
106                         CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
107         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
108                         CACHE PATH "irrlicht dir")
109         if(ENABLE_SOUND)
110                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
111                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
112                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
113                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
114         endif()
115 else()
116         # Unix probably
117         if(BUILD_CLIENT)
118                 find_package(X11 REQUIRED)
119                 find_package(OpenGL REQUIRED)
120                 find_package(JPEG REQUIRED)
121                 find_package(BZip2 REQUIRED)
122                 find_package(PNG REQUIRED)
123                 if(APPLE)
124                         FIND_LIBRARY(CARBON_LIB Carbon)
125                         FIND_LIBRARY(COCOA_LIB Cocoa)
126                         FIND_LIBRARY(IOKIT_LIB IOKit)
127                         mark_as_advanced(
128                                 CARBON_LIB
129                                 COCOA_LIB
130                                 IOKIT_LIB
131                         )
132                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
133                 endif(APPLE)
134         endif(BUILD_CLIENT)
135         find_package(ZLIB REQUIRED)
136         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
137         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
138         # This way Xxf86vm is found on OpenBSD too
139         find_library(XXF86VM_LIBRARY Xxf86vm)
140         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
141 endif()
142
143 find_package(Jthread REQUIRED)
144 find_package(Sqlite3 REQUIRED)
145
146 # TODO: Create proper find script for Lua
147 set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
148 set(LUA_LIBRARY "lua")
149
150 configure_file(
151         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
152         "${PROJECT_BINARY_DIR}/cmake_config.h"
153 )
154
155 set(common_SRCS
156         genericobject.cpp
157         voxelalgorithms.cpp
158         sound.cpp
159         quicktune.cpp
160         subgame.cpp
161         inventorymanager.cpp
162         mods.cpp
163         content_abm.cpp
164         craftdef.cpp
165         nameidmapping.cpp
166         itemdef.cpp
167         nodedef.cpp
168         object_properties.cpp
169         scriptapi.cpp
170         script.cpp
171         log.cpp
172         content_sao.cpp
173         mapgen.cpp
174         content_nodemeta.cpp
175         content_mapnode.cpp
176         collision.cpp
177         nodemetadata.cpp
178         serverobject.cpp
179         noise.cpp
180         porting.cpp
181         tool.cpp
182         defaultsettings.cpp
183         mapnode.cpp
184         voxel.cpp
185         inventory.cpp
186         debug.cpp
187         serialization.cpp
188         light.cpp
189         filesys.cpp
190         connection.cpp
191         environment.cpp
192         server.cpp
193         servercommand.cpp
194         socket.cpp
195         mapblock.cpp
196         mapsector.cpp
197         map.cpp
198         player.cpp
199         utility.cpp
200         test.cpp
201         sha1.cpp
202         base64.cpp
203         ban.cpp
204 )
205
206 # This gives us the icon
207 if(WIN32)
208         set(WINRESOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc)
209         if(MINGW)
210                 if(NOT CMAKE_RC_COMPILER)
211                         set(CMAKE_RC_COMPILER "windres.exe")
212                 endif()
213                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
214                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR}
215                         -i${WINRESOURCE_FILE}
216                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
217                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
218                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
219         else(MINGW) # Probably MSVC
220                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
221         endif(MINGW)
222 endif()
223
224 # Client sources
225 set(minetest_SRCS
226         ${common_SRCS}
227         ${sound_SRCS}
228         localplayer.cpp
229         sky.cpp
230         clientmap.cpp
231         content_cso.cpp
232         content_mapblock.cpp
233         content_cao.cpp
234         mesh.cpp
235         mapblock_mesh.cpp
236         farmesh.cpp
237         keycode.cpp
238         camera.cpp
239         clouds.cpp
240         clientobject.cpp
241         chat.cpp
242         guiMainMenu.cpp
243         guiKeyChangeMenu.cpp
244         guiMessageMenu.cpp
245         guiTextInputMenu.cpp
246         guiInventoryMenu.cpp
247         guiPauseMenu.cpp
248         guiPasswordChange.cpp
249         guiDeathScreen.cpp
250         guiChatConsole.cpp
251         guiCreateWorld.cpp
252         guiConfirmMenu.cpp
253         client.cpp
254         filecache.cpp
255         tile.cpp
256         game.cpp
257         main.cpp
258 )
259
260 # Server sources
261 set(minetestserver_SRCS
262         ${common_SRCS}
263         main.cpp
264 )
265
266 include_directories(
267         ${PROJECT_BINARY_DIR}
268         ${IRRLICHT_INCLUDE_DIR}
269         ${ZLIB_INCLUDE_DIR}
270         ${CMAKE_BUILD_TYPE}
271         ${PNG_INCLUDE_DIR}
272         ${GETTEXT_INCLUDE_DIR}
273         ${SOUND_INCLUDE_DIRS}
274         ${JTHREAD_INCLUDE_DIR}
275         ${SQLITE3_INCLUDE_DIR}
276         ${LUA_INCLUDE_DIR}
277 )
278
279 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
280
281 if(BUILD_CLIENT)
282         add_executable(${PROJECT_NAME} ${minetest_SRCS})
283         target_link_libraries(
284                 ${PROJECT_NAME}
285                 ${ZLIB_LIBRARIES}
286                 ${IRRLICHT_LIBRARY}
287                 ${OPENGL_LIBRARIES}
288                 ${JPEG_LIBRARIES}
289                 ${BZIP2_LIBRARIES}
290                 ${PNG_LIBRARIES}
291                 ${X11_LIBRARIES}
292                 ${GETTEXT_LIBRARY}
293                 ${SOUND_LIBRARIES}
294                 ${JTHREAD_LIBRARY}
295                 ${SQLITE3_LIBRARY}
296                 ${LUA_LIBRARY}
297                 ${PLATFORM_LIBS}
298                 ${CLIENT_PLATFORM_LIBS}
299         )
300 endif(BUILD_CLIENT)
301
302 if(BUILD_SERVER)
303         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
304         target_link_libraries(
305                 ${PROJECT_NAME}server
306                 ${ZLIB_LIBRARIES}
307                 ${JTHREAD_LIBRARY}
308                 ${SQLITE3_LIBRARY}
309                 ${LUA_LIBRARY}
310                 ${PLATFORM_LIBS}
311         )
312 endif(BUILD_SERVER)
313
314 #
315 # Set some optimizations and tweaks
316 #
317
318 include(CheckCXXCompilerFlag)
319
320 if(MSVC)
321         # Visual Studio
322
323         # EHa enables SEH exceptions (used for catching segfaults)
324         set(CMAKE_CXX_FLAGS_RELEASE "/EHa /O2 /Ob2 /Oi /Ot /Oy /GL /FD /MT /GS- /arch:SSE /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
325         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
326         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
327
328         # Debug build doesn't catch exceptions by itself
329         # Add some optimizations because otherwise it's VERY slow
330         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
331
332         # Flags for C files (sqlite)
333         # /MT = Link statically with standard library stuff
334         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
335         
336         if(BUILD_SERVER)
337                 set_target_properties(${PROJECT_NAME}server PROPERTIES
338                                 COMPILE_DEFINITIONS "SERVER")
339         endif(BUILD_SERVER)
340
341 else()
342         # Probably GCC
343         
344         if(WARN_ALL)
345                 set(RELEASE_WARNING_FLAGS "-Wall")
346         else()
347                 set(RELEASE_WARNING_FLAGS "")
348         endif()
349         
350         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
351                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
352                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
353                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
354                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
355         endif()
356
357         if(MINGW)
358                 set(OTHER_FLAGS "-mthreads -fexceptions")
359         endif()
360
361         if(APPLE)
362                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
363                 set(ARCH i386)
364         endif()
365
366         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
367         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}")
368
369         if(USE_GPROF)
370                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
371         endif()
372         
373         if(BUILD_SERVER)
374                 set_target_properties(${PROJECT_NAME}server PROPERTIES
375                                 COMPILE_DEFINITIONS "SERVER")
376         endif(BUILD_SERVER)
377
378 endif()
379
380 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
381 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
382
383 #
384 # Installation
385 #
386 if(WIN32)
387         if(DEFINED ZLIB_DLL)
388                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
389         endif()
390         if(USE_SOUND)
391                 if(OPENAL_DLL)
392                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
393                 endif()
394                 if(OGG_DLL)
395                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
396                 endif()
397                 if(VORBIS_DLL)
398                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
399                 endif()
400                 if(VORBISFILE_DLL)
401                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
402                 endif()
403         endif()
404 endif()
405
406 if(BUILD_CLIENT)
407         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
408
409         if(USE_GETTEXT)
410                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
411                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
412                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
413                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
414                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
415         endif()
416
417         if(WIN32)
418                 if(DEFINED IRRLICHT_DLL)
419                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
420                 endif()
421                 if(USE_GETTEXT)
422                         if(DEFINED GETTEXT_DLL)
423                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
424                         endif()
425                         if(DEFINED GETTEXT_ICONV_DLL)
426                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
427                         endif()
428                 endif(USE_GETTEXT)
429         endif()
430 endif(BUILD_CLIENT)
431
432 if(BUILD_SERVER)
433         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
434 endif(BUILD_SERVER)
435
436 if (USE_GETTEXT)
437         set(MO_FILES)
438
439         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
440                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
441                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
442                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
443
444                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
445                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
446                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
447
448                 add_custom_command(
449                         OUTPUT ${MO_FILE_PATH}
450                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
451                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
452                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
453                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
454                         )
455
456                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
457         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
458
459         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
460 endif(USE_GETTEXT)
461
462 # Subdirectories
463
464 if (JTHREAD_FOUND)
465 else (JTHREAD_FOUND)
466         add_subdirectory(jthread)
467 endif (JTHREAD_FOUND)
468
469 if (SQLITE3_FOUND)
470 else (SQLITE3_FOUND)
471         add_subdirectory(sqlite)
472 endif (SQLITE3_FOUND)
473
474 if (LUA_FOUND)
475 else (LUA_FOUND)
476         add_subdirectory(lua)
477 endif (LUA_FOUND)
478
479 #end