diff options
-rw-r--r-- | CMakeLists.txt | 16 | ||||
-rw-r--r-- | cmake/CheckSharedFunctionExists.c | 38 | ||||
-rw-r--r-- | cmake/CheckSharedFunctionExists.cmake | 92 | ||||
-rw-r--r-- | cmake/CheckSharedLibraryExists.cmake | 70 |
4 files changed, 100 insertions, 116 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 475ac6f5..06da6950 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") INCLUDE(CheckFunctionExists) INCLUDE(CheckLibraryExists) -INCLUDE(CheckSharedLibraryExists) +INCLUDE(CheckSharedFunctionExists) INCLUDE(CheckIncludeFile) INCLUDE(CheckIncludeFiles) INCLUDE(CheckSymbolExists) @@ -350,7 +350,7 @@ IF(NOT HAVE_STDINT_H) ENDIF() # Windows needs winmm for timeGetTime, even if the backend is disabled -CHECK_SHARED_LIBRARY_EXISTS(winmm timeGetTime 0 "" HAVE_LIBWINMM) +CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM) IF(HAVE_LIBWINMM) SET(EXTRA_LIBS winmm ${EXTRA_LIBS}) SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm) @@ -402,7 +402,7 @@ SET(HAVE_WAVE 0) IF(ALSA) CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H) IF(HAVE_ALSA_ASOUNDLIB_H) - CHECK_SHARED_LIBRARY_EXISTS(asound snd_pcm_open 4 "" HAVE_LIBASOUND) + CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "alsa/asoundlib.h" asound "" HAVE_LIBASOUND) IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32) SET(HAVE_ALSA 1) SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c) @@ -449,7 +449,7 @@ ENDIF() IF(SNDIO) CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H) IF(HAVE_SNDIO_H) - CHECK_SHARED_LIBRARY_EXISTS(sndio sio_open 3 "" HAVE_LIBSNDIO) + CHECK_SHARED_FUNCTION_EXISTS(sio_open "sndio.h" sndio "" HAVE_LIBSNDIO) IF(HAVE_LIBSNDIO OR HAVE_DLFCN_H OR WIN32) SET(HAVE_SNDIO 1) SET(ALC_OBJS ${ALC_OBJS} Alc/sndio.c) @@ -486,7 +486,7 @@ ENDIF() IF(DSOUND) CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H) IF(HAVE_DSOUND_H) - CHECK_SHARED_LIBRARY_EXISTS(dsound DirectSoundCreate 3 "" HAVE_LIBDSOUND) + CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND) IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32) SET(HAVE_DSOUND 1) SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c) @@ -522,7 +522,7 @@ ENDIF() IF(PORTAUDIO) CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H) IF(HAVE_PORTAUDIO_H) - CHECK_SHARED_LIBRARY_EXISTS(portaudio Pa_Initialize 0 "" HAVE_LIBPORTAUDIO) + CHECK_SHARED_FUNCTION_EXISTS(Pa_Initialize "portaudio.h" portaudio "" HAVE_LIBPORTAUDIO) IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32) SET(HAVE_PORTAUDIO 1) SET(ALC_OBJS ${ALC_OBJS} Alc/portaudio.c) @@ -543,7 +543,7 @@ ENDIF() IF(PULSEAUDIO) CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H) IF(HAVE_PULSE_PULSEAUDIO_H) - CHECK_SHARED_LIBRARY_EXISTS(pulse pa_context_new 2 "" HAVE_LIBPULSE) + CHECK_SHARED_FUNCTION_EXISTS(pa_context_new "pulse/pulseaudio.h" pulse "" HAVE_LIBPULSE) IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32) SET(HAVE_PULSEAUDIO 1) SET(ALC_OBJS ${ALC_OBJS} Alc/pulseaudio.c) @@ -580,7 +580,7 @@ ENDIF() IF(OPENSL) CHECK_INCLUDE_FILE(SLES/OpenSLES_Android.h HAVE_SLES_OPENSLES_ANDROID_H) IF(HAVE_SLES_OPENSLES_ANDROID_H) - CHECK_SHARED_LIBRARY_EXISTS(OpenSLES slCreateEngine 6 "" HAVE_LIBOPENSLES) + CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES) IF(HAVE_LIBOPENSLES) SET(HAVE_OPENSL 1) SET(ALC_OBJS ${ALC_OBJS} Alc/opensl.c) diff --git a/cmake/CheckSharedFunctionExists.c b/cmake/CheckSharedFunctionExists.c deleted file mode 100644 index 31e3fa92..00000000 --- a/cmake/CheckSharedFunctionExists.c +++ /dev/null @@ -1,38 +0,0 @@ -#ifdef CHECK_SHARED_FUNCTION_EXISTS - -#include <stdlib.h> - -#ifndef CALLSTACK -#define CALLSTACK -#endif - -#ifdef _WIN32 -#ifdef ARGSTACK -char __stdcall CHECK_SHARED_FUNCTION_EXISTS(ARGSTACK); -#else -char __stdcall CHECK_SHARED_FUNCTION_EXISTS(void); -#endif -#else -char CHECK_SHARED_FUNCTION_EXISTS(); -#endif - -#ifdef __CLASSIC_C__ -int main(){ - int ac; - char*av[]; -#else -int main(int ac, char*av[]){ -#endif - CHECK_SHARED_FUNCTION_EXISTS(CALLSTACK); - if(ac > 1000) - { - return *av[0]; - } - return 0; -} - -#else /* CHECK_SHARED_FUNCTION_EXISTS */ - -# error "CHECK_SHARED_FUNCTION_EXISTS has to specify the function" - -#endif /* CHECK_SHARED_FUNCTION_EXISTS */ diff --git a/cmake/CheckSharedFunctionExists.cmake b/cmake/CheckSharedFunctionExists.cmake new file mode 100644 index 00000000..4980effa --- /dev/null +++ b/cmake/CheckSharedFunctionExists.cmake @@ -0,0 +1,92 @@ +# - Check if a symbol exists as a function, variable, or macro +# CHECK_SYMBOL_EXISTS(<symbol> <files> <variable>) +# +# Check that the <symbol> is available after including given header +# <files> and store the result in a <variable>. Specify the list +# of files in one argument as a semicolon-separated list. +# +# If the header files define the symbol as a macro it is considered +# available and assumed to work. If the header files declare the +# symbol as a function or variable then the symbol must also be +# available for linking. If the symbol is a type or enum value +# it will not be recognized (consider using CheckTypeSize or +# CheckCSourceCompiles). +# +# The following variables may be set before calling this macro to +# modify the way the check is run: +# +# CMAKE_REQUIRED_FLAGS = string of compile command line flags +# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) +# CMAKE_REQUIRED_INCLUDES = list of include directories +# CMAKE_REQUIRED_LIBRARIES = list of libraries to link + +#============================================================================= +# Copyright 2003-2011 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +MACRO(CHECK_SHARED_FUNCTION_EXISTS SYMBOL FILES LIBRARY LOCATION VARIABLE) + IF("${VARIABLE}" MATCHES "^${VARIABLE}$") + SET(CMAKE_CONFIGURABLE_FILE_CONTENT "/* */\n") + SET(MACRO_CHECK_SYMBOL_EXISTS_FLAGS ${CMAKE_REQUIRED_FLAGS}) + IF(CMAKE_REQUIRED_LIBRARIES) + SET(CHECK_SYMBOL_EXISTS_LIBS + "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES};${LIBRARY}") + ELSE(CMAKE_REQUIRED_LIBRARIES) + SET(CHECK_SYMBOL_EXISTS_LIBS + "-DLINK_LIBRARIES:STRING=${LIBRARY}") + ENDIF(CMAKE_REQUIRED_LIBRARIES) + IF(CMAKE_REQUIRED_INCLUDES) + SET(CMAKE_SYMBOL_EXISTS_INCLUDES + "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}") + ELSE(CMAKE_REQUIRED_INCLUDES) + SET(CMAKE_SYMBOL_EXISTS_INCLUDES) + ENDIF(CMAKE_REQUIRED_INCLUDES) + FOREACH(FILE ${FILES}) + SET(CMAKE_CONFIGURABLE_FILE_CONTENT + "${CMAKE_CONFIGURABLE_FILE_CONTENT}#include <${FILE}>\n") + ENDFOREACH(FILE) + SET(CMAKE_CONFIGURABLE_FILE_CONTENT + "${CMAKE_CONFIGURABLE_FILE_CONTENT}\nvoid cmakeRequireSymbol(int dummy,...){(void)dummy;}\nint main()\n{\n cmakeRequireSymbol(0,&${SYMBOL});\n return 0;\n}\n") + + CONFIGURE_FILE("${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in" + "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckSymbolExists.c" @ONLY) + + MESSAGE(STATUS "Looking for ${SYMBOL} in ${LIBRARY}") + TRY_COMPILE(${VARIABLE} + ${CMAKE_BINARY_DIR} + ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckSymbolExists.c + COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} + CMAKE_FLAGS + -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_SYMBOL_EXISTS_FLAGS} + -DLINK_DIRECTORIES:STRING=${LOCATION} + "${CHECK_SYMBOL_EXISTS_LIBS}" + "${CMAKE_SYMBOL_EXISTS_INCLUDES}" + OUTPUT_VARIABLE OUTPUT) + IF(${VARIABLE}) + MESSAGE(STATUS "Looking for ${SYMBOL} in ${LIBRARY} - found") + SET(${VARIABLE} 1 CACHE INTERNAL "Have symbol ${SYMBOL} in ${LIBRARY}") + FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "Determining if the ${SYMBOL} " + "exist in ${LIBRARY} passed with the following output:\n" + "${OUTPUT}\nFile ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckSymbolExists.c:\n" + "${CMAKE_CONFIGURABLE_FILE_CONTENT}\n") + ELSE(${VARIABLE}) + MESSAGE(STATUS "Looking for ${SYMBOL} in ${LIBRARY} - not found.") + SET(${VARIABLE} "" CACHE INTERNAL "Have symbol ${SYMBOL} in ${LIBRARY}") + FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Determining if the ${SYMBOL} " + "exist in ${LIBRARY} failed with the following output:\n" + "${OUTPUT}\nFile ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckSymbolExists.c:\n" + "${CMAKE_CONFIGURABLE_FILE_CONTENT}\n") + ENDIF(${VARIABLE}) + ENDIF("${VARIABLE}" MATCHES "^${VARIABLE}$") +ENDMACRO(CHECK_SHARED_FUNCTION_EXISTS) diff --git a/cmake/CheckSharedLibraryExists.cmake b/cmake/CheckSharedLibraryExists.cmake deleted file mode 100644 index 0069d892..00000000 --- a/cmake/CheckSharedLibraryExists.cmake +++ /dev/null @@ -1,70 +0,0 @@ -# - Check if the function exists. -# CHECK_LIBRARY_EXISTS (LIBRARY FUNCTION LOCATION VARIABLE) -# -# LIBRARY - the name of the library you are looking for -# FUNCTION - the name of the function -# ARGCOUNT - number of arguments for stdcall functions -# LOCATION - location where the library should be found -# VARIABLE - variable to store the result -# -# The following variables may be set before calling this macro to -# modify the way the check is run: -# -# CMAKE_REQUIRED_FLAGS = string of compile command line flags -# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) -# CMAKE_REQUIRED_LIBRARIES = list of libraries to link - -MACRO(CHECK_SHARED_LIBRARY_EXISTS LIBRARY FUNCTION ARGCOUNT LOCATION VARIABLE) - IF("${VARIABLE}" MATCHES "^${VARIABLE}$") - SET(MACRO_CHECK_LIBRARY_EXISTS_DEFINITION - "-DCHECK_SHARED_FUNCTION_EXISTS=${FUNCTION} ${CMAKE_REQUIRED_FLAGS}") - IF(WIN32) - IF(${ARGCOUNT} GREATER 0) - SET(ARGSTACK "void*") - SET(CALLSTACK "NULL") - SET(CURARG 1) - WHILE(${ARGCOUNT} GREATER ${CURARG}) - SET(ARGSTACK "${ARGSTACK},void*") - SET(CALLSTACK "${CALLSTACK},NULL") - MATH(EXPR CURARG "${CURARG} + 1") - ENDWHILE(${ARGCOUNT} GREATER ${CURARG}) - SET(MACRO_CHECK_LIBRARY_EXISTS_DEFINITION - "-D_WIN32 -DARGSTACK=\"${ARGSTACK}\" -DCALLSTACK=\"${CALLSTACK}\" ${MACRO_CHECK_LIBRARY_EXISTS_DEFINITION}") - ELSE(${ARGCOUNT} GREATER 0) - SET(MACRO_CHECK_LIBRARY_EXISTS_DEFINITION - "-D_WIN32 ${MACRO_CHECK_LIBRARY_EXISTS_DEFINITION}") - ENDIF(${ARGCOUNT} GREATER 0) - ENDIF(WIN32) - MESSAGE(STATUS "Looking for ${FUNCTION} in ${LIBRARY}") - SET(CHECK_LIBRARY_EXISTS_LIBRARIES ${LIBRARY}) - IF(CMAKE_REQUIRED_LIBRARIES) - SET(CHECK_LIBRARY_EXISTS_LIBRARIES - ${CHECK_LIBRARY_EXISTS_LIBRARIES} ${CMAKE_REQUIRED_LIBRARIES}) - ENDIF(CMAKE_REQUIRED_LIBRARIES) - TRY_COMPILE(${VARIABLE} - ${CMAKE_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/cmake/CheckSharedFunctionExists.c - COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} - CMAKE_FLAGS - -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_LIBRARY_EXISTS_DEFINITION} - -DLINK_DIRECTORIES:STRING=${LOCATION} - "-DLINK_LIBRARIES:STRING=${CHECK_LIBRARY_EXISTS_LIBRARIES}" - OUTPUT_VARIABLE OUTPUT) - - IF(${VARIABLE}) - MESSAGE(STATUS "Looking for ${FUNCTION} in ${LIBRARY} - found") - SET(${VARIABLE} 1 CACHE INTERNAL "Have library ${LIBRARY}") - FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log - "Determining if the function ${FUNCTION} exists in the ${LIBRARY} " - "passed with the following output:\n" - "${OUTPUT}\n\n") - ELSE(${VARIABLE}) - MESSAGE(STATUS "Looking for ${FUNCTION} in ${LIBRARY} - not found") - SET(${VARIABLE} "" CACHE INTERNAL "Have library ${LIBRARY}") - FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log - "Determining if the function ${FUNCTION} exists in the ${LIBRARY} " - "failed with the following output:\n" - "${OUTPUT}\n\n") - ENDIF(${VARIABLE}) - ENDIF("${VARIABLE}" MATCHES "^${VARIABLE}$") -ENDMACRO(CHECK_SHARED_LIBRARY_EXISTS) |