/
CMakeLists.txt
400 lines (342 loc) · 12.9 KB
1
2
# PhysicsFS; a portable, flexible file i/o abstraction.
#
3
# Please see the file LICENSE.txt in the source's root directory.
4
5
cmake_minimum_required(VERSION 2.8.4)
6
7
8
project(PhysicsFS)
set(PHYSFS_VERSION 2.1.0)
9
10
# Increment this if/when we break backwards compatibility.
11
set(PHYSFS_SOVERSION 1)
12
13
# I hate that they define "WIN32" ... we're about to move to Win64...I hope!
14
15
16
if(WIN32 AND NOT WINDOWS)
set(WINDOWS TRUE)
endif()
17
18
# Bleh, let's do it for "APPLE" too.
19
20
21
if(APPLE AND NOT MACOSX)
set(MACOSX TRUE)
endif()
22
23
# For now, Haiku and BeOS are the same, as far as the build system cares.
24
25
26
if(HAIKU AND NOT BEOS)
set(BEOS TRUE)
endif()
27
28
29
30
if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
set(SOLARIS TRUE)
endif()
31
32
33
34
include(CheckIncludeFile)
include(CheckLibraryExists)
include(CheckCSourceCompiles)
35
36
include_directories(./src)
37
38
if(MACOSX)
39
# Fallback to older OS X on PowerPC to support wider range of systems...
40
41
42
43
if(CMAKE_OSX_ARCHITECTURES MATCHES ppc)
add_definitions(-DMAC_OS_X_VERSION_MIN_REQUIRED=1020)
set(OTHER_LDFLAGS ${OTHER_LDFLAGS} " -mmacosx-version-min=10.2")
endif()
44
45
# Need these everywhere...
46
47
48
add_definitions(-fno-common)
set(OTHER_LDFLAGS ${OTHER_LDFLAGS} "-framework Carbon -framework IOKit")
endif()
49
50
# Add some gcc-specific command lines.
51
if(CMAKE_COMPILER_IS_GNUCC)
52
# Always build with debug symbols...you can strip it later.
53
add_definitions(-g -pipe -Werror -fsigned-char)
54
55
# Stupid BeOS generates warnings in the system headers.
56
57
58
if(NOT BEOS)
add_definitions(-Wall)
endif()
59
60
check_c_source_compiles("
61
62
63
64
65
66
67
#if ((defined(__GNUC__)) && (__GNUC__ >= 4))
int main(int argc, char **argv) { int is_gcc4 = 1; return 0; }
#else
#error This is not gcc4.
#endif
" PHYSFS_IS_GCC4)
68
if(PHYSFS_IS_GCC4)
69
# Not supported on several operating systems at this time.
70
71
72
73
if(NOT SOLARIS AND NOT WINDOWS)
add_definitions(-fvisibility=hidden)
endif()
endif()
74
75
# Don't use -rpath.
76
77
set(CMAKE_SKIP_RPATH ON CACHE BOOL "Skip RPATH" FORCE)
endif()
78
79
80
81
82
if(CMAKE_C_COMPILER_ID STREQUAL "SunPro")
add_definitions(-erroff=E_EMPTY_TRANSLATION_UNIT)
add_definitions(-xldscope=hidden)
endif()
83
84
if(MSVC)
85
86
# VS.NET 8.0 got really really anal about strcpy, etc, which even if we
# cleaned up our code, zlib, etc still use...so disable the warning.
87
88
add_definitions(-D_CRT_SECURE_NO_WARNINGS=1)
endif()
89
90
91
# Basic chunks of source code ...
92
set(LZMA_SRCS
93
94
95
96
97
98
99
100
101
102
103
src/lzma/C/7zCrc.c
src/lzma/C/Archive/7z/7zBuffer.c
src/lzma/C/Archive/7z/7zDecode.c
src/lzma/C/Archive/7z/7zExtract.c
src/lzma/C/Archive/7z/7zHeader.c
src/lzma/C/Archive/7z/7zIn.c
src/lzma/C/Archive/7z/7zItem.c
src/lzma/C/Archive/7z/7zMethodID.c
src/lzma/C/Compress/Branch/BranchX86.c
src/lzma/C/Compress/Branch/BranchX86_2.c
src/lzma/C/Compress/Lzma/LzmaDecode.c
104
105
)
106
if(BEOS)
107
108
# We add this explicitly, since we don't want CMake to think this
# is a C++ project unless we're on BeOS.
109
110
111
112
113
set(PHYSFS_BEOS_SRCS src/platform_beos.cpp)
find_library(BE_LIBRARY be)
find_library(ROOT_LIBRARY root)
set(OPTIONAL_LIBRARY_LIBS ${OPTIONAL_LIBRARY_LIBS} ${BE_LIBRARY} ${ROOT_LIBRARY})
endif()
114
115
116
117
118
# Almost everything is "compiled" here, but things that don't apply to the
# build are #ifdef'd out. This is to make it easy to embed PhysicsFS into
# another project or bring up a new build system: just compile all the source
# code and #define the things you want.
119
set(PHYSFS_SRCS
120
121
122
123
124
125
126
127
src/physfs.c
src/physfs_byteorder.c
src/physfs_unicode.c
src/platform_posix.c
src/platform_unix.c
src/platform_macosx.c
src/platform_windows.c
src/archiver_dir.c
128
src/archiver_unpacked.c
129
130
131
132
133
134
135
src/archiver_grp.c
src/archiver_hog.c
src/archiver_lzma.c
src/archiver_mvl.c
src/archiver_qpak.c
src/archiver_wad.c
src/archiver_zip.c
136
src/archiver_slb.c
137
src/archiver_iso9660.c
138
${PHYSFS_BEOS_SRCS}
139
140
141
142
143
)
# platform layers ...
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
if(UNIX)
if(BEOS)
set(PHYSFS_HAVE_CDROM_SUPPORT TRUE)
set(PHYSFS_HAVE_THREAD_SUPPORT TRUE)
set(HAVE_PTHREAD_H TRUE)
else()
check_include_file(sys/ucred.h HAVE_UCRED_H)
if(HAVE_UCRED_H)
add_definitions(-DPHYSFS_HAVE_SYS_UCRED_H=1)
set(PHYSFS_HAVE_CDROM_SUPPORT TRUE)
endif()
check_include_file(mntent.h HAVE_MNTENT_H)
if(HAVE_MNTENT_H)
add_definitions(-DPHYSFS_HAVE_MNTENT_H=1)
set(PHYSFS_HAVE_CDROM_SUPPORT TRUE)
endif()
161
162
163
# !!! FIXME: Solaris fails this, because mnttab.h implicitly
# !!! FIXME: depends on other system headers. :(
164
165
#check_include_file(sys/mnttab.h HAVE_SYS_MNTTAB_H)
check_c_source_compiles("
166
167
168
169
170
#include <stdio.h>
#include <sys/mnttab.h>
int main(int argc, char **argv) { return 0; }
" HAVE_SYS_MNTTAB_H)
171
172
173
174
175
176
177
178
if(HAVE_SYS_MNTTAB_H)
add_definitions(-DPHYSFS_HAVE_SYS_MNTTAB_H=1)
set(PHYSFS_HAVE_CDROM_SUPPORT TRUE)
endif()
check_include_file(pthread.h HAVE_PTHREAD_H)
if(HAVE_PTHREAD_H)
set(PHYSFS_HAVE_THREAD_SUPPORT TRUE)
179
180
181
182
find_library(PTHREAD_LIBRARY pthread)
if(PTHREAD_LIBRARY)
set(OPTIONAL_LIBRARY_LIBS ${OPTIONAL_LIBRARY_LIBS} ${PTHREAD_LIBRARY})
endif()
183
endif()
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
endif()
endif()
if(WINDOWS)
set(PHYSFS_HAVE_CDROM_SUPPORT TRUE)
set(PHYSFS_HAVE_THREAD_SUPPORT TRUE)
endif()
if(NOT PHYSFS_HAVE_CDROM_SUPPORT)
add_definitions(-DPHYSFS_NO_CDROM_SUPPORT=1)
message(WARNING " ***")
message(WARNING " *** There is no CD-ROM support in this build!")
message(WARNING " *** PhysicsFS will just pretend there are no discs.")
message(WARNING " *** This may be fine, depending on how PhysicsFS is used,")
message(WARNING " *** but is this what you REALLY wanted?")
message(WARNING " *** (Maybe fix CMakeLists.txt, or write a platform driver?)")
message(WARNING " ***")
endif()
if(PHYSFS_HAVE_THREAD_SUPPORT)
add_definitions(-D_REENTRANT -D_THREAD_SAFE)
else()
add_definitions(-DPHYSFS_NO_THREAD_SUPPORT=1)
message(WARNING " ***")
message(WARNING " *** There is no thread support in this build!")
message(WARNING " *** PhysicsFS will NOT be reentrant!")
message(WARNING " *** This may be fine, depending on how PhysicsFS is used,")
message(WARNING " *** but is this what you REALLY wanted?")
message(WARNING " *** (Maybe fix CMakeLists.txt, or write a platform driver?)")
message(WARNING " ***")
endif()
215
216
217
218
# Archivers ...
219
220
221
222
option(PHYSFS_ARCHIVE_ZIP "Enable ZIP support" TRUE)
if(PHYSFS_ARCHIVE_ZIP)
add_definitions(-DPHYSFS_SUPPORTS_ZIP=1)
endif()
223
224
225
226
option(PHYSFS_ARCHIVE_7Z "Enable 7zip support" TRUE)
if(PHYSFS_ARCHIVE_7Z)
add_definitions(-DPHYSFS_SUPPORTS_7Z=1)
227
# !!! FIXME: rename to 7z.c?
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
set(PHYSFS_SRCS ${PHYSFS_SRCS} ${LZMA_SRCS})
endif()
option(PHYSFS_ARCHIVE_GRP "Enable Build Engine GRP support" TRUE)
if(PHYSFS_ARCHIVE_GRP)
add_definitions(-DPHYSFS_SUPPORTS_GRP=1)
endif()
option(PHYSFS_ARCHIVE_WAD "Enable Doom WAD support" TRUE)
if(PHYSFS_ARCHIVE_WAD)
add_definitions(-DPHYSFS_SUPPORTS_WAD=1)
endif()
option(PHYSFS_ARCHIVE_HOG "Enable Descent I/II HOG support" TRUE)
if(PHYSFS_ARCHIVE_HOG)
add_definitions(-DPHYSFS_SUPPORTS_HOG=1)
endif()
option(PHYSFS_ARCHIVE_MVL "Enable Descent I/II MVL support" TRUE)
if(PHYSFS_ARCHIVE_MVL)
add_definitions(-DPHYSFS_SUPPORTS_MVL=1)
endif()
option(PHYSFS_ARCHIVE_QPAK "Enable Quake I/II QPAK support" TRUE)
if(PHYSFS_ARCHIVE_QPAK)
add_definitions(-DPHYSFS_SUPPORTS_QPAK=1)
endif()
256
257
258
259
260
option(PHYSFS_ARCHIVE_SLB "Enable I-War / Independence War SLB support" TRUE)
if(PHYSFS_ARCHIVE_SLB)
add_definitions(-DPHYSFS_SUPPORTS_SLB=1)
endif()
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
option(PHYSFS_ARCHIVE_ISO9660 "Enable ISO9660 support" TRUE)
if(PHYSFS_ARCHIVE_ISO9660)
add_definitions(-DPHYSFS_SUPPORTS_ISO9660=1)
endif()
option(PHYSFS_BUILD_STATIC "Build static library" TRUE)
if(PHYSFS_BUILD_STATIC)
add_library(physfs-static STATIC ${PHYSFS_SRCS})
set_target_properties(physfs-static PROPERTIES OUTPUT_NAME "physfs")
set(PHYSFS_LIB_TARGET physfs-static)
set(PHYSFS_INSTALL_TARGETS ${PHYSFS_INSTALL_TARGETS} ";physfs-static")
endif()
option(PHYSFS_BUILD_SHARED "Build shared library" TRUE)
if(PHYSFS_BUILD_SHARED)
add_library(physfs SHARED ${PHYSFS_SRCS})
set_target_properties(physfs PROPERTIES VERSION ${PHYSFS_VERSION})
set_target_properties(physfs PROPERTIES SOVERSION ${PHYSFS_SOVERSION})
target_link_libraries(physfs ${OPTIONAL_LIBRARY_LIBS} ${OTHER_LDFLAGS})
set(PHYSFS_LIB_TARGET physfs)
set(PHYSFS_INSTALL_TARGETS ${PHYSFS_INSTALL_TARGETS} ";physfs")
endif()
if(NOT PHYSFS_BUILD_SHARED AND NOT PHYSFS_BUILD_STATIC)
message(FATAL "Both shared and static libraries are disabled!")
endif()
288
289
# CMake FAQ says I need this...
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
if(PHYSFS_BUILD_SHARED AND PHYSFS_BUILD_STATIC)
set_target_properties(physfs PROPERTIES CLEAN_DIRECT_OUTPUT 1)
set_target_properties(physfs-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
endif()
option(PHYSFS_BUILD_TEST "Build stdio test program." TRUE)
mark_as_advanced(PHYSFS_BUILD_TEST)
if(PHYSFS_BUILD_TEST)
find_path(READLINE_H readline/readline.h)
find_path(HISTORY_H readline/history.h)
if(READLINE_H AND HISTORY_H)
find_library(CURSES_LIBRARY NAMES curses ncurses)
set(CMAKE_REQUIRED_LIBRARIES ${CURSES_LIBRARY})
find_library(READLINE_LIBRARY readline)
if(READLINE_LIBRARY)
set(HAVE_SYSTEM_READLINE TRUE)
set(TEST_PHYSFS_LIBS ${TEST_PHYSFS_LIBS} ${READLINE_LIBRARY} ${CURSES_LIBRARY})
include_directories(${READLINE_H} ${HISTORY_H})
add_definitions(-DPHYSFS_HAVE_READLINE=1)
endif()
endif()
add_executable(test_physfs test/test_physfs.c)
target_link_libraries(test_physfs ${PHYSFS_LIB_TARGET} ${TEST_PHYSFS_LIBS} ${OTHER_LDFLAGS})
set(PHYSFS_INSTALL_TARGETS ${PHYSFS_INSTALL_TARGETS} ";test_physfs")
endif()
315
316
install(TARGETS ${PHYSFS_INSTALL_TARGETS}
317
RUNTIME DESTINATION bin
318
319
LIBRARY DESTINATION lib${LIB_SUFFIX}
ARCHIVE DESTINATION lib${LIB_SUFFIX})
320
install(FILES src/physfs.h DESTINATION include)
321
322
323
324
325
find_package(Doxygen)
if(DOXYGEN_FOUND)
set(PHYSFS_OUTPUT_DOXYFILE "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile")
configure_file(
326
"${CMAKE_CURRENT_SOURCE_DIR}/docs/Doxyfile"
327
328
329
"${PHYSFS_OUTPUT_DOXYFILE}"
COPYONLY
)
330
331
332
333
file(APPEND "${PHYSFS_OUTPUT_DOXYFILE}" "\n\n# Below auto-generated by cmake...\n\n")
file(APPEND "${PHYSFS_OUTPUT_DOXYFILE}" "PROJECT_NUMBER = \"${PHYSFS_VERSION}\"\n")
file(APPEND "${PHYSFS_OUTPUT_DOXYFILE}" "OUTPUT_DIRECTORY = \"${CMAKE_CURRENT_BINARY_DIR}/docs\"\n")
file(APPEND "${PHYSFS_OUTPUT_DOXYFILE}" "\n# End auto-generated section.\n\n")
334
335
add_custom_target(
336
337
338
339
340
docs
${DOXYGEN_EXECUTABLE} "${PHYSFS_OUTPUT_DOXYFILE}"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT "Building documentation in 'docs' directory..."
)
341
342
343
else()
message(STATUS "Doxygen not found. You won't be able to build documentation.")
endif()
344
345
if(UNIX)
346
set(PHYSFS_TARBALL "${CMAKE_CURRENT_SOURCE_DIR}/../physfs-${PHYSFS_VERSION}.tar.bz2")
347
add_custom_target(
348
dist
349
hg archive -t tbz2 "${PHYSFS_TARBALL}"
350
351
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT "Building source tarball '${PHYSFS_TARBALL}'..."
352
)
353
add_custom_target(
354
355
356
357
358
uninstall
"${CMAKE_CURRENT_SOURCE_DIR}/extras/uninstall.sh"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
COMMENT "Uninstall the project..."
)
359
360
endif()
361
362
363
364
365
366
367
368
369
370
371
372
if(UNIX AND NOT APPLE)
configure_file(
"extras/physfs.pc.in"
"extras/physfs.pc"
@ONLY
)
install(
FILES "${CMAKE_CURRENT_BINARY_DIR}/extras/physfs.pc"
DESTINATION "lib/pkgconfig"
)
endif()
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
macro(message_bool_option _NAME _VALUE)
if(${_VALUE})
message(STATUS " ${_NAME}: enabled")
else()
message(STATUS " ${_NAME}: disabled")
endif()
endmacro()
message(STATUS "PhysicsFS will build with the following options:")
message_bool_option("ZIP support" PHYSFS_ARCHIVE_ZIP)
message_bool_option("7zip support" PHYSFS_ARCHIVE_7Z)
message_bool_option("GRP support" PHYSFS_ARCHIVE_GRP)
message_bool_option("WAD support" PHYSFS_ARCHIVE_WAD)
message_bool_option("HOG support" PHYSFS_ARCHIVE_HOG)
message_bool_option("MVL support" PHYSFS_ARCHIVE_MVL)
message_bool_option("QPAK support" PHYSFS_ARCHIVE_QPAK)
389
message_bool_option("SLB support" PHYSFS_ARCHIVE_SLB)
390
391
392
393
394
395
396
397
message_bool_option("CD-ROM drive support" PHYSFS_HAVE_CDROM_SUPPORT)
message_bool_option("Thread safety" PHYSFS_HAVE_THREAD_SUPPORT)
message_bool_option("Build static library" PHYSFS_BUILD_STATIC)
message_bool_option("Build shared library" PHYSFS_BUILD_SHARED)
message_bool_option("Build stdio test program" PHYSFS_BUILD_TEST)
if(PHYSFS_BUILD_TEST)
message_bool_option(" Use readline in test program" HAVE_SYSTEM_READLINE)
endif()
398
399
# end of CMakeLists.txt ...