CMakeLists.txt 7.23 KB
project(openbr)
cmake_minimum_required(VERSION 2.8.6)

# Global settings
set(BR_SHARE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/share/openbr")
set(CPACK_PACKAGE_NAME "OpenBR")
set(CPACK_PACKAGE_VENDOR "Open Biometric Recognition")
set(CPACK_PACKAGE_DESCRIPTION "Open Source Biometric Recognition and Evaluation")
set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
set(CPACK_PACKAGE_VERSION_MAJOR 0)
set(CPACK_PACKAGE_VERSION_MINOR 1)
set(CPACK_PACKAGE_VERSION_PATCH 0)
set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt")
set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
set(CMAKE_MODULE_PATH "${BR_SHARE_DIR}/cmake" ${CMAKE_MODULE_PATH})
set(PACKAGE_YEAR 2012)

# Define icons
if(WIN32)
  set(CPACK_PACKAGE_ICON "${BR_SHARE_DIR}\\\\openbr-small.png")
  set(NATIVE_ICON "${BR_SHARE_DIR}/openbr.ico")
elseif(APPLE)
  set(CPACK_PACKAGE_ICON "${BR_SHARE_DIR}/openbr-small.png")
  set(NATIVE_ICON "${BR_SHARE_DIR}/openbr.icns")
else()
  set(CPACK_PACKAGE_ICON "${BR_SHARE_DIR}/openbr-small.png")
  set(NATIVE_ICON "${BR_SHARE_DIR}/openbr.png")
endif()

# Add resource file for Windows builds
if(WIN32)
  configure_file(${BR_SHARE_DIR}/resources.rc.in resources.rc)
  set(BR_WINDOWS_RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/resources.rc)
endif()

# Add icon file for Apple builds
if(APPLE)
  set(BR_APPLE_RESOURCES ${NATIVE_ICON})
endif()

if(UNIX)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -fvisibility=hidden -fno-omit-frame-pointer")
endif()

if(CMAKE_COMPILER_IS_GNUXX)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weffc++")
endif()

if(MINGW)
  # Fixes a linker warning
  set(CMAKE_EXE_LINKER_FLAGS "-Wl,--enable-auto-import")
  set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--enable-auto-import")
endif()

if(MSVC)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /DNOMINMAX /D_CRT_SECURE_NO_WARNINGS /wd4018 /wd4244 /wd4267 /wd4305 /wd4308 /wd4307 /wd4554 /wd4996 /nologo")
endif()

if(${CMAKE_C_COMPILER} STREQUAL "/usr/bin/icc")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd279 -wd2196")
endif()

# Configure build
option(BR_EMBEDDED "Limit software dependencies")
if(${BR_EMBEDDED})
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBR_EMBEDDED")
  set(QT_DEPENDENCIES QtCore)
else()
  set(QT_DEPENDENCIES QtCore QtGui QtNetwork QtOpenGL QtSql QtXml)
endif()

option(BR_DISTRIBUTED "Target distributed memory models")
if(${BR_DISTRIBUTED})
  find_package(MPI REQUIRED)
  set(CMAKE_CXX_COMPILE_FLAGS ${CMAKE_CXX_COMPILE_FLAGS} ${MPI_COMPILE_FLAGS})
  set(CMAKE_CXX_LINK_FLAGS ${CMAKE_CXX_LINK_FLAGS} ${MPI_LINK_FLAGS})
  include_directories(MPI_INCLUDE_PATH)
  set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -DBR_DISTRIBUTED)
  set(BR_THIRDPARTY_LIBS ${BR_THIRDPARTY_LIBS} ${MPI_LIBRARY})
endif()

option(BR_EXCEPTIONS "Enable exception handling" ON)
if(${BR_EXCEPTIONS})
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBR_EXCEPTIONS")
endif()

# Find Qt
find_package(Qt4 COMPONENTS ${QT_DEPENDENCIES} REQUIRED)
set(QT_USE_QTMAIN TRUE)
include(${QT_USE_FILE})
add_definitions(${QT_DEFINITIONS})
set(BR_THIRDPARTY_LIBS ${BR_THIRDPARTY_LIBS} ${QT_LIBRARIES})

# Find OpenCV
find_package(OpenCV REQUIRED)
set(BR_THIRDPARTY_LIBS ${BR_THIRDPARTY_LIBS} ${OpenCV_LIBS})
set(OPENCV_DEPENDENCIES calib3d contrib core features2d flann gpu highgui imgproc legacy ml nonfree objdetect photo stitching ts video videostab)

# Enable Testing
include(CppcheckTargets)
include(CTest)
enable_testing()
if(BUILD_TESTING)
  set(BUILDNAME "${BUILDNAME}" CACHE STRING "Name of build on the dashboard")
  mark_as_advanced(BUILDNAME)
endif()

# Build the SDK
include_directories(sdk)
add_subdirectory(sdk)

# Build applications
add_subdirectory(app)

# Build SWIG wrappers
add_subdirectory(swig)

# Build the documentation?
option(BR_BUILD_DOCUMENTATION "Build Documentation (Requires doxygen and latex)")
if(${BR_BUILD_DOCUMENTATION})
  find_package(Doxygen REQUIRED)
  configure_file(${BR_SHARE_DIR}/Doxyfile.in Doxyfile)
  add_custom_target(doc ALL ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/share/openbr/MBGC_file_overview.pdf ${CMAKE_CURRENT_BINARY_DIR}/html/MBGC_file_overview.pdf COPYONLY)
  install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html DESTINATION .)

  option(BR_BUILD_DOCUMENTATION_PDF "Build PDF Documentation")
  if(${BR_BUILD_DOCUMENTATION_PDF})
    include(${BR_SHARE_DIR}/cmake/UseLATEX.cmake)
    add_custom_command(OUTPUT latex/refman.aux DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/latex/refman.tex COMMAND ${PDFLATEX_COMPILER} refman WORKING_DIRECTORY latex)
    add_custom_command(OUTPUT latex/refman.bbl DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/latex/refman.aux COMMAND ${BIBTEX_COMPILER} refman WORKING_DIRECTORY latex)
    add_custom_command(OUTPUT latex/refman.dvi DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/latex/refman.bbl COMMAND ${PDFLATEX_COMPILER} refman WORKING_DIRECTORY latex)
    add_custom_command(OUTPUT latex/refman.log DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/latex/refman.bbl latex/refman.dvi COMMAND ${PDFLATEX_COMPILER} refman WORKING_DIRECTORY latex)
    add_custom_target(doc_pdf ALL echo DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/latex/refman.log doc) # Trigger latex build process
    install(FILES ${CMAKE_BINARY_DIR}/latex/refman.pdf DESTINATION .)
  endif()
endif()

# Install
install(FILES LICENSE.txt README.md DESTINATION .)
install(DIRECTORY share DESTINATION .)
install(DIRECTORY ${BR_THIRDPARTY_SHARE} DESTINATION share)
include(InstallDependencies)
install_compiler_libraries()
install_qt_libraries(QT_DEPENDENCIES)
install_qt_imageformats()
install_opencv_libraries(OPENCV_DEPENDENCIES)

# Package
set(BR_PUBLISH_DIR ${CMAKE_BINARY_DIR} CACHE PATH "Where to publish packages")
set(CPACK_OUTPUT_FILE_PREFIX ${BR_PUBLISH_DIR})
set(CPACK_BINARY_BUNDLE       OFF)
set(CPACK_BINARY_DEB          OFF)
set(CPACK_BINARY_DRAGNDROP    OFF)
set(CPACK_BINARY_NSIS         OFF)
set(CPACK_BINARY_OSXX11       OFF)
set(CPACK_BINARY_PACKAGEMAKER OFF)
set(CPACK_BINARY_RPM          OFF)
set(CPACK_BINARY_STGZ         OFF)
set(CPACK_BINARY_TBZ2         OFF)
set(CPACK_BINARY_TGZ          OFF)
set(CPACK_BINARY_TZ           OFF)
set(CPACK_BINARY_ZIP          OFF)
set(CPACK_SOURCE_TGZ          OFF)
set(CPACK_SOURCE_TZ           OFF)
set(CPACK_SOURCE_ZIP          OFF)

if(CMAKE_HOST_WIN32)
  set(CPACK_BINARY_ZIP ON)
  set(CPACK_BINARY_NSIS ON)

  # NSIS
  set(CPACK_NSIS_MODIFY_PATH ON)
  set(CPACK_NSIS_MUI_ICON ${NATIVE_ICON})
  set(CPACK_NSIS_MUI_UNIICON ${NATIVE_ICON})
  set(CPACK_NSIS_MENU_LINKS "doc/html/index.html" "Documentation")
  if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
    set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
  endif()
elseif(CMAKE_HOST_APPLE)
  set(CPACK_BINARY_TGZ ON)
  set(CPACK_BINARY_BUNDLE ON)

  configure_file("${CMAKE_CURRENT_SOURCE_DIR}/README.md" "README.txt" COPYONLY)
  set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_BINARY_DIR}/README.txt")

  set(CPACK_BUNDLE_NAME ${CPACK_PACKAGE_NAME})
  set(CPACK_BUNDLE_ICON ${NATIVE_ICON})
  set(CPACK_BUNDLE_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist)
  set(CPACK_BUNDLE_STARTUP_COMMAND ${BR_SHARE_DIR}/bundle.sh)
  configure_file(${BR_SHARE_DIR}/Info.plist.in Info.plist)
else()
  set(CPACK_BINARY_TBZ2 ON)
  set(CPACK_BINARY_DEB ON)

  # DEB
  set(CPACK_DEBIAN_PACKAGE_MAINTAINER "jklontz@ieee.org")
endif()

include(CPack)