# Copyright (C) 2009 David Sugar, Tycho Softworks
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#

cmake_minimum_required(VERSION 2.6)
PROJECT(ccaudio2)
set (VERSION 2.1.4)

set(RC_VERSION ${VERSION})
STRING(REGEX REPLACE "[.]" "," RC_VERSION ${RC_VERSION})
set(RC_VERSION "${RC_VERSION},0")

if(UNIX)
    execute_process(WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND "./cmake-abi.sh" OUTPUT_VARIABLE LIB_VERSION)
else()
    set(LIB_VERSION ${VERSION})
endif()

set(SOVERSION ${LIB_VERSION})
STRING(REGEX REPLACE "[.].*$" "" SOVERSION ${SOVERSION})

INCLUDE(CheckIncludeFiles)
INCLUDE(CheckLibraryExists)
INCLUDE(GNUInstallDirs)

set(INSTALL_PHRASES ${CMAKE_INSTALL_DATADIR}/ccaudio2)

if(MSVC60)
    MARK_AS_ADVANCED(BUILD_RUNTIME)
else()
    option(BUILD_RUNTIME "Set to OFF to build static runtime" ON)
endif()

MESSAGE( STATUS "Configuring GNU ccaudio2 ${VERSION}...")

SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_NAME} library")
SET(CPACK_PACKAGE_VENDOR              "David Sugar")
SET(CPACK_PACKAGE_DESCRIPTION_FILE    "${CMAKE_CURRENT_SOURCE_DIR}/README")
SET(CPACK_RESOURCE_FILE_LICENSE       "${CMAKE_CURRENT_SOURCE_DIR}/COPYING")
set(PACKAGE_FILE_NAME                 ${PROJECT_NAME})
set(PACKAGE_FILE_VERSION              ${VERSION})

IF (WIN32)
    SET(CPACK_PACKAGE_FILE_NAME "${PACKAGE_FILE_NAME}-${PACKAGE_FILE_VERSION}")
ELSE (WIN32)
    SET(CPACK_PACKAGE_FILE_NAME "${PACKAGE_FILE_NAME}-bin-${PACKAGE_FILE_VERSION}")
    if (NOT CPACK_GENERATOR)
        SET(CPACK_GENERATOR "TBZ2")
    endif()
ENDIF (WIN32)

IF(WIN32 AND NOT UNIX)
    SET(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_FILE_NAME}")

    # There is a bug in NSI that does not handle full unix paths properly. Make
    # sure there is at least one set of four (4) backlasshes.
    # SET(CPACK_PACKAGE_ICON "${CMake_SOURCE_DIR}/Utilities/Release\\\\InstallIcon.bmp")
    # SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\MyExecutable.exe")
    SET(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY} ${PROJECT_NAME}$")
    SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\www.gnutelephony.org")
    SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\www.gnutelephony.org")
    SET(CPACK_NSIS_CONTACT "dyfet@gnutelephony.org")
    SET(CPACK_NSIS_MODIFY_PATH ON)

ENDIF(WIN32 AND NOT UNIX)

set(CPACK_COMPONENTS_ALL libraries headers)
set(CPACK_COMPONENT_LIBRARIES_DISPLAY_NAME "Libraries")
set(CPACK_COMPONENT_HEADERS_DISPLAY_NAME   "C++ Headers")
set(CPACK_COMPONENT_LIBRARIES_DESCRIPTION  "Dynamic library")
set(CPACK_COMPONENT_HEADERS_DESCRIPTION
    "Header files needed to build applications using ucommon library")
SET(CPACK_SOURCE_IGNORE_FILES ".bzr" "build" ".swp$" ".*~" ".svn" ".git")
SET(CPACK_SOURCE_GENERATOR "TBZ2")
SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${PACKAGE_FILE_NAME}-${PACKAGE_FILE_VERSION}")

# This must always be last!
INCLUDE(CPack)

# set to true for debug and trace during CMakeLists development
set(CMAKE_VERBOSE_MAKEFILE FALSE)

# Set defaults and pass common options.  Common build options can be passed
# to cmake using cmake -DWITH_CFLAGS="...", WITH_LIBS, and WITH_INCLUDES
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/inc ${WITH_INCLUDES})
add_definitions(${WITH_CFLAGS})
link_libraries(${WITH_LIBS})

if (USES_UCOMMON_INCLUDE_DIRS)
    message(STATUS "  Using local ucommon dependency")
else()
    find_package(PkgConfig)
    pkg_check_modules(USES_UCOMMON REQUIRED ucommon>=6.2.0)
endif()

include_directories(${USES_UCOMMON_INCLUDE_DIRS})
link_directories(${USES_UCOMMON_LIBRARY_DIRS})
add_definitions(${USES_UCOMMON_CFLAGS})

# by default we build static libs for windows, shared libs for unix.
# we may also set this from a top level cmake or -DWITH_XX_LIBS

if(BUILD_RUNTIME)
    set(BUILD_RUNTIME_TYPE SHARED)
else()
    set(BUILD_RUNTIME_TYPE STATIC)
endif()

check_include_files(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
check_include_files(speex/speex.h HAVE_SPEEX_SPEEX_H)
check_include_files(gsm.h HAVE_GSM_H)
check_include_files(gsm/gsm.h HAVE_GSM_GSM_H)
check_include_files(endian.h HAVE_ENDIAN_H)

check_library_exists(ossaudio _oss_ioctl "" OSSAUDIO_LIB)
if(OSSAUDIO_LIB)
    set(AUDIO_LIBS ossaudio)
endif()

check_include_files(CoreAudio/CoreAudio.h OSX_AUDIO)
if(OSX_AUDIO)
    set(AUDIO_LIBS "-framework CoreAudio")
endif()

if(WIN32)
    set(AUDIO_LIBS winmm msacm32)
endif()

check_library_exists(m sqrt "" MATH_LIB)
if(MATH_LIB)
    set(MATH_LIB m)
endif()

if(NOT HAVE_SPEEX_SPEEX_H AND EXISTS ${CMAKE_BINARY_DIR}/Frameworks/Speex)
    include_directories(${CMAKE_BINARY_DIR}/Frameworks/Speex/include)
    link_directories(${CMAKE_BINARY_DIR}/Frameworks/Speex/lib)
    set(HAVE_SPEEX_SPEEX_H 1)
endif()

if(HAVE_SPEEX_SPEEX_H)
    set(AUDIO_LIBS ${AUDIO_LIBS} speex)
endif()

if(HAVE_GSM_H OR HAVE_GSM_GSM_H)
    set(AUDIO_LIBS ${AUDIO_LIBS} gsm)
endif()

configure_file(ccaudio2-config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/ccaudio2-config.h)

file(GLOB ccaudio_src src/*.cpp)
file(GLOB ccaudio_man1 utils/*.1)
file(GLOB ccaudio_conf utils/*.conf)

set(ccaudio_inc inc/ccaudio2.h)
add_library(ccaudio2 ${BUILD_RUNTIME_TYPE} ${ccaudio_src} ${ccaudio_inc})
set_target_properties(ccaudio2 PROPERTIES VERSION ${LIB_VERSION} SOVERSION ${SOVERSION})
add_dependencies(ccaudio2 ucommon)
target_link_libraries(ccaudio2 ${USES_UCOMMON_LIBRARIES} ${AUDIO_LIBS} ${WITH_MATH_LIB} ${MATH_LIB})

add_executable(ccaudio-tonetool utils/tonetool.cpp)
add_dependencies(ccaudio-tonetool ccaudio2 ucommon)
set_target_properties(ccaudio-tonetool PROPERTIES OUTPUT_NAME tonetool)
target_link_libraries(ccaudio-tonetool ccaudio2 ucommon ${USES_UCOMMON_LIBRARIES})

add_executable(ccaudio-audiotool utils/audiotool.cpp)
add_dependencies(ccaudio-audiotool ccaudio2 ucommon)
set_target_properties(ccaudio-audiotool PROPERTIES OUTPUT_NAME audiotool)
target_link_libraries(ccaudio-audiotool ccaudio2 ucommon ${USES_UCOMMON_LIBRARIES})

if(UNIX)
    foreach(flag ${USES_UCOMMON_CFLAGS})
        set(PACKAGE_FLAGS "${PACKAGE_FLAGS} ${flag}")
    endforeach()
    foreach(lib ${USES_UCOMMON_LIBRARIES})
        STRING(REGEX REPLACE "^[-]l" "" slib ${lib})
        set(PACKAGE_LIBS "${PACKAGE_LIBS} -l${slib}")
    endforeach()

    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ccaudio2.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/ccaudio2.pc)

    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ccaudio2.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
endif()

install(FILES ${ccaudio_conf} DESTINATION ${CMAKE_INSTALL_SYSCONFDIR})
install(FILES ${ccaudio_man1} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
install(FILES inc/ccaudio2.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(TARGETS ccaudio2 DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(TARGETS ccaudio-tonetool ccaudio-audiotool DESTINATION ${CMAKE_INSTALL_BINDIR})

