diff --git a/CMakeLists.txt b/CMakeLists.txt index ce3c3a2..c17099b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,13 @@ # # Please see the file LICENSE.txt in the source's root directory. +# The CMake project file is meant to get this compiling on all sorts of +# platforms quickly, and serve as the way Unix platforms and Linux distros +# package up official builds, but you don't _need_ to use this; we have +# built PhysicsFS to (hopefully) be able to drop into your project and +# compile, using preprocessor checks for platform-specific bits instead of +# testing in here. + cmake_minimum_required(VERSION 2.8.4) project(PhysicsFS) @@ -15,68 +22,13 @@ if(WIN32 AND NOT WINDOWS) set(WINDOWS TRUE) endif() -# Bleh, let's do it for "APPLE" too. -if(APPLE AND NOT MACOSX) - set(MACOSX TRUE) -endif() - -# For now, Haiku and BeOS are the same, as far as the build system cares. -if(HAIKU AND NOT BEOS) - set(BEOS TRUE) -endif() - -if(CMAKE_SYSTEM_NAME STREQUAL "SunOS") - set(SOLARIS TRUE) -endif() - -# Don't treat MingW as Unix; use it as a strictly-Windows compiler. -if(MINGW) - set(UNIX FALSE) -endif() - -include(CheckIncludeFile) -include(CheckLibraryExists) -include(CheckCSourceCompiles) - include_directories(./src) -if(MACOSX) - # Fallback to older OS X on PowerPC to support wider range of systems... - 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() - - # Need these everywhere... - add_definitions(-fno-common) +if(APPLE) set(OTHER_LDFLAGS ${OTHER_LDFLAGS} "-framework CoreFoundation -framework IOKit") endif() -# Add some gcc-specific command lines. if(CMAKE_COMPILER_IS_GNUCC) - # Always build with debug symbols...you can strip it later. - add_definitions(-g -pipe -Werror -fsigned-char) - - # Stupid BeOS generates warnings in the system headers. - if(NOT BEOS) - add_definitions(-Wall) - endif() - - check_c_source_compiles(" - #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) - - if(PHYSFS_IS_GCC4) - # Not supported on several operating systems at this time. - if(NOT SOLARIS AND NOT WINDOWS) - add_definitions(-fvisibility=hidden) - endif() - endif() - # Don't use -rpath. set(CMAKE_SKIP_RPATH ON CACHE BOOL "Skip RPATH" FORCE) endif() @@ -86,11 +38,6 @@ if(CMAKE_C_COMPILER_ID STREQUAL "SunPro") add_definitions(-xldscope=hidden) endif() -if(MSVC) - # 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. - add_definitions(-D_CRT_SECURE_NO_WARNINGS=1) -endif() # Basic chunks of source code ... @@ -108,15 +55,23 @@ set(LZMA_SRCS src/lzma/C/Compress/Lzma/LzmaDecode.c ) -if(BEOS) +if(HAIKU OR BEOS) # We add this explicitly, since we don't want CMake to think this - # is a C++ project unless we're on BeOS. + # is a C++ project unless we're on BeOS/Haiku. 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() +if(UNIX AND NOT WINDOWS AND NOT APPLE) # (MingW and such might be UNIX _and_ WINDOWS!) + set(OTHER_LDFLAGS ${OTHER_LDFLAGS} "-pthread") + find_library(PTHREAD_LIBRARY pthread) + if(PTHREAD_LIBRARY) + set(OPTIONAL_LIBRARY_LIBS ${OPTIONAL_LIBRARY_LIBS} ${PTHREAD_LIBRARY}) + endif() +endif() + # 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 @@ -145,81 +100,6 @@ set(PHYSFS_SRCS ) -# platform layers ... - -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() - - # !!! FIXME: Solaris fails this, because mnttab.h implicitly - # !!! FIXME: depends on other system headers. :( - #check_include_file(sys/mnttab.h HAVE_SYS_MNTTAB_H) - check_c_source_compiles(" - #include - #include - int main(int argc, char **argv) { return 0; } - " HAVE_SYS_MNTTAB_H) - - 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) - find_library(PTHREAD_LIBRARY pthread) - if(PTHREAD_LIBRARY) - set(OPTIONAL_LIBRARY_LIBS ${OPTIONAL_LIBRARY_LIBS} ${PTHREAD_LIBRARY}) - endif() - endif() - endif() -endif() - -if(WINDOWS OR OS2) - 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() - - # Archivers ... # These are (mostly) on by default now, so these options are only useful for # disabling them. @@ -408,8 +288,6 @@ message_bool_option("QPAK support" PHYSFS_ARCHIVE_QPAK) message_bool_option("SLB support" PHYSFS_ARCHIVE_SLB) message_bool_option("VDF support" PHYSFS_ARCHIVE_VDF) message_bool_option("ISO9660 support" PHYSFS_ARCHIVE_ISO9660) -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) diff --git a/src/physfs_internal.h b/src/physfs_internal.h index c0c65a8..591a8cc 100644 --- a/src/physfs_internal.h +++ b/src/physfs_internal.h @@ -14,6 +14,18 @@ #error Do not include this header from your applications. #endif +/* Make sure everything that includes this header exports no symbols by + default. physfs.h uses function attributes to mark only the public API as + visible. */ +#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) +#pragma GCC visibility push(hidden) +#endif + +/* Turn off MSVC warnings that are aggressively anti-portability. */ +#ifdef _MSC_VER +#define _CRT_SECURE_NO_WARNINGS 1 +#endif + #include "physfs.h" /* The holy trinity. */ diff --git a/src/platform_posix.c b/src/platform_posix.c index 263d62a..afa5b1c 100644 --- a/src/platform_posix.c +++ b/src/platform_posix.c @@ -22,7 +22,7 @@ #include #include -#if ((!defined PHYSFS_NO_THREAD_SUPPORT) && (!defined PHYSFS_PLATFORM_BEOS)) +#ifndef PHYSFS_PLATFORM_BEOS #include #endif @@ -341,15 +341,6 @@ int __PHYSFS_platformStat(const char *filename, PHYSFS_Stat *st) #ifndef PHYSFS_PLATFORM_BEOS /* BeOS has its own code in platform_beos.cpp */ -#if (defined PHYSFS_NO_THREAD_SUPPORT) - -void *__PHYSFS_platformGetThreadID(void) { return ((void *) 0x0001); } -void *__PHYSFS_platformCreateMutex(void) { return ((void *) 0x0001); } -void __PHYSFS_platformDestroyMutex(void *mutex) {} -int __PHYSFS_platformGrabMutex(void *mutex) { return 1; } -void __PHYSFS_platformReleaseMutex(void *mutex) {} - -#else typedef struct { @@ -427,7 +418,6 @@ void __PHYSFS_platformReleaseMutex(void *mutex) } /* if */ } /* __PHYSFS_platformReleaseMutex */ -#endif /* !PHYSFS_NO_THREAD_SUPPORT */ #endif /* !PHYSFS_PLATFORM_BEOS */ #endif /* PHYSFS_PLATFORM_POSIX */ diff --git a/src/platform_unix.c b/src/platform_unix.c index 53cfd4d..a60fcb4 100644 --- a/src/platform_unix.c +++ b/src/platform_unix.c @@ -23,12 +23,16 @@ #include #include -#if PHYSFS_PLATFORM_LINUX && !defined(PHYSFS_HAVE_MNTENT_H) -#define PHYSFS_HAVE_MNTENT_H 1 +#if PHYSFS_NO_CDROM_SUPPORT +#elif PHYSFS_PLATFORM_LINUX && !defined(PHYSFS_HAVE_MNTENT_H) +# define PHYSFS_HAVE_MNTENT_H 1 #elif PHYSFS_PLATFORM_SOLARIS && !defined(PHYSFS_HAVE_SYS_MNTTAB_H) -#define PHYSFS_HAVE_SYS_MNTTAB_H 1 +# define PHYSFS_HAVE_SYS_MNTTAB_H 1 #elif PHYSFS_PLATFORM_BSD && !defined(PHYSFS_HAVE_SYS_UCRED_H) -#define PHYSFS_HAVE_SYS_UCRED_H 1 +# define PHYSFS_HAVE_SYS_UCRED_H 1 +#else +# warning No CD-ROM support included. Either define your platform here, +# warning or define PHYSFS_NO_CDROM_SUPPORT=1 to confirm this is intentional. #endif #ifdef PHYSFS_HAVE_SYS_UCRED_H