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