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         luaentity_common.cpp
98         scriptapi.cpp
99         script.cpp
100         log.cpp
101         content_sao.cpp
102         mapgen.cpp
103         content_inventory.cpp
104         content_nodemeta.cpp
105         content_craft.cpp
106         content_mapnode.cpp
107         auth.cpp
108         collision.cpp
109         nodemetadata.cpp
110         serverobject.cpp
111         noise.cpp
112         mineral.cpp
113         porting.cpp
114         materials.cpp
115         defaultsettings.cpp
116         mapnode.cpp
117         voxel.cpp
118         inventory.cpp
119         debug.cpp
120         serialization.cpp
121         light.cpp
122         filesys.cpp
123         connection.cpp
124         environment.cpp
125         server.cpp
126         servercommand.cpp
127         socket.cpp
128         mapblock.cpp
129         mapsector.cpp
130         map.cpp
131         player.cpp
132         utility.cpp
133         test.cpp
134         sha1.cpp
135         base64.cpp
136         ban.cpp
137 )
138
139 # This gives us the icon
140 if(WIN32)
141         if(MINGW)
142                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
143                         COMMAND windres.exe -I${CMAKE_CURRENT_SOURCE_DIR}
144                         -i${CMAKE_CURRENT_SOURCE_DIR}/winresource.rc
145                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
146                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
147         else(MINGW) # Probably MSVC
148                 set(common_SRCS ${common_SRCS} winresource.rc)
149         endif(MINGW)
150 endif()
151
152 # Client sources
153 set(minetest_SRCS
154         ${common_SRCS}
155         MyBillboardSceneNode.cpp
156         content_mapblock.cpp
157         content_cao.cpp
158         mapblock_mesh.cpp
159         farmesh.cpp
160         keycode.cpp
161         camera.cpp
162         clouds.cpp
163         clientobject.cpp
164         guiMainMenu.cpp
165         guiKeyChangeMenu.cpp
166         guiMessageMenu.cpp
167         guiTextInputMenu.cpp
168         guiInventoryMenu.cpp
169         guiPauseMenu.cpp
170         guiPasswordChange.cpp
171         guiDeathScreen.cpp
172         client.cpp
173         tile.cpp
174         game.cpp
175         main.cpp
176 )
177
178 # Server sources
179 set(minetestserver_SRCS
180         ${common_SRCS}
181         servermain.cpp
182 )
183
184 include_directories(
185         ${PROJECT_BINARY_DIR}
186         ${IRRLICHT_INCLUDE_DIR}
187         ${ZLIB_INCLUDE_DIR}
188         ${CMAKE_BUILD_TYPE}
189         ${PNG_INCLUDE_DIR}
190         ${GETTEXT_INCLUDE_DIR}
191         ${JTHREAD_INCLUDE_DIR}
192         ${SQLITE3_INCLUDE_DIR}
193         ${LUA_INCLUDE_DIR}
194 )
195
196 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
197
198 if(BUILD_CLIENT)
199         add_executable(${PROJECT_NAME} ${minetest_SRCS})
200         target_link_libraries(
201                 ${PROJECT_NAME}
202                 ${ZLIB_LIBRARIES}
203                 ${IRRLICHT_LIBRARY}
204                 ${OPENGL_LIBRARIES}
205                 ${JPEG_LIBRARIES}
206                 ${BZIP2_LIBRARIES}
207                 ${PNG_LIBRARIES}
208                 ${X11_LIBRARIES}
209                 ${GETTEXT_LIBRARY}
210                 ${JTHREAD_LIBRARY}
211                 ${SQLITE3_LIBRARY}
212                 ${LUA_LIBRARY}
213                 ${PLATFORM_LIBS}
214                 ${CLIENT_PLATFORM_LIBS}
215         )
216 endif(BUILD_CLIENT)
217
218 if(BUILD_SERVER)
219         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
220         target_link_libraries(
221                 ${PROJECT_NAME}server
222                 ${ZLIB_LIBRARIES}
223                 ${JTHREAD_LIBRARY}
224                 ${SQLITE3_LIBRARY}
225                 ${LUA_LIBRARY}
226                 ${PLATFORM_LIBS}
227         )
228 endif(BUILD_SERVER)
229
230 #
231 # Set some optimizations and tweaks
232 #
233
234 include(CheckCXXCompilerFlag)
235
236 if(MSVC)
237         # Visual Studio
238
239         # EHa enables SEH exceptions (used for catching segfaults)
240         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")
241         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
242         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
243
244         # Debug build doesn't catch exceptions by itself
245         # Add some optimizations because otherwise it's VERY slow
246         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
247
248         # Flags for C files (sqlite)
249         # /MT = Link statically with standard library stuff
250         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
251         
252         if(BUILD_SERVER)
253                 set_target_properties(${PROJECT_NAME}server PROPERTIES
254                                 COMPILE_DEFINITIONS "SERVER")
255         endif(BUILD_SERVER)
256
257 else()
258         # Probably GCC
259         
260         if(WARN_ALL)
261                 set(RELEASE_WARNING_FLAGS "-Wall")
262         else()
263                 set(RELEASE_WARNING_FLAGS "")
264         endif()
265         
266         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
267                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
268                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
269                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
270                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
271         endif()
272         
273         if(APPLE)
274                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
275                 set(ARCH i386)
276         endif()
277
278         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
279         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS}")
280
281         if(USE_GPROF)
282                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
283         endif()
284         
285         if(BUILD_SERVER)
286                 set_target_properties(${PROJECT_NAME}server PROPERTIES
287                                 COMPILE_DEFINITIONS "SERVER")
288         endif(BUILD_SERVER)
289
290 endif()
291
292 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
293 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
294
295 #
296 # Installation
297 #
298
299 # Example configuration file
300 install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../minetest.conf.example" DESTINATION ${EXAMPLE_CONF_DIR})
301
302 if(BUILD_CLIENT)
303         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
304
305         file(GLOB images "${CMAKE_CURRENT_SOURCE_DIR}/../data/textures/*.png")
306         install(FILES ${images} DESTINATION ${DATADIR}/textures)
307
308         if(USE_GETTEXT)
309                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
310                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
311                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
312                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
313                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
314         endif()
315
316         if(WIN32)
317                 if(DEFINED IRRLICHT_DLL)
318                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
319                 endif()
320                 if(DEFINED ZLIB_DLL)
321                         install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
322                 endif()
323                 if(USE_GETTEXT)
324                         if(DEFINED GETTEXT_DLL)
325                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
326                         endif()
327                         if(DEFINED GETTEXT_ICONV_DLL)
328                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
329                         endif()
330                 endif(USE_GETTEXT)
331         endif()
332 endif(BUILD_CLIENT)
333
334 if(BUILD_SERVER)
335         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
336 endif(BUILD_SERVER)
337
338 if (USE_GETTEXT)
339         set(MO_FILES)
340
341         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
342                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
343                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
344                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
345
346                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
347                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
348                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
349
350                 add_custom_command(
351                         OUTPUT ${MO_FILE_PATH}
352                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
353                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
354                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
355                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
356                         )
357
358                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
359         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
360
361         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
362 endif(USE_GETTEXT)
363
364 # Subdirectories
365
366 if (JTHREAD_FOUND)
367 else (JTHREAD_FOUND)
368         add_subdirectory(jthread)
369 endif (JTHREAD_FOUND)
370
371 if (SQLITE3_FOUND)
372 else (SQLITE3_FOUND)
373         add_subdirectory(sqlite)
374 endif (SQLITE3_FOUND)
375
376 if (LUA_FOUND)
377 else (LUA_FOUND)
378         add_subdirectory(lua)
379 endif (LUA_FOUND)
380
381 #end