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