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