GUIScript: More PyObject* NULL checks.
[gemrb.git] / CMakeLists.txt
blob2289b190fb8b069f47fbaf663b7fdb128ee3c9f6
1 cmake_minimum_required(VERSION 2.4.4)
2 if(COMMAND cmake_policy)
3       cmake_policy(SET CMP0003 NEW)
4       cmake_policy(SET CMP0005 NEW)
5 endif(COMMAND cmake_policy)
7 # If the user specifies -DCMAKE_BUILD_TYPE on the command line, take their definition
8 # and dump it in the cache along with proper documentation, otherwise set CMAKE_BUILD_TYPE
9 # to Release prior to calling PROJECT()
10 IF(DEFINED CMAKE_BUILD_TYPE)
11    SET(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")
12 ELSE(DEFINED CMAKE_BUILD_TYPE)
13    SET(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")
14 ENDIF(DEFINED CMAKE_BUILD_TYPE)
16 PROJECT(gemrb)
17 # try to extract the version from the source
18 execute_process(
19   COMMAND sed -n "s/\#define VERSION_GEMRB .\\([^\"]*\\).$/\\1/p" ${CMAKE_CURRENT_SOURCE_DIR}/gemrb/includes/globals.h
20   OUTPUT_VARIABLE GEMRB_VERSION
21   RESULT_VARIABLE RC
22   OUTPUT_STRIP_TRAILING_WHITESPACE
24 if(${RC} GREATER 0) # lookup failed
25   set(GEMRB_VERSION "unknown")
26 endif(${RC} GREATER 0)
27 message("Detected version: ${GEMRB_VERSION}")
29 IF(PREFIX)
30   SET(PREFIX CACHE PATH "Abbreviation for CMAKE_INSTALL_PREFIX.")
31   SET(CMAKE_INSTALL_PREFIX ${PREFIX})
32 ENDIF(PREFIX)
34 if (NOT LAYOUT)
35         if (WIN32)
36                 set(LAYOUT "home")
37         else (WIN32)
38                 set(LAYOUT "fhs")
39         endif (WIN32)
40 endif (NOT LAYOUT)
42 SET(LAYOUT "${LAYOUT}" CACHE STRING "Directory layout.")
44 if (${LAYOUT} MATCHES "home")
45         IF( NOT PLUGIN_DIR )
46                 SET( PLUGIN_DIR ${CMAKE_INSTALL_PREFIX}/plugins )
47         ENDIF( NOT PLUGIN_DIR )
48         IF( NOT DATA_DIR )
49                 SET( DATA_DIR ${CMAKE_INSTALL_PREFIX} )
50         ENDIF( NOT DATA_DIR )
51         IF( NOT MAN_DIR )
52                 SET( MAN_DIR ${CMAKE_INSTALL_PREFIX}/man/man6 )
53         ENDIF( NOT MAN_DIR )
54         IF( NOT BIN_DIR )
55                 SET( BIN_DIR ${CMAKE_INSTALL_PREFIX} )
56         ENDIF( NOT BIN_DIR )
57         IF( NOT SYSCONF_DIR )
58                 SET( SYSCONF_DIR ${CMAKE_INSTALL_PREFIX} )
59         ENDIF( NOT SYSCONF_DIR )
60         IF( NOT LIB_DIR )
61                 SET( LIB_DIR ${CMAKE_INSTALL_PREFIX} )
62         ENDIF( NOT LIB_DIR )
63         IF( NOT DOC_DIR )
64                 SET( DOC_DIR ${CMAKE_INSTALL_PREFIX}/doc )
65         ENDIF( NOT DOC_DIR )
66         IF( NOT ICON_DIR )
67                 SET( ICON_DIR ${CMAKE_INSTALL_PREFIX} )
68         ENDIF( NOT ICON_DIR )
69         IF( NOT MENU_DIR )
70                 SET( MENU_DIR ${CMAKE_INSTALL_PREFIX} )
71         ENDIF( NOT MENU_DIR )
72 elseif (${LAYOUT} MATCHES "fhs")
73         IF( NOT LIB_DIR )
74                 SET( LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/gemrb )
75         ENDIF( NOT LIB_DIR )
76         IF( NOT PLUGIN_DIR )
77                 SET( PLUGIN_DIR ${LIB_DIR}/plugins )
78         ENDIF( NOT PLUGIN_DIR )
79         IF( NOT DATA_DIR )
80                 SET( DATA_DIR ${CMAKE_INSTALL_PREFIX}/share/gemrb )
81         ENDIF( NOT DATA_DIR )
82         IF( NOT MAN_DIR )
83                 SET( MAN_DIR ${CMAKE_INSTALL_PREFIX}/share/man/man6 )
84         ENDIF( NOT MAN_DIR )
85         IF( NOT BIN_DIR )
86                 SET( BIN_DIR ${CMAKE_INSTALL_PREFIX}/bin )
87         ENDIF( NOT BIN_DIR )
88         IF( NOT SYSCONF_DIR )
89                 if ( ${CMAKE_INSTALL_PREFIX} STREQUAL "/usr" )
90                         SET( SYSCONF_DIR /etc/gemrb )
91                 else ()
92                         SET( SYSCONF_DIR ${CMAKE_INSTALL_PREFIX}/etc/gemrb )
93                 endif ()
94         ENDIF( NOT SYSCONF_DIR )
95         IF( NOT DOC_DIR )
96                 SET( DOC_DIR ${CMAKE_INSTALL_PREFIX}/share/doc/gemrb )
97         ENDIF( NOT DOC_DIR )
98         IF( NOT ICON_DIR )
99                 SET( ICON_DIR ${CMAKE_INSTALL_PREFIX}/share/pixmaps )
100         ENDIF( NOT ICON_DIR )
101         IF( NOT MENU_DIR )
102                 SET( MENU_DIR ${CMAKE_INSTALL_PREFIX}/share/applications )
103         ENDIF( NOT MENU_DIR )
104 else (${LAYOUT} MATCHES "opt")
105         IF( NOT LIB_DIR )
106                 SET( LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib )
107         ENDIF( NOT LIB_DIR )
108         IF( NOT PLUGIN_DIR )
109                 SET( PLUGIN_DIR ${LIB_DIR}/plugins )
110         ENDIF( NOT PLUGIN_DIR )
111         IF( NOT DATA_DIR )
112                 SET( DATA_DIR ${CMAKE_INSTALL_PREFIX}/share/ )
113         ENDIF( NOT DATA_DIR )
114         IF( NOT MAN_DIR )
115                 SET( MAN_DIR ${CMAKE_INSTALL_PREFIX}/man/man6 )
116         ENDIF( NOT MAN_DIR )
117         IF( NOT BIN_DIR )
118                 SET( BIN_DIR ${CMAKE_INSTALL_PREFIX}/bin )
119         ENDIF( NOT BIN_DIR )
120         IF( NOT SYSCONF_DIR )
121                 SET( SYSCONF_DIR ${CMAKE_INSTALL_PREFIX}/etc )
122         ENDIF( NOT SYSCONF_DIR )
123         IF( NOT DOC_DIR )
124                 SET( DOC_DIR ${CMAKE_INSTALL_PREFIX}/share/doc/gemrb )
125         ENDIF( NOT DOC_DIR )
126         IF( NOT ICON_DIR )
127                 SET( ICON_DIR ${CMAKE_INSTALL_PREFIX}/share/pixmaps )
128         ENDIF( NOT ICON_DIR )
129         IF( NOT MENU_DIR )
130                 SET( MENU_DIR ${CMAKE_INSTALL_PREFIX}/share/applications )
131         ENDIF( NOT MENU_DIR )
132 endif (${LAYOUT} MATCHES "home")
135 IF(CMAKE_COMPILER_IS_GNUCXX)
136         if ( NOT DISABLE_WERROR )
137                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
138         endif ( NOT DISABLE_WERROR )
139         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -W -Wpointer-arith -Wcast-align")
140         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wno-format-y2k -Wno-long-long -fno-strict-aliasing")
141         # only export symbols explicitly marked to be exported.
142         INCLUDE(CheckCXXCompilerFlag)
143         CHECK_CXX_COMPILER_FLAG("-fvisibility=hidden" VISIBILITY_HIDDEN)
144         IF (VISIBILITY_HIDDEN)
145                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
146         ENDIF (VISIBILITY_HIDDEN)
147         if (WIN32)
148                 # GCC 4.5.0+ has shared libstdc++ without dllimport
149                 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--enable-auto-import")
150                 set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--enable-auto-import")
151         endif (WIN32)
152         # Ensure all plugin symbols exist.
153         if (NOT APPLE)
154                 set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-undefined")
155         endif (NOT APPLE)
156 ENDIF(CMAKE_COMPILER_IS_GNUCXX)
158 MESSAGE(STATUS "Looking for Python libraries")
159 INCLUDE(FindPythonLibs)
160 IF(PYTHON_LIBRARY)
161  MESSAGE(STATUS "Python Libraries Found")
162 ELSE(PYTHON_LIBRARY)
163  MESSAGE(FATAL_ERROR "Unable to find Python development libraries. Please get it from www.python.org")
164 ENDIF(PYTHON_LIBRARY)
166 MESSAGE(STATUS "Looking for openAL libraries")
167 INCLUDE(FindOpenAL)
168 IF(OPENAL_FOUND)
169  MESSAGE(STATUS "openal found")
170 ELSE(OPENAL_FOUND)
171  MESSAGE(ERROR "unable to find openal. please set OPENALDIR environment variable or get it from www.openal.org")
172 ENDIF(OPENAL_FOUND)
174 MESSAGE(STATUS "Looking for SDL")
175 INCLUDE(FindSDL)
176 IF(SDL_FOUND)
177  MESSAGE(STATUS "SDL found")
178 ELSE(SDL_FOUND)
179  MESSAGE(FATAL_ERROR "unable to find SDL. please get it from www.libsdl.org")
180 ENDIF(SDL_FOUND)
182 MESSAGE( STATUS "Looking for Zlib" )
183 #SET(ZLIB_FIND_REQUIRED TRUE)
184 INCLUDE(FindZLIB)
186 MESSAGE( STATUS "Looking for libPNG" )
187 INCLUDE(FindPNG)
188 IF(PNG_FOUND)
189  MESSAGE( STATUS "libPNG found" )
190 ELSE(PNG_FOUND)
191  MESSAGE( STATUS "WARNING : GemRB will be built without any PNG support. Get it from www.libpng.org" )
192 ENDIF(PNG_FOUND)
194 IF(UNIX)
195  MESSAGE(STATUS "Looking for dl library")
196  FIND_LIBRARY(DLD_LIBRARY_PATH dl dld)
197  IF(DLD_LIBRARY_PATH)
198   MESSAGE(STATUS "dl library found")
199  ELSE(DLD_LIBRARY_PATH)
200   MESSAGE(FATAL_ERROR "dl library not found")
201  ENDIF(DLD_LIBRARY_PATH)
202 ENDIF(UNIX)
204 MESSAGE(STATUS "Looking for Ogg Vorbis support")
205 FIND_LIBRARY(VORBIS_LIBRARY vorbisfile)
207 ADD_DEFINITIONS("-DHAVE_CONFIG_H")
209 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} gemrb/includes gemrb/core)
211 #Platform checks
212 INCLUDE (CheckTypeSize)
213 CHECK_TYPE_SIZE("int" SIZEOF_INT)
214 CHECK_TYPE_SIZE("long int" SIZEOF_LONG_INT)
216 INCLUDE (CheckFunctionExists)
217 CHECK_FUNCTION_EXISTS("snprintf" HAVE_SNPRINTF)
218 CHECK_FUNCTION_EXISTS("strndup" HAVE_STRNDUP)
220 #Unneeded on windows
221 IF(NOT WIN32)
222 INCLUDE (CheckCXXSourceCompiles)
223 CHECK_CXX_SOURCE_COMPILES("typedef void *(* voidvoid)(void);
225 void *object = 0;
226 voidvoid function;
227 function = (voidvoid) object;
228 " PERMITS_OBJECT_TO_FUNCTION_CAST)
230 IF( NOT PERMITS_OBJECT_TO_FUNCTION_CAST )
231  SET(HAVE_FORBIDDEN_OBJECT_TO_FUNCTION_CAST 1)
232 ENDIF( NOT PERMITS_OBJECT_TO_FUNCTION_CAST )
233 ENDIF(NOT WIN32)
235 IF(VORBIS_LIBRARY)
236  SET(HAS_VORBIS_SUPPORT 1)
237 ELSE(VORBIS_LIBRARY)
238  SET(VORBIS_LIBRARY "")
239 ENDIF(VORBIS_LIBRARY)
241 IF(APPLE)
242  FIND_LIBRARY(SDL_MAIN_LIBRARY_PATH SDLmain)
243  FIND_LIBRARY(COCOA_LIBRARY_PATH Cocoa)
244 ENDIF(APPLE)
246 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/cmake_config.h.in
247         ${CMAKE_CURRENT_BINARY_DIR}/config.h ESCAPE_QUOTES)
249 #Plugin addition macro
250 MACRO(ADD_GEMRB_PLUGIN plugin_name)
251         ADD_LIBRARY(${plugin_name} MODULE ${ARGN})
252         SET_TARGET_PROPERTIES(${plugin_name} PROPERTIES PREFIX ""
253                 INSTALL_RPATH ${LIB_DIR}
254                 LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/gemrb/plugins)
255         TARGET_LINK_LIBRARIES(${plugin_name} gemrb_core)
256         INSTALL(TARGETS ${plugin_name} DESTINATION ${PLUGIN_DIR})
257 ENDMACRO(ADD_GEMRB_PLUGIN)
259 #gemrb overrides macro
260 MACRO(ADD_GEMRB_OVERRIDE game_name)
261 FILE( GLOB FILES_TO_INSTALL *.2da *.bmp *.ini *.chu *.ids *.bcs *.vvc *.mos *.spl *.wav *.pro)
262 INSTALL( FILES ${FILES_TO_INSTALL} DESTINATION ${DATA_DIR}/override/${game_name} )
263 ENDMACRO(ADD_GEMRB_OVERRIDE )
265 ADD_SUBDIRECTORY( gemrb )
266 INSTALL( FILES gemrb.6 DESTINATION ${MAN_DIR} )
267 INSTALL( FILES artwork/gemrb-logo.png DESTINATION ${ICON_DIR} )
268 INSTALL( FILES gemrb.desktop DESTINATION ${MENU_DIR} )
269 INSTALL( FILES README INSTALL COPYING NEWS AUTHORS DESTINATION ${DOC_DIR} )
271 CONFIGURE_FILE(
272   "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
273   "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
274   IMMEDIATE @ONLY
277 # copy the variable, since the file uses @VERSION@
278 set(VERSION ${GEMRB_VERSION})
279 CONFIGURE_FILE(
280   "${CMAKE_CURRENT_SOURCE_DIR}/gemrb.spec.in"
281   "${CMAKE_CURRENT_BINARY_DIR}/gemrb.spec"
282   IMMEDIATE @ONLY
285 ADD_CUSTOM_TARGET( uninstall
286   "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" )
288 # make dist for a gzipped tarball of current HEAD
289 set(ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${GEMRB_VERSION})
290 add_custom_target( dist
291   COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD
292     | gzip --best > ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.gz
293   WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
296 message(STATUS "")
297 message(STATUS "These are the configured paths:")
298 message(STATUS "  PREFIX: ${CMAKE_INSTALL_PREFIX}")
299 message(STATUS "  LIB_DIR: ${LIB_DIR}")
300 message(STATUS "  PLUGIN_DIR: ${PLUGIN_DIR}")
301 message(STATUS "  BIN_DIR: ${BIN_DIR}")
302 message(STATUS "  DATA_DIR: ${DATA_DIR}")
303 message(STATUS "  MAN_DIR: ${MAN_DIR}")
304 message(STATUS "  SYSCONF_DIR: ${SYSCONF_DIR}")
305 message(STATUS "  DOC_DIR: ${DOC_DIR}")
306 message(STATUS "  ICON_DIR: ${ICON_DIR}")
307 message(STATUS "  MENU_DIR: ${MENU_DIR}")
308 message(STATUS "")