Find correct library for MSVC vs MingW in Winows
[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         if (GETTEXT_FOUND)
11                 add_definitions( -DUSE_GETTEXT )
12                 message(STATUS "gettext include path: ${GETTEXT_INCLUDE_DIR}")
13                 message(STATUS "gettext msgfmt path: ${GETTEXT_MSGFMT}")
14                 if(WIN32)
15                         message(STATUS "gettext library: ${GETTEXT_LIBRARY}")
16                         message(STATUS "gettext dll: ${GETTEXT_DLL}")
17                         message(STATUS "gettext iconv dll: ${GETTEXT_ICONV_DLL}")
18                 endif()
19                 message(STATUS "GetText enabled")
20         else()
21                 message(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         endif()
272
273         if(WIN32)
274                 if(DEFINED IRRLICHT_DLL)
275                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
276                 endif()
277                 if(DEFINED ZLIB_DLL)
278                         install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
279                 endif()
280                 if(USE_GETTEXT)
281                         if(DEFINED GETTEXT_DLL)
282                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
283                         endif()
284                         if(DEFINED GETTEXT_ICONV_DLL)
285                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
286                         endif()
287                 endif(USE_GETTEXT)
288         endif()
289 endif(BUILD_CLIENT)
290
291 if(BUILD_SERVER)
292         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
293 endif(BUILD_SERVER)
294
295 if (USE_GETTEXT)
296         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.")
297
298         add_custom_command(
299                         OUTPUT ${CMAKE_BINARY_DIR}/locale/de/LC_MESSAGES/minetest-delta.mo
300                         COMMAND ${GETTEXT_MSGFMT} -o ${CMAKE_BINARY_DIR}/locale/de/LC_MESSAGES/minetest-delta.mo ${CMAKE_SOURCE_DIR}/po/de/minetest-c55.po 
301                         DEPENDS 
302                                 ${CMAKE_BINARY_DIR}/locale/de/LC_MESSAGES
303                                 ${CMAKE_SOURCE_DIR}/po/de/minetest-c55.po
304                         WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/po/de
305                         COMMENT "mo-update [de]: Creating mo file."
306                         )
307         add_custom_target(translation_de ALL COMMENT "mo update [de]" DEPENDS ${CMAKE_BINARY_DIR}/locale/de/LC_MESSAGES/minetest-delta.mo)
308 endif(USE_GETTEXT)
309
310 # Subdirectories
311
312 if (JTHREAD_FOUND)
313 else (JTHREAD_FOUND)
314         add_subdirectory(jthread)
315 endif (JTHREAD_FOUND)
316
317 if (SQLITE3_FOUND)
318 else (SQLITE3_FOUND)
319 add_subdirectory(sqlite)
320 endif (SQLITE3_FOUND)
321
322 #end