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