# Roy cmake build

PROJECT(ROY)

SET(BUILD_SHARED_LIBS "ON" CACHE BOOL "Whether or not to build libraries as shared.")

# For some reason this is broken.
IF(WIN32)
    SET(BUILD_SHARED_LIBS "OFF")
ENDIF(WIN32)


# Check size of various types..
INCLUDE(${CMAKE_ROOT}/Modules/CheckTypeSize.cmake)
CHECK_TYPE_SIZE("char" SIZEOF_CHAR)
CHECK_TYPE_SIZE("short int" SIZEOF_SHORT_INT)
CHECK_TYPE_SIZE("int" SIZEOF_INT)
CHECK_TYPE_SIZE("long int" SIZEOF_LONG_INT)
CHECK_TYPE_SIZE("long long int" SIZEOF_LONG_LONG_INT)

# Check for various functions..
INCLUDE(${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
CHECK_FUNCTION_EXISTS(popen HAVE_POPEN)
CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)

# Easy way to check for includes 
INCLUDE(${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake)
CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H)
CHECK_INCLUDE_FILE(sys/time.h HAVE_SYS_TIME_H)
CHECK_INCLUDE_FILE(sys/socket.h HAVE_SYS_SOCKET_H)
CHECK_INCLUDE_FILE(netinet/in.h HAVE_NETINET_IN_H)
CHECK_INCLUDE_FILE(netdb.h HAVE_NETDB_H)
CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H)
CHECK_INCLUDE_FILE(errno.h HAVE_ERRNO_H)
CHECK_INCLUDE_FILE(sys/uio.h HAVE_SYS_UIO_H)
CHECK_INCLUDE_FILE(fcntl.h HAVE_FCNTL_H)
CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)

# find zlib
FIND_LIBRARY(ZLIB_LOCATION z PATHS /lib /usr/lib /usr/local/lib /usr/pkg/lib 
             DOC "Location of the gzip compression library 'libz'")
FIND_FILE(ZLIB_HEADER zlib.h /usr/include /usr/local/include /usr/pkg/include
          DOC "Location of the gzip compression library header 'zlib.h'")

GET_FILENAME_COMPONENT(ZLIB_BASENAME ${ZLIB_HEADER} PATH)
INCLUDE_DIRECTORIES(${ZLIB_BASENAME})



IF(UNIX)

    # find pthread
    # We keep the PTHREAD_LIBS variable for roy-config.
    SET(PTHREAD_LIBS "" CACHE INTERNAL "Pthread libraries")
    FIND_LIBRARY(PTHREAD_LOCATION pthread PATHS /lib /usr/lib /usr/local/lib /usr/pkg/lib 
                 DOC "Location of the pthread threading library")
    FIND_FILE(PTHREAD_HEADER pthread.h /usr/include /usr/local/include /usr/pkg/include
              DOC "Location of the pthread library header 'pthread.h'")
    GET_FILENAME_COMPONENT(PTHREAD_BASENAME ${PTHREAD_HEADER} PATH)
    INCLUDE_DIRECTORIES(${PTHREAD_BASENAME})
    IF(LIBPTHREAD_LOCATION)
        # This is broken.. need to get real lib name.
        SET(PTHREAD_LIBS "-lpthread")
    ENDIF(LIBPTHREAD_LOCATION)
   
    # Setup the GCC BUILTIN variable
    SET(GCC_BUILTIN_RETURN_WORKS OFF CACHE BOOL "If this is enabled, rmdbg will attempt to create stack traces using gcc.  Only enable if you know what you are doing.")
    MARK_AS_ADVANCED(GCC_BUILTIN_RETURN_WORKS)

    # Link in the math library to roy.
    FIND_LIBRARY(LIBM_LOCATION m PATHS /lib /usr/lib /usr/local/lib /usr/pkg/lib 
                 DOC "Location of the standard math library.")
    MARK_AS_ADVANCED(LIBM_LOCATION)


    # Get socket libraries.  We also keep the SOCKET_LIBS variable for
    # roy-config.
    SET(SOCKET_LIBS "" CACHE INTERNAL "Socket libraries")

    # Socket library
    FIND_LIBRARY(LIBSOCKET_LOCATION socket PATHS /lib /usr/lib /usr/local/lib /usr/pkg/lib 
                 DOC "Location of the socket library.")
    MARK_AS_ADVANCED(LIBSOCKET_LOCATION)
    IF(LIBSOCKET_LOCATION)
        SET(SOCKET_LIBS "-lsocket")
    ENDIF(LIBSOCKET_LOCATION)
   
    # nsl library
    FIND_LIBRARY(LIBNSL_LOCATION nsl PATHS /lib /usr/lib /usr/local/lib /usr/pkg/lib 
                 DOC "Location of the hostname lookup 'nsl' library.")
    MARK_AS_ADVANCED(LIBNSL_LOCATION)
    IF(LIBNSL_LOCATION)
        SET(SOCKET_LIBS "${SOCKET_LIBS} -lnsl")
    ENDIF(LIBNSL_LOCATION)

    FIND_LIBRARY(LIBPTHREAD_LOCATION pthread PATHS /lib /usr/lib /usr/local/lib /usr/pkg/lib 
                 DOC "Location of the pthread library.")
    MARK_AS_ADVANCED(LIBPTHREAD_LOCATION)
    IF(LIBPTHREAD_LOCATION)
        SET(PTHREAD_LIBS "-lpthread")
    ENDIF(LIBPTHREAD_LOCATION)

    # Generate and install roy-config.  You could do this on windows too but
    # I don't there's any point
    SET(prefix ${CMAKE_INSTALL_PREFIX} CACHE INTERNAL "prefix for roy-config.in")
    CONFIGURE_FILE(${ROY_SOURCE_DIR}/roy-config.in
                   ${ROY_BINARY_DIR}/roy-config
                   ESCAPE_QUOTES)

    # Found a CMake bug! hehe, have to tell it the file twice or
    # it tries to match it as a regex.
    INSTALL_PROGRAMS(/bin roy-config roy-config)

ENDIF(UNIX)



IF(WIN32)
    SET(WIN32 "1" CACHE INTERNAL "Set if on a win32 system")
    LINK_LIBRARIES(oldnames)
ENDIF(WIN32)



# Generate and install a roy-config.h
CONFIGURE_FILE(${ROY_SOURCE_DIR}/roy/roy-config.h.cmake.in
               ${ROY_BINARY_DIR}/roy/roy-config.h
               ESCAPE_QUOTES)
INSTALL_FILES(/include/roy/ FILES ${ROY_BINARY_DIR}/roy/roy-config.h)


# Make sure everyone can find roy.h and roy-config.h
INCLUDE_DIRECTORIES(${ROY_SOURCE_DIR}
                    ${ROY_BINARY_DIR})

# Install main roy.h here
INSTALL_FILES(/include/ FILES roy.h)

SUBDIRS(roy tests therml tools)

