Scripting WIP
[oweals/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 # user-visible option to enable/disable gettext usage
9 OPTION(ENABLE_GETTEXT "Use GetText for internationalization" ON)
10
11 # this is only set to 1 if gettext is enabled _and_ available
12 set(USE_GETTEXT 0)
13
14 find_package(GettextLib)
15
16 if(GETTEXT_FOUND AND ENABLE_GETTEXT)
17         message(STATUS "gettext include path: ${GETTEXT_INCLUDE_DIR}")
18         message(STATUS "gettext msgfmt path: ${GETTEXT_MSGFMT}")
19         if(WIN32)
20                 message(STATUS "gettext library: ${GETTEXT_LIBRARY}")
21                 message(STATUS "gettext dll: ${GETTEXT_DLL}")
22                 message(STATUS "gettext iconv dll: ${GETTEXT_ICONV_DLL}")
23         endif()
24         set(USE_GETTEXT 1)
25         message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
26 elseif(GETTEXT_FOUND AND NOT ENABLE_GETTEXT)
27         MESSAGE(STATUS "GetText found but disabled;")
28 else(GETTEXT_FOUND AND ENABLE_GETTEXT)
29         message(STATUS "GetText disabled")
30 endif(GETTEXT_FOUND AND ENABLE_GETTEXT)
31
32 if(NOT MSVC)
33         set(USE_GPROF 0 CACHE BOOL "Use -pg flag for g++")
34 endif()
35
36 # Use cmake_config.h
37 add_definitions ( -DUSE_CMAKE_CONFIG_H )
38
39 if(WIN32)
40         # Windows
41         if(MSVC) # MSVC Specifics
42                 # Surpress some useless warnings
43                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
44         else() # Probably MinGW = GCC
45                 set(PLATFORM_LIBS ws2_32.lib)
46         endif()
47         # Zlib stuff
48         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
49                         CACHE PATH "Zlib include directory")
50         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
51                         CACHE FILEPATH "Path to zlibwapi.lib")
52         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
53                         CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
54         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
55                         CACHE PATH "irrlicht dir")
56 else()
57         # Unix probably
58         if(BUILD_CLIENT)
59                 find_package(X11 REQUIRED)
60                 find_package(OpenGL REQUIRED)
61                 find_package(JPEG REQUIRED)
62                 find_package(BZip2 REQUIRED)
63                 find_package(PNG REQUIRED)
64                 if(APPLE)
65                         FIND_LIBRARY(CARBON_LIB Carbon)
66                         FIND_LIBRARY(COCOA_LIB Cocoa)
67                         FIND_LIBRARY(IOKIT_LIB IOKit)
68                         mark_as_advanced(
69                                 CARBON_LIB
70                                 COCOA_LIB
71                                 IOKIT_LIB
72                         )
73                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
74                 endif(APPLE)
75         endif(BUILD_CLIENT)
76         find_package(ZLIB REQUIRED)
77         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
78         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
79         # This way Xxf86vm is found on OpenBSD too
80         find_library(XXF86VM_LIBRARY Xxf86vm)
81         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
82 endif()
83
84 find_package(Jthread REQUIRED)
85 find_package(Sqlite3 REQUIRED)
86
87 # TODO: Create proper find script for Lua
88 set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
89 set(LUA_LIBRARY "lua")
90
91 configure_file(
92         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
93         "${PROJECT_BINARY_DIR}/cmake_config.h"
94 )
95
96 set(common_SRCS
97         scriptapi.cpp
98         script.cpp
99         log.cpp
100         content_sao.cpp
101         mapgen.cpp
102         content_inventory.cpp
103         content_nodemeta.cpp
104         content_craft.cpp
105         content_mapnode.cpp
106         auth.cpp
107         collision.cpp
108         nodemetadata.cpp
109         serverobject.cpp
110         noise.cpp
111         mineral.cpp
112         porting.cpp
113         materials.cpp
114         defaultsettings.cpp
115         mapnode.cpp
116         voxel.cpp
117         inventory.cpp
118         debug.cpp
119         serialization.cpp
120         light.cpp
121         filesys.cpp
122         connection.cpp
123         environment.cpp
124         server.cpp
125         servercommand.cpp
126         socket.cpp
127         mapblock.cpp
128         mapsector.cpp
129         map.cpp
130         player.cpp
131         utility.cpp
132         test.cpp
133         sha1.cpp
134         base64.cpp
135         ban.cpp
136 )
137
138 # This gives us the icon
139 if(WIN32)
140         if(MINGW)
141                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
142                         COMMAND windres.exe -I${CMAKE_CURRENT_SOURCE_DIR}
143                         -i${CMAKE_CURRENT_SOURCE_DIR}/winresource.rc
144                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
145                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
146         else(MINGW) # Probably MSVC
147                 set(common_SRCS ${common_SRCS} winresource.rc)
148         endif(MINGW)
149 endif()
150
151 # Client sources
152 set(minetest_SRCS
153         ${common_SRCS}
154         MyBillboardSceneNode.cpp
155         content_mapblock.cpp
156         content_cao.cpp
157         mapblock_mesh.cpp
158         farmesh.cpp
159         keycode.cpp
160         camera.cpp
161         clouds.cpp
162         clientobject.cpp
163         guiMainMenu.cpp
164         guiKeyChangeMenu.cpp
165         guiMessageMenu.cpp
166         guiTextInputMenu.cpp
167         guiInventoryMenu.cpp
168         guiPauseMenu.cpp
169         guiPasswordChange.cpp
170         guiDeathScreen.cpp
171         client.cpp
172         tile.cpp
173         game.cpp
174         main.cpp
175 )
176
177 # Server sources
178 set(minetestserver_SRCS
179         ${common_SRCS}
180         servermain.cpp
181 )
182
183 include_directories(
184         ${PROJECT_BINARY_DIR}
185         ${IRRLICHT_INCLUDE_DIR}
186         ${ZLIB_INCLUDE_DIR}
187         ${CMAKE_BUILD_TYPE}
188         ${PNG_INCLUDE_DIR}
189         ${GETTEXT_INCLUDE_DIR}
190         ${JTHREAD_INCLUDE_DIR}
191         ${SQLITE3_INCLUDE_DIR}
192         ${LUA_INCLUDE_DIR}
193 )
194
195 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
196
197 if(BUILD_CLIENT)
198         add_executable(${PROJECT_NAME} ${minetest_SRCS})
199         target_link_libraries(
200                 ${PROJECT_NAME}
201                 ${ZLIB_LIBRARIES}
202                 ${IRRLICHT_LIBRARY}
203                 ${OPENGL_LIBRARIES}
204                 ${JPEG_LIBRARIES}
205                 ${BZIP2_LIBRARIES}
206                 ${PNG_LIBRARIES}
207                 ${X11_LIBRARIES}
208                 ${GETTEXT_LIBRARY}
209                 ${JTHREAD_LIBRARY}
210                 ${SQLITE3_LIBRARY}
211                 ${LUA_LIBRARY}
212                 ${PLATFORM_LIBS}
213                 ${CLIENT_PLATFORM_LIBS}
214         )
215 endif(BUILD_CLIENT)
216
217 if(BUILD_SERVER)
218         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
219         target_link_libraries(
220                 ${PROJECT_NAME}server
221                 ${ZLIB_LIBRARIES}
222                 ${JTHREAD_LIBRARY}
223                 ${SQLITE3_LIBRARY}
224                 ${LUA_LIBRARY}
225                 ${PLATFORM_LIBS}
226         )
227 endif(BUILD_SERVER)
228
229 #
230 # Set some optimizations and tweaks
231 #
232
233 include(CheckCXXCompilerFlag)
234
235 if(MSVC)
236         # Visual Studio
237
238         # EHa enables SEH exceptions (used for catching segfaults)
239         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")
240         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
241         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
242
243         # Debug build doesn't catch exceptions by itself
244         # Add some optimizations because otherwise it's VERY slow
245         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
246
247         # Flags for C files (sqlite)
248         # /MT = Link statically with standard library stuff
249         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
250         
251         if(BUILD_SERVER)
252                 set_target_properties(${PROJECT_NAME}server PROPERTIES
253                                 COMPILE_DEFINITIONS "SERVER")
254         endif(BUILD_SERVER)
255
256 else()
257         # Probably GCC
258         
259         if(WARN_ALL)
260                 set(RELEASE_WARNING_FLAGS "-Wall")
261         else()
262                 set(RELEASE_WARNING_FLAGS "")
263         endif()
264         
265         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
266                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
267                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
268                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
269                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
270         endif()
271         
272         if(APPLE)
273                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
274                 set(ARCH i386)
275         endif()
276
277         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
278         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS}")
279
280         if(USE_GPROF)
281                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
282         endif()
283         
284         if(BUILD_SERVER)
285                 set_target_properties(${PROJECT_NAME}server PROPERTIES
286                                 COMPILE_DEFINITIONS "SERVER")
287         endif(BUILD_SERVER)
288
289 endif()
290
291 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
292 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
293
294 #
295 # Installation
296 #
297
298 # Example configuration file
299 install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../minetest.conf.example" DESTINATION ${EXAMPLE_CONF_DIR})
300
301 if(BUILD_CLIENT)
302         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
303
304         file(GLOB images "${CMAKE_CURRENT_SOURCE_DIR}/../data/textures/*.png")
305         install(FILES ${images} DESTINATION ${DATADIR}/textures)
306
307         if(USE_GETTEXT)
308                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
309                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
310                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
311                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
312                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
313         endif()
314
315         if(WIN32)
316                 if(DEFINED IRRLICHT_DLL)
317                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
318                 endif()
319                 if(DEFINED ZLIB_DLL)
320                         install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
321                 endif()
322                 if(USE_GETTEXT)
323                         if(DEFINED GETTEXT_DLL)
324                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
325                         endif()
326                         if(DEFINED GETTEXT_ICONV_DLL)
327                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
328                         endif()
329                 endif(USE_GETTEXT)
330         endif()
331 endif(BUILD_CLIENT)
332
333 if(BUILD_SERVER)
334         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
335 endif(BUILD_SERVER)
336
337 if (USE_GETTEXT)
338         set(MO_FILES)
339
340         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
341                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
342                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
343                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
344
345                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
346                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
347                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
348
349                 add_custom_command(
350                         OUTPUT ${MO_FILE_PATH}
351                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
352                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
353                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
354                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
355                         )
356
357                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
358         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
359
360         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
361 endif(USE_GETTEXT)
362
363 # Subdirectories
364
365 if (JTHREAD_FOUND)
366 else (JTHREAD_FOUND)
367         add_subdirectory(jthread)
368 endif (JTHREAD_FOUND)
369
370 if (SQLITE3_FOUND)
371 else (SQLITE3_FOUND)
372         add_subdirectory(sqlite)
373 endif (SQLITE3_FOUND)
374
375 if (LUA_FOUND)
376 else (LUA_FOUND)
377         add_subdirectory(lua)
378 endif (LUA_FOUND)
379
380 #end