From 8e4003e1287b876bda4eef98b0d5181baaef6b7f Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 23 Jul 2011 02:52:12 -0700 Subject: [PATCH] Use a better method to check for shared functions --- CMakeLists.txt | 23 +++++---- cmake/CheckSharedFunctionExists.c | 28 ----------- cmake/CheckSharedFunctionExists.cmake | 92 +++++++++++++++++++++++++++++++++++ cmake/CheckSharedLibraryExists.cmake | 56 --------------------- 4 files changed, 103 insertions(+), 96 deletions(-) delete mode 100644 cmake/CheckSharedFunctionExists.c create mode 100644 cmake/CheckSharedFunctionExists.cmake delete mode 100644 cmake/CheckSharedLibraryExists.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 384ec55..561cdd9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,7 @@ INCLUDE(CheckFunctionExists) INCLUDE(CheckIncludeFile) INCLUDE(CheckIncludeFiles) INCLUDE(CheckLibraryExists) -INCLUDE(CheckSharedLibraryExists) +INCLUDE(CheckSharedFunctionExists) INCLUDE(FindPkgConfig) INCLUDE(UsePkgConfig) INCLUDE(CheckFileOffsetBits) @@ -53,12 +53,12 @@ IF(NOT DEFINED CMAKE_DEBUG_POSTFIX) ENDIF(NOT DEFINED CMAKE_DEBUG_POSTFIX) -CHECK_SHARED_LIBRARY_EXISTS(stdc++ memset "" HAS_STDCXX) +CHECK_LIBRARY_EXISTS(stdc++ memset "" HAS_STDCXX) IF(HAS_STDCXX) SET(EXTRA_LIBS stdc++ ${EXTRA_LIBS}) ENDIF(HAS_STDCXX) -CHECK_SHARED_LIBRARY_EXISTS(m pow "" HAS_LIBM) +CHECK_LIBRARY_EXISTS(m pow "" HAS_LIBM) IF(HAS_LIBM) SET(EXTRA_LIBS m ${EXTRA_LIBS}) ENDIF(HAS_LIBM) @@ -138,7 +138,7 @@ ELSE(HAVE_WINDOWS_H) ADD_DEFINITIONS(-D_GNU_SOURCE=1) CHECK_FUNCTION_EXISTS(pthread_create HAS_PTHREAD_CREATE) IF(NOT HAS_PTHREAD_CREATE) - CHECK_SHARED_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD) + CHECK_SHARED_FUNCTION_EXISTS(pthread_create "pthread.h" pthread "" HAVE_LIBPTHREAD) IF(NOT HAVE_LIBPTHREAD) MESSAGE(FATAL_ERROR "pthread_create not found on non-Windows target!") ENDIF(NOT HAVE_LIBPTHREAD) @@ -157,7 +157,7 @@ CHECK_INCLUDE_FILE(signal.h HAVE_SIGNAL_H) CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H) IF(HAVE_DLFCN_H) - CHECK_SHARED_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL) + CHECK_SHARED_FUNCTION_EXISTS(dlopen "dlfcn.h" dl "" HAVE_LIBDL) IF(HAVE_LIBDL) SET(EXTRA_LIBS dl ${EXTRA_LIBS}) ENDIF(HAVE_LIBDL) @@ -220,8 +220,7 @@ IF(SNDFILE) FIND_PACKAGE(SndFile) IF(SNDFILE_FOUND) SET(HAS_SNDFILE 1) - SET_SOURCE_FILES_PROPERTIES(src/codec_sndfile.cpp PROPERTIES - INCLUDE_DIRECTORIES "${SNDFILE_INCLUDE_DIRS}") + INCLUDE_DIRECTORIES(${SNDFILE_INCLUDE_DIRS}) ENDIF(SNDFILE_FOUND) ENDIF(SNDFILE_FOUND) IF(HAS_SNDFILE) @@ -252,7 +251,7 @@ IF(VORBIS) IF(NOT VORBISIDEC_FOUND) CHECK_INCLUDE_FILE(tremor/ivorbisfile.h HAVE_TREMOR_IVORBISFILE_H) IF(HAVE_TREMOR_IVORBISFILE_H) - CHECK_SHARED_LIBRARY_EXISTS(vorbisidec ov_open "" HAVE_LIBVORBISIDEC) + CHECK_SHARED_FUNCTION_EXISTS(ov_open "tremor/ivorbisfile.h" vorbisidec "" HAVE_LIBVORBISIDEC) IF(DYNLOAD OR HAVE_LIBVORBISIDEC) SET(HAS_VORBISFILE 1) IF(HAVE_LIBVORBISIDEC) @@ -282,7 +281,7 @@ IF(FLAC) #IF(NOT LIBFLAC_FOUND) CHECK_INCLUDE_FILE(FLAC/all.h HAVE_FLAC_ALL_H) IF(HAVE_FLAC_ALL_H) - CHECK_SHARED_LIBRARY_EXISTS(FLAC FLAC__stream_decoder_new "" HAVE_LIBFLAC) + CHECK_SHARED_FUNCTION_EXISTS(FLAC__stream_decoder_new "FLAC/all.h" FLAC "" HAVE_LIBFLAC) IF(DYNLOAD OR HAVE_LIBFLAC) SET(HAS_FLAC 1) IF(HAVE_LIBFLAC) @@ -308,7 +307,7 @@ IF(MPG123) IF(NOT MPG123_FOUND) CHECK_INCLUDE_FILE(mpg123.h HAVE_MPG123_H) IF(HAVE_MPG123_H) - CHECK_SHARED_LIBRARY_EXISTS(mpg123 mpg123_init "" HAVE_LIBMPG123) + CHECK_SHARED_FUNCTION_EXISTS(mpg123_init "mpg123.h" mpg123 "" HAVE_LIBMPG123) IF(DYNLOAD OR HAVE_LIBMPG123) SET(HAS_MPG123 1) IF(HAVE_LIBMPG123) @@ -358,7 +357,7 @@ IF(MODPLUG) IF(NOT MODPLUG_FOUND) CHECK_INCLUDE_FILE(modplug.h HAVE_MODPLUG_H) IF(HAVE_MODPLUG_H) - CHECK_SHARED_LIBRARY_EXISTS(modplug ModPlug_Load "" HAVE_LIBMODPLUG) + CHECK_SHARED_FUNCTION_EXISTS(ModPlug_Load "modplug.h" modplug "" HAVE_LIBMODPLUG) IF(DYNLOAD OR HAVE_LIBMODPLUG) SET(HAS_MODPLUG 1) IF(HAVE_LIBMODPLUG) @@ -385,7 +384,7 @@ IF(FLUIDSYNTH) IF(NOT FLUIDSYNTH_FOUND) CHECK_INCLUDE_FILE(fluidsynth.h HAVE_FLUIDSYNTH_H) IF(HAVE_FLUIDSYNTH_H) - CHECK_SHARED_LIBRARY_EXISTS(fluidsynth new_fluid_synth "" HAVE_LIBFLUIDSYNTH) + CHECK_SHARED_FUNCTION_EXISTS(new_fluid_synth "fluidsynth.h" fluidsynth "" HAVE_LIBFLUIDSYNTH) IF(DYNLOAD OR HAVE_LIBFLUIDSYNTH) SET(HAS_FLUIDSYNTH 1) IF(HAVE_LIBFLUIDSYNTH) diff --git a/cmake/CheckSharedFunctionExists.c b/cmake/CheckSharedFunctionExists.c deleted file mode 100644 index c3e4d6f..0000000 --- a/cmake/CheckSharedFunctionExists.c +++ /dev/null @@ -1,28 +0,0 @@ -#ifdef CHECK_SHARED_FUNCTION_EXISTS - -#ifdef _WIN32 -char __declspec(dllimport) CHECK_SHARED_FUNCTION_EXISTS(); -#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(); - 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 0000000..4980eff --- /dev/null +++ b/cmake/CheckSharedFunctionExists.cmake @@ -0,0 +1,92 @@ +# - Check if a symbol exists as a function, variable, or macro +# CHECK_SYMBOL_EXISTS( ) +# +# Check that the is available after including given header +# and store the result in a . 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 974257d..0000000 --- a/cmake/CheckSharedLibraryExists.cmake +++ /dev/null @@ -1,56 +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 -# 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 LOCATION VARIABLE) - IF("${VARIABLE}" MATCHES "^${VARIABLE}$") - SET(MACRO_CHECK_LIBRARY_EXISTS_DEFINITION - "-DCHECK_SHARED_FUNCTION_EXISTS=${FUNCTION} ${CMAKE_REQUIRED_FLAGS}") - IF(WIN32) - SET(MACRO_CHECK_LIBRARY_EXISTS_DEFINITION - "-D_WIN32 ${MACRO_CHECK_LIBRARY_EXISTS_DEFINITION}") - 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) -- 2.11.4.GIT