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