CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

PROJECT(libforensic1394)

# Current version of the library
SET(FORENSIC1394_VERSION_MAJOR 0)
SET(FORENSIC1394_VERSION_MINOR 2)
SET(FORENSIC1394_VERSION_PATCH 0)

# Overall version given as <major>.<minor>.<patch>
SET(FORENSIC1394_VERSION "${FORENSIC1394_VERSION_MAJOR}.${FORENSIC1394_VERSION_MINOR}.${FORENSIC1394_VERSION_PATCH}")

# This should be updated when the ABI is changed
SET(FORENSIC1394_SOVERSION 1)

INCLUDE(CheckIncludeFile)
INCLUDE(CheckCSourceCompiles)

INCLUDE_DIRECTORIES(./src)

IF(CMAKE_COMPILER_IS_GNUCC)
    # The more warnings the better
    ADD_DEFINITIONS(-g -pipe -Werror -fsigned-char -Wall)

    CHECK_C_SOURCE_COMPILES("
        #if ((defined(__GNUC__)) && (__GNUC__ >= 4))
        int main(int argc, char **argv) { int is_gcc4 = 1; return 0; }
        #else
        #error This is not gcc4.
        #endif
    " FORENSIC1394_IS_GCC4)

    IF(FORENSIC1394_IS_GCC4 AND NOT WIN32)
        # Hide all symbols by default (implicit on Windows)
        ADD_DEFINITIONS(-fvisibility=hidden)
    ENDIF()
ENDIF()

# Someday...
IF(MSVC)
    ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS=1)
ENDIF()

# Common source to all builds
SET(FORENSIC1394_SRCS
    src/forensic1394.h
    src/common.h
    src/common.c)

# Linux / Juju stack (others may be added later)
IF("${CMAKE_SYSTEM}" MATCHES "Linux")
    # Look for the firewire-core header
    CHECK_INCLUDE_FILE(linux/firewire-cdev.h FORENSIC1394_HAS_FWCORE)

    IF(NOT FORENSIC1394_HAS_FWCORE)
        MESSAGE(FATAL "linux/firewire-cdev.h not found!")
    ENDIF()

    SET(FORENSIC1394_SRCS ${FORENSIC1394_SRCS}
        src/linux/juju.c)
# Mac OS X / IOKit
ELSEIF(APPLE)
    # Ensure we link to IOKit for firewire access
    SET(OTHER_LDFLAGS ${OTHER_LDFLAGS} "-framework CoreFoundation -framework IOKit")

    SET(FORENSIC1394_SRCS ${FORENSIC1394_SRCS}
        src/macosx/iokit.c)
# Windows or BSD; currently unsupported
ELSE()
    MESSAGE(FATAL "Currently only Mac OS X and GNU/Linux are supported!")
ENDIF()

OPTION(FORENSIC1394_BUILD_STATIC "Build static library" TRUE)
IF(FORENSIC1394_BUILD_STATIC)
    ADD_LIBRARY(forensic1394-static STATIC ${FORENSIC1394_SRCS})
    SET_TARGET_PROPERTIES(forensic1394-static PROPERTIES OUTPUT_NAME "forensic1394")
    SET(FORENSIC1394_LIB_TARGET forensic1394-static)
    SET(FORENSIC1394_INSTALL_TARGETS ${FORENSIC1394_INSTALL_TARGETS} ";forensic1394-static")
ENDIF()

OPTION(FORENSIC1394_BUILD_SHARED "Build shared library" TRUE)
IF(FORENSIC1394_BUILD_SHARED)
    ADD_LIBRARY(forensic1394 SHARED ${FORENSIC1394_SRCS})
    SET_TARGET_PROPERTIES(forensic1394 PROPERTIES VERSION ${FORENSIC1394_VERSION})
    SET_TARGET_PROPERTIES(forensic1394 PROPERTIES SOVERSION ${FORENSIC1394_SOVERSION})
    TARGET_LINK_LIBRARIES(forensic1394 ${OPTIONAL_LIBRARY_LIBS} ${OTHER_LDFLAGS})
    SET(FORENSIC1394_LIB_TARGET forensic1394)
    SET(FORENSIC1394_INSTALL_TARGETS ${FORENSIC1394_INSTALL_TARGETS} ";forensic1394")
ENDIF()

# Must build either a shared or static library
IF(NOT FORENSIC1394_BUILD_SHARED AND NOT FORENSIC1394_BUILD_STATIC)
    MESSAGE(FATAL "Both shared and static libraries are disabled!")
ENDIF()

# From CMake FAQ
IF(FORENSIC1394_BUILD_SHARED AND FORENSIC1394_BUILD_STATIC)
    SET_TARGET_PROPERTIES(forensic1394 PROPERTIES CLEAN_DIRECT_OUTPUT 1)
    SET_TARGET_PROPERTIES(forensic1394-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
ENDIF()

INSTALL(TARGETS ${FORENSIC1394_INSTALL_TARGETS}
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)
INSTALL(FILES src/forensic1394.h DESTINATION include)

# Documentation
FIND_PACKAGE(Doxygen)
IF(DOXYGEN_FOUND)
    ADD_CUSTOM_TARGET(docs ${DOXYGEN_EXECUTABLE} COMMENT "Building documentation")
ELSE()
    MESSAGE(STATUS "Doxygen not found. You won't be able to build documentation.")
ENDIF()

# CPack package generation (must be set before we include CPack)
SET(CPACK_PACKAGE_VENDOR "Freddie Witherden")
SET(CPACK_PACKAGE_VERSION_MAJOR ${FORENSIC1394_VERSION_MAJOR})
SET(CPACK_PACKAGE_VERSION_MINOR ${FORENSIC1394_VERSION_MINOR})
SET(CPACK_PACKAGE_VERSION_PATCH ${FORENSIC1394_VERSION_PATCH})

# We only want TGZ packages by default
SET(CPACK_GENERATOR TGZ)

# See if we can build DEB/RPM packages
FIND_PROGRAM(FORENSIC1394_HAVE_DPKG dpkg)
FIND_PROGRAM(FORENSIC1394_HAVE_RPMBUILD rpmbuild)

IF(FORENSIC1394_HAVE_DPKG)
    MESSAGE(STATUS "Dpkg found. Enabling Debian packages.")
    SET(CPACK_GENERATOR ${CPACK_GENERATOR} DEB)

    # Debian packages really should have a valid maintainer
    IF(NOT CPACK_DEBIAN_PACKAGE_MAINTAINER)
        MESSAGE(STATUS "CPACK_DEBIAN_PACKAGE_MAINTAINER is not set. "
                       "Defaulting to \"Unknown\"")
        SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Unknown")
    ENDIF()
ENDIF()

IF(FORENSIC1394_HAVE_RPMBUILD)
    MESSAGE(STATUS "Rpmbuild found. Enabling RPM packages.")
    SET(CPACK_GENERATOR ${CPACK_GENERATOR} RPM)
ENDIF()

INCLUDE(CPack)
