Upload 2.0.2
[physicsfs] / CMakeLists.txt
1 # PhysicsFS; a portable, flexible file i/o abstraction.
2 # Copyright (C) 2007  Ryan C. Gordon.
3 #
4 # Please see the file LICENSE.txt in the source's root directory.
5
6 CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
7
8 PROJECT(PhysicsFS)
9 SET(PHYSFS_VERSION 2.0.2)
10
11 # Increment this if/when we break backwards compatibility.
12 SET(PHYSFS_SOVERSION 1)
13
14 # I hate that they define "WIN32" ... we're about to move to Win64...I hope!
15 IF(WIN32 AND NOT WINDOWS)
16     SET(WINDOWS TRUE)
17 ENDIF(WIN32 AND NOT WINDOWS)
18
19 # Bleh, let's do it for "APPLE" too.
20 IF(APPLE AND NOT MACOSX)
21     SET(MACOSX TRUE)
22 ENDIF(APPLE AND NOT MACOSX)
23
24 INCLUDE(CheckIncludeFile)
25 INCLUDE(CheckLibraryExists)
26 INCLUDE(CheckCSourceCompiles)
27
28 INCLUDE_DIRECTORIES(.)
29 #INCLUDE_DIRECTORIES(platform)
30 #INCLUDE_DIRECTORIES(archivers)
31
32 IF(MACOSX)
33     # Fallback to older OS X on PowerPC to support wider range of systems...
34     IF(CMAKE_OSX_ARCHITECTURES MATCHES ppc)
35         ADD_DEFINITIONS(-DMAC_OS_X_VERSION_MIN_REQUIRED=1020)
36         SET(OTHER_LDFLAGS ${OTHER_LDFLAGS} " -mmacosx-version-min=10.2")
37     ENDIF(CMAKE_OSX_ARCHITECTURES MATCHES ppc)
38
39     # Need these everywhere...
40     ADD_DEFINITIONS(-fno-common)
41     SET(OTHER_LDFLAGS ${OTHER_LDFLAGS} " -framework Carbon -framework IOKit")
42 ENDIF(MACOSX)
43
44 # Add some gcc-specific command lines.
45 IF(CMAKE_COMPILER_IS_GNUCC)
46     # Always build with debug symbols...you can strip it later.
47     ADD_DEFINITIONS(-g -pipe -Werror -fsigned-char)
48
49     # Stupid BeOS generates warnings in the system headers.
50     IF(NOT BEOS)
51         ADD_DEFINITIONS(-Wall)
52     ENDIF(NOT BEOS)
53
54     CHECK_C_SOURCE_COMPILES("
55         #if ((defined(__GNUC__)) && (__GNUC__ >= 4))
56         int main(int argc, char **argv) { int is_gcc4 = 1; return 0; }
57         #else
58         #error This is not gcc4.
59         #endif
60     " PHYSFS_IS_GCC4)
61
62     IF(PHYSFS_IS_GCC4)
63         # Not supported on several operating systems at this time.
64         IF(NOT OS2 AND NOT SOLARIS AND NOT WINDOWS)
65              ADD_DEFINITIONS(-fvisibility=hidden)
66         ENDIF(NOT OS2 AND NOT SOLARIS AND NOT WINDOWS)
67     ENDIF(PHYSFS_IS_GCC4)
68 ENDIF(CMAKE_COMPILER_IS_GNUCC)
69
70 IF(MSVC)
71     # VS.NET 8.0 got really really anal about strcpy, etc, which even if we
72     #  cleaned up our code, zlib, etc still use...so disable the warning.
73     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS=1)
74 ENDIF(MSVC)
75
76 # Basic chunks of source code ...
77
78 SET(ZLIB_SRCS
79     zlib123/adler32.c
80     zlib123/compress.c
81     zlib123/crc32.c
82     zlib123/deflate.c
83     zlib123/gzio.c
84     zlib123/infback.c
85     zlib123/inffast.c
86     zlib123/inflate.c
87     zlib123/inftrees.c
88     zlib123/trees.c
89     zlib123/uncompr.c
90     zlib123/zutil.c
91 )
92
93 SET(LZMA_SRCS
94     lzma/C/7zCrc.c
95     lzma/C/Archive/7z/7zBuffer.c
96     lzma/C/Archive/7z/7zDecode.c
97     lzma/C/Archive/7z/7zExtract.c
98     lzma/C/Archive/7z/7zHeader.c
99     lzma/C/Archive/7z/7zIn.c
100     lzma/C/Archive/7z/7zItem.c
101     lzma/C/Archive/7z/7zMethodID.c
102     lzma/C/Compress/Branch/BranchX86.c
103     lzma/C/Compress/Branch/BranchX86_2.c
104     lzma/C/Compress/Lzma/LzmaDecode.c
105 )
106
107 IF(BEOS)
108     # We add this explicitly, since we don't want CMake to think this
109     #  is a C++ project unless we're on BeOS.
110     SET(PHYSFS_BEOS_SRCS platform/beos.cpp)
111     FIND_LIBRARY(BE_LIBRARY be)
112     FIND_LIBRARY(ROOT_LIBRARY root)
113     SET(OPTIONAL_LIBRARY_LIBS ${OPTIONAL_LIBRARY_LIBS} ${BE_LIBRARY} ${ROOT_LIBRARY})
114 ENDIF(BEOS)
115
116 # Almost everything is "compiled" here, but things that don't apply to the
117 #  build are #ifdef'd out. This is to make it easy to embed PhysicsFS into
118 #  another project or bring up a new build system: just compile all the source
119 #  code and #define the things you want.
120 SET(PHYSFS_SRCS
121     physfs.c
122     physfs_byteorder.c
123     physfs_unicode.c
124     platform/os2.c
125     platform/pocketpc.c
126     platform/posix.c
127     platform/unix.c
128     platform/macosx.c
129     platform/windows.c
130     archivers/dir.c
131     archivers/grp.c
132     archivers/hog.c
133     archivers/lzma.c
134     archivers/mvl.c
135     archivers/qpak.c
136     archivers/wad.c
137     archivers/zip.c
138     ${PHYSFS_BEOS_SRCS}
139 )
140
141
142 # platform layers ...
143
144 IF(UNIX)
145     IF(BEOS)
146         SET(PHYSFS_HAVE_CDROM_SUPPORT TRUE)
147         SET(PHYSFS_HAVE_THREAD_SUPPORT TRUE)
148         SET(HAVE_PTHREAD_H TRUE)
149     ELSE(BEOS)
150         # !!! FIXME
151         #  AC_DEFINE([PHYSFS_HAVE_LLSEEK], 1, [define if we have llseek])
152         CHECK_INCLUDE_FILE(sys/ucred.h HAVE_UCRED_H)
153         IF(HAVE_UCRED_H)
154             ADD_DEFINITIONS(-DPHYSFS_HAVE_SYS_UCRED_H=1)
155             SET(PHYSFS_HAVE_CDROM_SUPPORT TRUE)
156         ENDIF(HAVE_UCRED_H)
157
158         CHECK_INCLUDE_FILE(mntent.h HAVE_MNTENT_H)
159         IF(HAVE_MNTENT_H)
160             ADD_DEFINITIONS(-DPHYSFS_HAVE_MNTENT_H=1)
161             SET(PHYSFS_HAVE_CDROM_SUPPORT TRUE)
162         ENDIF(HAVE_MNTENT_H)
163
164         CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
165         IF(HAVE_PTHREAD_H)
166             SET(PHYSFS_HAVE_THREAD_SUPPORT TRUE)
167         ENDIF(HAVE_PTHREAD_H)
168     ENDIF(BEOS)
169 ENDIF(UNIX)
170
171 IF(WINDOWS)
172     SET(PHYSFS_HAVE_CDROM_SUPPORT TRUE)
173     SET(PHYSFS_HAVE_THREAD_SUPPORT TRUE)
174 ENDIF(WINDOWS)
175
176 IF(NOT PHYSFS_HAVE_CDROM_SUPPORT)
177     ADD_DEFINITIONS(-DPHYSFS_NO_CDROM_SUPPORT=1)
178     MESSAGE(WARNING " ***")
179     MESSAGE(WARNING " *** There is no CD-ROM support in this build!")
180     MESSAGE(WARNING " *** PhysicsFS will just pretend there are no discs.")
181     MESSAGE(WARNING " *** This may be fine, depending on how PhysicsFS is used,")
182     MESSAGE(WARNING " ***   but is this what you REALLY wanted?")
183     MESSAGE(WARNING " *** (Maybe fix CMakeLists.txt, or write a platform driver?)")
184     MESSAGE(WARNING " ***")
185 ENDIF(NOT PHYSFS_HAVE_CDROM_SUPPORT)
186
187 IF(PHYSFS_HAVE_THREAD_SUPPORT)
188     ADD_DEFINITIONS(-D_REENTRANT -D_THREAD_SAFE)
189 ELSE(PHYSFS_HAVE_THREAD_SUPPORT)
190     ADD_DEFINITIONS(-DPHYSFS_NO_THREAD_SUPPORT=1)
191     MESSAGE(WARNING " ***")
192     MESSAGE(WARNING " *** There is no thread support in this build!")
193     MESSAGE(WARNING " *** PhysicsFS will NOT be reentrant!")
194     MESSAGE(WARNING " *** This may be fine, depending on how PhysicsFS is used,")
195     MESSAGE(WARNING " ***   but is this what you REALLY wanted?")
196     MESSAGE(WARNING " *** (Maybe fix CMakeLists.txt, or write a platform driver?)")
197     MESSAGE(WARNING " ***")
198 ENDIF(PHYSFS_HAVE_THREAD_SUPPORT)
199
200 CHECK_INCLUDE_FILE(assert.h HAVE_ASSERT_H)
201 IF(HAVE_ASSERT_H)
202     ADD_DEFINITIONS(-DHAVE_ASSERT_H=1)
203 ENDIF(HAVE_ASSERT_H)
204
205
206
207 # Archivers ...
208
209 OPTION(PHYSFS_ARCHIVE_ZIP "Enable ZIP support" TRUE)
210 IF(PHYSFS_ARCHIVE_ZIP)
211     ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_ZIP=1)
212     SET(PHYSFS_NEED_ZLIB TRUE)
213 ENDIF(PHYSFS_ARCHIVE_ZIP)
214
215 OPTION(PHYSFS_ARCHIVE_7Z "Enable 7zip support" TRUE)
216 IF(PHYSFS_ARCHIVE_7Z)
217     ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_7Z=1)
218     # !!! FIXME: rename to 7z.c?
219     SET(PHYSFS_SRCS ${PHYSFS_SRCS} ${LZMA_SRCS})
220 ENDIF(PHYSFS_ARCHIVE_7Z)
221
222 OPTION(PHYSFS_ARCHIVE_GRP "Enable Build Engine GRP support" TRUE)
223 IF(PHYSFS_ARCHIVE_GRP)
224     ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_GRP=1)
225 ENDIF(PHYSFS_ARCHIVE_GRP)
226
227 OPTION(PHYSFS_ARCHIVE_WAD "Enable Doom WAD support" TRUE)
228 IF(PHYSFS_ARCHIVE_WAD)
229     ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_WAD=1)
230 ENDIF(PHYSFS_ARCHIVE_WAD)
231
232 OPTION(PHYSFS_ARCHIVE_HOG "Enable Descent I/II HOG support" TRUE)
233 IF(PHYSFS_ARCHIVE_HOG)
234     ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_HOG=1)
235 ENDIF(PHYSFS_ARCHIVE_HOG)
236
237 OPTION(PHYSFS_ARCHIVE_MVL "Enable Descent I/II MVL support" TRUE)
238 IF(PHYSFS_ARCHIVE_MVL)
239     ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_MVL=1)
240 ENDIF(PHYSFS_ARCHIVE_MVL)
241
242 OPTION(PHYSFS_ARCHIVE_QPAK "Enable Quake I/II QPAK support" TRUE)
243 IF(PHYSFS_ARCHIVE_QPAK)
244     ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_QPAK=1)
245 ENDIF(PHYSFS_ARCHIVE_QPAK)
246
247
248 # See if some archiver required zlib, and see about using system version.
249
250 IF(PHYSFS_NEED_ZLIB)
251     FIND_PACKAGE(ZLIB)
252
253     IF(ZLIB_FOUND)
254         OPTION(PHYSFS_INTERNAL_ZLIB "Link own zlib instead of system library" FALSE)
255     ELSE(HAVE_SYSTEM_ZLIB)
256         SET(PHYSFS_INTERNAL_ZLIB TRUE)
257     ENDIF(ZLIB_FOUND)
258
259     IF(PHYSFS_INTERNAL_ZLIB)
260         INCLUDE_DIRECTORIES(zlib123)
261         ADD_DEFINITIONS(-DZ_PREFIX=1)
262         SET(PHYSFS_SRCS ${PHYSFS_SRCS} ${ZLIB_SRCS})
263     ELSE(PHYSFS_INTERNAL_ZLIB)
264         SET(OPTIONAL_LIBRARY_LIBS ${OPTIONAL_LIBRARY_LIBS} ${ZLIB_LIBRARY})
265         INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
266     ENDIF(PHYSFS_INTERNAL_ZLIB)
267 ENDIF(PHYSFS_NEED_ZLIB)
268
269 OPTION(PHYSFS_BUILD_STATIC "Build static library" TRUE)
270 IF(PHYSFS_BUILD_STATIC)
271     ADD_LIBRARY(physfs-static STATIC ${PHYSFS_SRCS})
272     SET_TARGET_PROPERTIES(physfs-static PROPERTIES OUTPUT_NAME "physfs")
273     SET(PHYSFS_LIB_TARGET physfs-static)
274     SET(PHYSFS_INSTALL_TARGETS ${PHYSFS_INSTALL_TARGETS} ";physfs-static")
275 ENDIF(PHYSFS_BUILD_STATIC)
276
277 OPTION(PHYSFS_BUILD_SHARED "Build shared library" TRUE)
278 IF(PHYSFS_BUILD_SHARED)
279     ADD_LIBRARY(physfs SHARED ${PHYSFS_SRCS})
280     SET_TARGET_PROPERTIES(physfs PROPERTIES VERSION ${PHYSFS_VERSION})
281     SET_TARGET_PROPERTIES(physfs PROPERTIES SOVERSION ${PHYSFS_SOVERSION})
282     TARGET_LINK_LIBRARIES(physfs ${OPTIONAL_LIBRARY_LIBS} ${OTHER_LDFLAGS})
283     SET(PHYSFS_LIB_TARGET physfs)
284     SET(PHYSFS_INSTALL_TARGETS ${PHYSFS_INSTALL_TARGETS} ";physfs")
285 ENDIF(PHYSFS_BUILD_SHARED)
286
287 IF(NOT PHYSFS_BUILD_SHARED AND NOT PHYSFS_BUILD_STATIC)
288     MESSAGE(FATAL "Both shared and static libraries are disabled!")
289 ENDIF(NOT PHYSFS_BUILD_SHARED AND NOT PHYSFS_BUILD_STATIC)
290
291 # CMake FAQ says I need this...
292 IF(PHYSFS_BUILD_SHARED AND PHYSFS_BUILD_STATIC)
293     SET_TARGET_PROPERTIES(physfs PROPERTIES CLEAN_DIRECT_OUTPUT 1)
294     SET_TARGET_PROPERTIES(physfs-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
295 ENDIF(PHYSFS_BUILD_SHARED AND PHYSFS_BUILD_STATIC)
296
297 OPTION(PHYSFS_BUILD_TEST "Build stdio test program." TRUE)
298 MARK_AS_ADVANCED(PHYSFS_BUILD_TEST)
299 IF(PHYSFS_BUILD_TEST)
300     FIND_PATH(READLINE_H readline/readline.h)
301     FIND_PATH(HISTORY_H readline/history.h)
302     IF(READLINE_H AND HISTORY_H)
303         FIND_LIBRARY(CURSES_LIBRARY NAMES curses ncurses)
304         SET(CMAKE_REQUIRED_LIBRARIES ${CURSES_LIBRARY})
305         FIND_LIBRARY(READLINE_LIBRARY readline)
306         FIND_LIBRARY(HISTORY_LIBRARY history)
307         IF(READLINE_LIBRARY AND HISTORY_LIBRARY)
308             SET(HAVE_SYSTEM_READLINE TRUE)
309             SET(TEST_PHYSFS_LIBS ${TEST_PHYSFS_LIBS} ${READLINE_LIBRARY} ${CURSES_LIBRARY})
310             INCLUDE_DIRECTORIES(${READLINE_H} ${HISTORY_H})
311             ADD_DEFINITIONS(-DPHYSFS_HAVE_READLINE=1)
312         ENDIF(READLINE_LIBRARY AND HISTORY_LIBRARY)
313     ENDIF(READLINE_H AND HISTORY_H)
314     ADD_EXECUTABLE(test_physfs test/test_physfs.c)
315     TARGET_LINK_LIBRARIES(test_physfs ${PHYSFS_LIB_TARGET} ${TEST_PHYSFS_LIBS} ${OTHER_LDFLAGS})
316     SET(PHYSFS_INSTALL_TARGETS ${PHYSFS_INSTALL_TARGETS} ";test_physfs")
317 ENDIF(PHYSFS_BUILD_TEST)
318
319 OPTION(PHYSFS_BUILD_WX_TEST "Build wxWidgets test program." TRUE)
320 MARK_AS_ADVANCED(PHYSFS_BUILD_WX_TEST)
321 IF(PHYSFS_BUILD_WX_TEST)
322     SET(wxWidgets_USE_LIBS base core adv)
323     SET(wxWidgets_INCLUDE_DIRS_NO_SYSTEM 1)
324     FIND_PACKAGE(wxWidgets)
325     IF(wxWidgets_FOUND)
326         INCLUDE(${wxWidgets_USE_FILE})
327         ADD_EXECUTABLE(wxtest_physfs test/wxtest_physfs.cpp)
328         SET_SOURCE_FILES_PROPERTIES(test/wxtest_physfs.cpp COMPILE_FLAGS ${wxWidgets_CXX_FLAGS})
329         TARGET_LINK_LIBRARIES(wxtest_physfs ${PHYSFS_LIB_TARGET} ${wxWidgets_LIBRARIES} ${OTHER_LDFLAGS})
330         SET(PHYSFS_INSTALL_TARGETS ${PHYSFS_INSTALL_TARGETS} ";wxtest_physfs")
331     ELSE(wxWidgets_FOUND)
332         MESSAGE(STATUS "wxWidgets not found. Disabling wx test app.")
333         SET(PHYSFS_BUILD_WX_TEST FALSE)
334     ENDIF(wxWidgets_FOUND)
335 ENDIF(PHYSFS_BUILD_WX_TEST)
336
337 INSTALL(TARGETS ${PHYSFS_INSTALL_TARGETS}
338         RUNTIME DESTINATION bin
339         LIBRARY DESTINATION lib${LIB_SUFFIX}
340         ARCHIVE DESTINATION lib${LIB_SUFFIX})
341 INSTALL(FILES physfs.h DESTINATION include)
342
343 FIND_PACKAGE(Doxygen)
344 IF(DOXYGEN_FOUND)
345     ADD_CUSTOM_TARGET(docs ${DOXYGEN_EXECUTABLE} COMMENT "Building documentation")
346 ELSE(DOXYGEN_FOUND)
347     MESSAGE(STATUS "Doxygen not found. You won't be able to build documentation.")
348 ENDIF(DOXYGEN_FOUND)
349
350 IF(UNIX)
351     SET(PHYSFS_TARBALL "${CMAKE_CURRENT_SOURCE_DIR}/../physfs-${PHYSFS_VERSION}.tar.gz")
352     ADD_CUSTOM_TARGET(
353         dist
354         hg archive -t tgz "${PHYSFS_TARBALL}"
355         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
356         COMMENT "Building source tarball '${PHYSFS_TARBALL}'..."
357     )
358 ENDIF(UNIX)
359
360 MACRO(MESSAGE_BOOL_OPTION _NAME _VALUE)
361     IF(${_VALUE})
362         MESSAGE(STATUS "  ${_NAME}: enabled")
363     ELSE(${_VALUE})
364         MESSAGE(STATUS "  ${_NAME}: disabled")
365     ENDIF(${_VALUE})
366 ENDMACRO(MESSAGE_BOOL_OPTION)
367
368 MESSAGE(STATUS "PhysicsFS will build with the following options:")
369 MESSAGE_BOOL_OPTION("ZIP support" PHYSFS_ARCHIVE_ZIP)
370 MESSAGE_BOOL_OPTION("7zip support" PHYSFS_ARCHIVE_7Z)
371 MESSAGE_BOOL_OPTION("GRP support" PHYSFS_ARCHIVE_GRP)
372 MESSAGE_BOOL_OPTION("WAD support" PHYSFS_ARCHIVE_WAD)
373 MESSAGE_BOOL_OPTION("HOG support" PHYSFS_ARCHIVE_HOG)
374 MESSAGE_BOOL_OPTION("MVL support" PHYSFS_ARCHIVE_MVL)
375 MESSAGE_BOOL_OPTION("QPAK support" PHYSFS_ARCHIVE_QPAK)
376 MESSAGE_BOOL_OPTION("CD-ROM drive support" PHYSFS_HAVE_CDROM_SUPPORT)
377 MESSAGE_BOOL_OPTION("Thread safety" PHYSFS_HAVE_THREAD_SUPPORT)
378 MESSAGE_BOOL_OPTION("Build own zlib" PHYSFS_INTERNAL_ZLIB)
379 MESSAGE_BOOL_OPTION("Build static library" PHYSFS_BUILD_STATIC)
380 MESSAGE_BOOL_OPTION("Build shared library" PHYSFS_BUILD_SHARED)
381 MESSAGE_BOOL_OPTION("Build wxWidgets test program" PHYSFS_BUILD_WX_TEST)
382 MESSAGE_BOOL_OPTION("Build stdio test program" PHYSFS_BUILD_TEST)
383 IF(PHYSFS_BUILD_TEST)
384     MESSAGE_BOOL_OPTION("  Use readline in test program" HAVE_SYSTEM_READLINE)
385 ENDIF(PHYSFS_BUILD_TEST)
386
387 # end of CMakeLists.txt ...
388