Skip to content
Snippets Groups Projects
Select Git revision
  • 354f514cb87d7898cfadb966922d799bd6123c9a
  • master default protected
  • beta
  • dev
  • andrewssobral-patch-1
  • update
  • thomas-fork
  • 2.0
  • v3.2.0
  • v3.1.0
  • v3.0
  • bgslib_py27_ocv3_win64
  • bgslib_java_2.0.0
  • bgslib_console_2.0.0
  • bgslib_matlab_win64_2.0.0
  • bgslib_qtgui_2.0.0
  • 2.0.0
  • bgs_console_2.0.0
  • bgs_matlab_win64_2.0.0
  • bgs_qtgui_2.0.0
  • v1.9.2_x86_mfc_gui
  • v1.9.2_x64_java_gui
  • v1.9.2_x86_java_gui
23 results

CMakeLists.txt

Blame
  • user avatar
    Andrews Sobral authored
    a1db2ab9
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    CMakeLists.txt 12.58 KiB
    cmake_minimum_required(VERSION 3.1)
    
    project(bgslibrary VERSION 3.1.0)
    
    include(CheckCXXCompilerFlag)
    
    set(CMAKE_CXX_STANDARD 14)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)
    set(CMAKE_POSITION_INDEPENDENT_CODE ON)
    
    function(append_if condition value)
      if (${condition})
        foreach(variable ${ARGN})
          set(${variable} "${${variable}} ${value}" PARENT_SCOPE)
        endforeach(variable)
      endif()
    endfunction()
    
    #if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR
    #    CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR
    #    CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
    #  check_cxx_compiler_flag("-fvisibility-inlines-hidden" SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG)
    #  append_if(SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG "-fvisibility=hidden -fvisibility-inlines-hidden" CMAKE_CXX_FLAGS)
    #endif()
    
    if(UNIX)
      #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x")
      set(CMAKE_MACOSX_RPATH 1)
    endif(UNIX)
    
    # Avoid cmake warnings about changes in behavior of some Mac OS X path
    # variable we don't care about.
    if (POLICY CMP0042)
      cmake_policy(SET CMP0042 NEW)
    endif()
    
    #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
    #set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules)
    
    # compilation mode setup
    set(CMAKE_BUILD_TYPE Release)
    #set(CMAKE_BUILD_TYPE Debug)
    
    if(WIN32)
      set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
      set(BUILD_SHARED_LIBS TRUE)
      #if(BGS_PYTHON_SUPPORT)
        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
        set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
      #else()
      #  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
      #  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
      #endif()
    endif(WIN32)
    
    set(bgs_out_dir ".")
    # First for the generic no-config case (e.g. with mingw)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${bgs_out_dir})
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${bgs_out_dir})
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${bgs_out_dir})
    # Second, for multi-config builds (e.g. msvc)
    foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
      string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
      set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${bgs_out_dir})
      set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${bgs_out_dir})
      set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${bgs_out_dir})
    endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES)
    
    if(UNIX)
      # add some standard warnings
      ADD_DEFINITIONS(-Wno-variadic-macros -Wno-long-long -Wall -Wextra -Winit-self -Woverloaded-virtual -Wsign-promo -Wno-unused-parameter -pedantic -Woverloaded-virtual -Wno-unknown-pragmas)
    
      # -ansi does not compile with sjn module
      #ADD_DEFINITIONS(-ansi)
    
      # if you like to have warinings about conversions, e.g. double->int or double->float etc., or float compare
      #ADD_DEFINITIONS(-Wconversion -Wfloat-equal)
    endif(UNIX)
    
    # cmake -D BGS_PYTHON_SUPPORT=ON ..
    if(NOT DEFINED BGS_PYTHON_SUPPORT)
      set(BGS_PYTHON_SUPPORT OFF)
    else()
      # add_definitions(-DBGS_PYTHON_SUPPORT)
    endif()
    # cmake -D BGS_PYTHON_ONLY=ON ..
    if(NOT DEFINED BGS_PYTHON_ONLY)
      set(BGS_PYTHON_ONLY OFF)
    else()
      # add_definitions(-DBGS_PYTHON_ONLY)
    endif()
    # cmake -D BGS_CORE_STATIC=ON ..
    if(NOT DEFINED BGS_CORE_STATIC)
      set(BGS_CORE_STATIC OFF)
    else()
      # add_definitions(-DBGS_CORE_STATIC)
    endif()
    message(STATUS "")
    message(STATUS "BGS_PYTHON_SUPPORT: ${BGS_PYTHON_SUPPORT}")
    message(STATUS "BGS_PYTHON_ONLY:    ${BGS_PYTHON_ONLY}")
    message(STATUS "BGS_CORE_STATIC:    ${BGS_CORE_STATIC}")
    
    # cmake -D BGS_PYTHON_SUPPORT=ON -D BGS_PYTHON_VERSION=3 ..
    if(NOT DEFINED BGS_PYTHON_VERSION)
      set(BGS_PYTHON_VERSION 3)
    endif()
    if(BGS_PYTHON_SUPPORT)
      message(STATUS "PYTHON VERSION: ${BGS_PYTHON_VERSION}")
    endif()
    
    if(BGS_CORE_STATIC)
      set(OpenCV_STATIC ON)
    else()
      set(OpenCV_STATIC OFF)
    endif()
    
    find_package(OpenCV REQUIRED)
    if(OpenCV_FOUND)
      message(STATUS "")
      message(STATUS "OpenCV library status:")
      message(STATUS "    version: ${OpenCV_VERSION}")
      message(STATUS "    libraries: ${OpenCV_LIBS}")
      message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}\n")
    endif()
    
    # if(${OpenCV_VERSION} VERSION_EQUAL 3 OR ${OpenCV_VERSION} VERSION_GREATER 3)
    #   message(FATAL_ERROR "OpenCV version is not compatible: ${OpenCV_VERSION}")
    # endif()
    
    if(${OpenCV_VERSION} VERSION_LESS 2.3.1)
      message(FATAL_ERROR "OpenCV version is not compatible: ${OpenCV_VERSION}")
    endif()
    
    if(BGS_PYTHON_SUPPORT)
      #if(WIN32)
      #  set(Boost_USE_STATIC_LIBS ON)
      #else()
      #  set(Boost_USE_STATIC_LIBS OFF)
      #endif()
    
      #set(Boost_USE_MULTITHREADED ON)
      #set(Boost_USE_STATIC_RUNTIME OFF)
    
      #message(STATUS "SEARCHING FOR BOOST COMPONENT FOR PYTHON ${BGS_PYTHON_VERSION}")
      #if(BGS_PYTHON_VERSION EQUAL 2)
      #  find_package(Boost REQUIRED COMPONENTS python)
      #else()
      #  find_package(Boost REQUIRED COMPONENTS python3)
      #endif()
    
      # Pybind11's cmake scripts enable link time optimization by default.  However,
      # it makes linking take a really long time and doesn't seem to substantively
      # improve runtime performance.  So we disable LTO here to make building bgslibrary
      # faster.
      set(PYBIND11_LTO_CXX_FLAGS "")
    
      #set(PYBIND11_PYTHON_VERSION 2.7 3.5 3.6)
      set(PYBIND11_PYTHON_VERSION ${BGS_PYTHON_VERSION})
      #find_package(pybind11 REQUIRED)
      add_subdirectory(modules/pybind11)
    
      #find_package(PythonInterp ${BGS_PYTHON_VERSION} REQUIRED)
      #find_package(PythonLibs ${BGS_PYTHON_VERSION} REQUIRED)
    
      #message(STATUS "Boost library status:")
      #message(STATUS "    version: ${Boost_VERSION}")
      #message(STATUS "    libraries: ${Boost_LIBRARIES}")
      #message(STATUS "    include path: ${Boost_INCLUDE_DIRS}")
    
      message(STATUS "")
      message(STATUS "Python library status:")
      message(STATUS "    executable: ${PYTHON_EXECUTABLE}")
      #message(STATUS "    version: ${PYTHON_VERSION_STRING}")
      #message(STATUS "    libraries: ${PYTHON_LIBRARIES}")
      message(STATUS "    library: ${PYTHON_LIBRARY}")
      message(STATUS "    include path: ${PYTHON_INCLUDE_DIRS}")
      if(NOT NUMPY_INCLUDE_DIR)
        # message(FATAL_ERROR "You must define NUMPY_INCLUDE_DIR by 'cmake -D NUMPY_INCLUDE_DIR=/python/lib/site-packages/numpy/core/include ..'")
        exec_program ("${PYTHON_EXECUTABLE}"
          ARGS "-c \"import numpy; print(numpy.get_include())\""
          OUTPUT_VARIABLE NUMPY_INCLUDE_DIR
          RETURN_VALUE NUMPY_NOT_FOUND)
      endif()
      message(STATUS "NUMPY_INCLUDE_DIR: ${NUMPY_INCLUDE_DIR}\n")
    endif()
    
    if(NOT BGS_PYTHON_ONLY)
      file(GLOB main_src src/*.cpp src/*.c)
      file(GLOB main_inc src/*.h src/*.hpp)
    endif()
    
    file(GLOB_RECURSE utils_src src/utils/*.cpp src/utils/*.c)
    file(GLOB_RECURSE utils_inc src/utils/*.h src/utils/*.hpp)
    
    file(GLOB_RECURSE tools_src src/tools/*.cpp src/tools/*.c)
    file(GLOB_RECURSE tools_inc src/tools/*.h src/tools/*.hpp)
    
    file(GLOB_RECURSE bgs_src src/algorithms/*.cpp src/algorithms/*.c)
    file(GLOB_RECURSE bgs_inc src/algorithms/*.h src/algorithms/*.hpp)
    
    include_directories(${CMAKE_CURRENT_SOURCE_DIR})
    include_directories(${OpenCV_INCLUDE_DIRS})
    
    if(BGS_PYTHON_SUPPORT)
      file(GLOB_RECURSE bgs_python_src wrapper/python/*.cpp)
      file(GLOB_RECURSE bgs_python_inc wrapper/python/*.h)
    
      include_directories(${CMAKE_CURRENT_SOURCE_DIR}/modules/pybind11/include)
      #include_directories(${Boost_INCLUDE_DIRS})
      include_directories(${PYTHON_INCLUDE_DIRS})
      include_directories(${NUMPY_INCLUDE_DIR})
    endif()
    
    # GMG is not available in older OpenCV versions
    if(${OpenCV_VERSION} VERSION_LESS 2.4.3)
      file(GLOB gmg src/algorithms/GMG.cpp)
      list(REMOVE_ITEM bgs_src ${gmg})
    endif()
    
    if(BGS_CORE_STATIC)
      message(STATUS "Bulding bgslibrary_core STATIC")
      add_library(bgslibrary_core STATIC ${bgs_src} ${tools_src} ${utils_src} ${bgs_inc} ${tools_inc} ${utils_inc})
      #set_property(TARGET bgslibrary_core PROPERTY POSITION_INDEPENDENT_CODE ON)
    else()
      message(STATUS "Bulding bgslibrary_core SHARED")
      add_library(bgslibrary_core SHARED ${bgs_src} ${tools_src} ${utils_src} ${bgs_inc} ${tools_inc} ${utils_inc})
      target_link_libraries(bgslibrary_core ${OpenCV_LIBS})
      # generates the export header bgslibrary_core_EXPORTS.h automatically
      include(GenerateExportHeader)
      GENERATE_EXPORT_HEADER(bgslibrary_core
          BASE_NAME bgslibrary_core
          EXPORT_MACRO_NAME bgslibrary_core_EXPORTS
          EXPORT_FILE_NAME bgslibrary_core_EXPORTS.h
          STATIC_DEFINE BGSLIBRARY_CORE_EXPORTS_BUILT_AS_STATIC)
      #set_property(TARGET bgslibrary_core PROPERTY PUBLIC_HEADER ${bgs_inc} ${tools_inc} ${utils_inc})
    endif()
    
    if(BGS_PYTHON_SUPPORT)
      #add_library(bgs_python SHARED ${bgs_src} ${tools_src})
      #pybind11_add_module(bgs_python ${bgs_src} ${tools_src})
      pybind11_add_module(bgs_python ${bgs_python_src} ${bgs_python_inc})
    
      target_link_libraries(bgs_python PRIVATE bgslibrary_core ${OpenCV_LIBS} ${PYTHON_LIBRARY} pybind11::module)
      #target_link_libraries(bgs_python ${OpenCV_LIBS} ${Boost_LIBRARIES} ${PYTHON_LIBRARY})
      #target_link_libraries(bgs_python ${OpenCV_LIBS} ${PYTHON_LIBRARY} pybind11::module)
      #target_link_libraries(bgs_python PRIVATE ${OpenCV_LIBS} ${PYTHON_LIBRARY} pybind11::embed)
    
      #set_target_properties(bgs_python PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}" SUFFIX "${PYTHON_MODULE_EXTENSION}")
      set_target_properties(bgs_python PROPERTIES SUFFIX "${PYTHON_MODULE_EXTENSION}")
    
      target_compile_definitions(bgs_python PRIVATE BGS_PYTHON_SUPPORT=1)
    
      # Set the output library name to bgslibrary because that's what setup.py and distutils expects.
      set_property(TARGET bgs_python PROPERTY OUTPUT_NAME "pybgs")
      #set_property(TARGET bgs_python PROPERTY POSITION_INDEPENDENT_CODE ON)
    endif()
    
    #if(WIN32)
    #  # set_property(TARGET bgslibrary_core PROPERTY SUFFIX ".lib")
    #  #if(BGS_PYTHON_SUPPORT)
    #  #  set_property(TARGET bgslibrary_core PROPERTY SUFFIX ".pyd")
    #  #endif()
    #else()
    #  set_property(TARGET bgslibrary_core PROPERTY OUTPUT_NAME "bgs")
    #endif()
    
    #if(APPLE)
    #  if(BGS_PYTHON_SUPPORT)
    #    set_property(TARGET bgslibrary_core PROPERTY SUFFIX ".so")
    #    set_target_properties(bgslibrary_core PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
    #  endif()
    #endif()
    
    if(NOT BGS_PYTHON_ONLY)
      add_executable(bgslibrary ${main_src} ${main_inc})
      target_link_libraries(bgslibrary ${OpenCV_LIBS} bgslibrary_core)
      # set_target_properties(bgslibrary PROPERTIES OUTPUT_NAME bgs)
    endif()
    
    if(UNIX AND BGS_PYTHON_SUPPORT)
      execute_process(
        COMMAND "${PYTHON_EXECUTABLE}" -c "if True:
          from distutils import sysconfig as sc
          print(sc.get_python_lib(prefix='', plat_specific=True))"
        OUTPUT_VARIABLE PYTHON_SITE
        OUTPUT_STRIP_TRAILING_WHITESPACE
      )
    
      message(STATUS "")
      message(STATUS "The bgslibrary python package will be installed at: ${PYTHON_SITE}\n")
    
      install(TARGETS bgs_python DESTINATION ${PYTHON_SITE})
      #install(FILES ${mypackage_python_files} DESTINATION ${PYTHON_SITE}/mypackage)
      #install(TARGETS bgs_python DESTINATION ${CMAKE_CURRENT_SOURCE_DIR})
    endif()
    
    if(NOT BGS_PYTHON_ONLY)
      include(GNUInstallDirs)
      set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/BGSLibrary)
      target_include_directories(bgslibrary_core
        PUBLIC
            $<INSTALL_INTERFACE:include>)
    
    
      install(TARGETS bgslibrary_core
        bgslibrary
        EXPORT bgslibrary_core-targets
        RUNTIME DESTINATION bin COMPONENT app
        LIBRARY DESTINATION lib COMPONENT runtime
        ARCHIVE DESTINATION lib COMPONENT runtime
        #PUBLIC_HEADER DESTINATION include/bgslibrary COMPONENT dev
        FRAMEWORK DESTINATION "/Library/Frameworks"
      )
      set_target_properties(bgslibrary_core PROPERTIES EXPORT_NAME BGSLibrary)
    
      install(DIRECTORY src/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
      install(EXPORT bgslibrary_core-targets
        FILE
          BGSLibraryTargets.cmake
        NAMESPACE
          BGSLibrary::
        DESTINATION
          ${INSTALL_CONFIGDIR}
      )
    
      include(CMakePackageConfigHelpers)
      write_basic_package_version_file(
        ${CMAKE_CURRENT_BINARY_DIR}/BGSLibraryConfigVersion.cmake
        VERSION ${PROJECT_VERSION}
        COMPATIBILITY AnyNewerVersion
      )
    
      configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake-modules/BGSLibraryConfig.cmake.in
        ${CMAKE_CURRENT_BINARY_DIR}/BGSLibraryConfig.cmake
        INSTALL_DESTINATION ${INSTALL_CONFIGDIR}
      )
    
      install(FILES
        ${CMAKE_CURRENT_LIST_DIR}/cmake-modules/FindOpenCV.cmake
        ${CMAKE_CURRENT_BINARY_DIR}/BGSLibraryConfig.cmake
        ${CMAKE_CURRENT_BINARY_DIR}/BGSLibraryConfigVersion.cmake
        DESTINATION ${INSTALL_CONFIGDIR}
      )
    
      if(UNIX)
        # to avoid: error while loading shared libraries: libbgslibrary_core.so
        message(STATUS "You might need to run:")
        message(STATUS "$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib")
        message(STATUS "$ export LD_LIBRARY_PATH")
        message(STATUS "after 'make install' to avoid error while loading libbgslibrary_core\n")
      endif()
    
      if(WIN32)
        message(STATUS "You might need to add ${CMAKE_CURRENT_BINARY_DIR} to your PATH to be able to run your applications.")
        message(STATUS "> set PATH=%PATH%;${CMAKE_CURRENT_BINARY_DIR}\n")
      endif()
    endif()