* CMake: added tests for big endian, typecast to union and monotonic clock.

* CMake: added 'have function' tests for setrlimit, strnlen, getpid and gettid.
* CMake: added option ENABLE_RDTSC.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@14908 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
flaviojs 2011-07-15 06:27:35 +00:00
parent 305dc5421a
commit cf819cc321
2 changed files with 128 additions and 20 deletions

View File

@ -63,10 +63,22 @@ if( WIN32 )
endif()
if( MSVC )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} "oldnames.lib" "ws2_32.lib" )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DDB_MANUAL_CAST_TO_UNION" )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE" )
endif()
#
# 3rd party
#
add_subdirectory( 3rdparty )
include( CheckCSourceCompiles )
include( CheckCSourceRuns )
include( CheckIncludeFile )
include( CheckFunctionExists )
include( FindFunctionLibrary )
include( TestBigEndian )
#
# Find svnversion
#
@ -119,18 +131,10 @@ if( Subversion_FOUND AND SVNVERSION )
endif()
#
# 3rdparty and library tests
#
add_subdirectory( 3rdparty )
include( FindFunctionLibrary )
include( CheckIncludeFile )
#
# math library (FreeBSD/Linux/Solaris)
#
message( STATUS "Detecting m library (math)" )
message( STATUS "Detecting math library (m)" )
CHECK_INCLUDE_FILE( math.h HAVE_MATH_H )
if( NOT HAVE_MATH_H )
message( FATAL_ERROR "math.h not found" )
@ -139,44 +143,145 @@ set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} )
find_function_library( floor FUNCTION_FLOOR_LIBRARIES m )
if( FUNCTION_FLOOR_LIBRARIES )
message( STATUS "Adding global library: ${FUNCTION_FLOOR_LIBRARIES}" )
list( APPEND GLOBAL_LIBRARIES ${FUNCTION_FLOOR_LIBRARIES} )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${FUNCTION_FLOOR_LIBRARIES} )
endif()
message( STATUS "Detecting m library (math) - done" )
message( STATUS "Detecting math library (m) - done" )
#
# dynamic loading library (Linux)
#
if( NOT WIN32 )
message( STATUS "Detecting dl library (dynamic loading)" )
message( STATUS "Detecting dynamic loading library (dl)" )
set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} )
find_function_library( dlopen FUNCTION_DLOPEN_LIBRARIES dl )
if( FUNCTION_DLOPEN_LIBRARIES )
message( STATUS "Adding global library: ${FUNCTION_DLOPEN_LIBRARIES}" )
list( APPEND GLOBAL_LIBRARIES ${FUNCTION_DLOPEN_LIBRARIES} )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${FUNCTION_DLOPEN_LIBRARIES} )
endif()
message( STATUS "Detecting dl library (dynamic loading) - done" )
message( STATUS "Detecting dynamic loading library (dl) - done" )
endif()
#
# socket/nsl/ws2_32 library (Solaris/MinGW)
# networking library (Solaris/MinGW)
#
if( NOT MSVC )
message( STATUS "Detecting socket/nsl/ws2_32 library (networking)" )
message( STATUS "Detecting networking library (socket/nsl/ws2_32)" )
set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} )
find_function_library( bind FUNCTION_BIND_LIBRARIES socket ws2_32 )
if( FUNCTION_BIND_LIBRARIES )
message( STATUS "Adding global library: ${FUNCTION_BIND_LIBRARIES}" )
list( APPEND GLOBAL_LIBRARIES ${FUNCTION_BIND_LIBRARIES} )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${FUNCTION_BIND_LIBRARIES} )
endif()
set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} )
find_function_library( gethostbyname FUNCTION_GETHOSTBYNAME_LIBRARIES nsl )
if( FUNCTION_GETHOSTBYNAME_LIBRARIES )
message( STATUS "Adding global library: ${FUNCTION_GETHOSTBYNAME_LIBRARIES}" )
list( APPEND GLOBAL_LIBRARIES ${FUNCTION_GETHOSTBYNAME_LIBRARIES} )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${FUNCTION_GETHOSTBYNAME_LIBRARIES} )
endif()
message( STATUS "Detecting socket/nsl/ws2_32 library (networking) - done" )
message( STATUS "Detecting networking library (socket/nsl/ws2_32) - done" )
endif()
#
# Test for big endian
#
TEST_BIG_ENDIAN( BIG_ENDIAN )
if( NOT DEFINED BIG_ENDIAN )
message( WARNING "unable to determine endianess, only LITTLE ENDIAN is supported" )
elseif( BIG_ENDIAN )
message( FATAL_ERROR "bigendian is not supported" )
endif()
#
# Test typecast to union
#
message( STATUS "Check if we can typecast to union" )
set( SOURCECODE
"typedef union Foonion{\n"
" int i;\n"
" unsigned int ui;\n"
" const char* s;\n"
"} Foonion;\n"
"int get_i(Foonion onion){ return onion.i; }\n"
"int main(int argc, char** argv){\n"
"int i = 0;\n"
"return get_i(((Foonion)(int)i));\n"
"}\n"
)
CHECK_C_SOURCE_COMPILES( "${SOURCECODE}" HAVE_TYPECAST_TO_UNION )
if( HAVE_TYPECAST_TO_UNION )
message( STATUS "Check typecast to union - yes" )
else()
message( STATUS "Check typecast to union - no" )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DDB_MANUAL_CAST_TO_UNION" )
endif()
#
# Test monotonic clock
#
# CLOCK_MONOTONIC clock for clock_gettime
# Normally defines _POSIX_TIMERS > 0 and _POSIX_MONOTONIC_CLOCK (for posix
# compliant systems) and __FreeBSD_cc_version >= 500005 (for FreeBSD
# >= 5.1.0, which does not have the posix defines (ref. r11983)) would be
# checked but some systems define them even when they do not support it
# (ref. bugreport:1003).
#
message( STATUS "Check for monotonic clock" )
set( SOURCECODE
"#include <sys/time.h>\n"
"#include <time.h>\n"
"#include <unistd.h>\n"
"int main(int argc, char** argv){\n"
"struct timespec tval;\n"
"return clock_gettime(CLOCK_MONOTONIC, &tval);\n"
"}\n"
)
find_library( RT_LIBRARY rt )# (optional, rt on Debian)
mark_as_advanced( RT_LIBRARY )
set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} ${RT_LIBRARY} )
CHECK_C_SOURCE_RUNS( "${SOURCECODE}" HAVE_MONOTONIC_CLOCK )
if( HAVE_MONOTONIC_CLOCK )
message( STATUS "Check for monotonic clock - yes" )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${RT_LIBRARY} )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DHAVE_MONOTONIC_CLOCK" )
else()
message( STATUS "Check for monotonic clock - no" )
endif()
#
# Test if function exists:
# setrlimit - used to set the socket limit
# strnlen - string length with upper scan bound
# getpid - process id
# gettid - thread id
#
CHECK_FUNCTION_EXISTS( setrlimit HAVE_SETRLIMIT )
CHECK_FUNCTION_EXISTS( strnlen HAVE_STRNLEN )
CHECK_FUNCTION_EXISTS( getpid HAVE_GETPID )
CHECK_FUNCTION_EXISTS( gettid HAVE_GETTID )
foreach( define HAVE_SETRLIMIT HAVE_STRNLEN HAVE_GETPID HAVE_GETTID )
if( ${define} )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -D${define}" )
endif()
endforeach()
#
# Use RDTSC instruction as a timing source (time stamp counter on x86 since Pentium)
#
# Enable it when you've timing issues. (ex: in conjunction with XEN or Other Virtualization mechanisms)
# Please ensure that you've disabled dynamic CPU-Frequencys, such as power saving options.
# (On the most modern Dedicated Servers cpufreq is preconfigured, see your distribution's manual how to disable it)
#
option( ENABLE_RDTSC "use RDTSC instruction as a timing source" OFF )
if( ENABLE_RDTSC )
message( STATUS "Enabled RDTSC" )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DENABLE_RDTSC" )
endif()

View File

@ -2,6 +2,9 @@ Date Added
2011/07/15
* Changed the warning message of when setrlimit fails to be more explicit. [FlavioJS]
* CMake: added tests for big endian, typecast to union and monotonic clock.
* CMake: added 'have function' tests for setrlimit, strnlen, getpid and gettid.
* CMake: added option ENABLE_RDTSC.
2011/07/12
* CMake: set project language to C, added module FindFunctionLibrary, added search for dl library. (tested with debian-wheezy-i386) [FlavioJS]
* CMake: added search for math.h, added search for socket/nsl library. (tested with Solaris-201011-x86)