Skip to content
Snippets Groups Projects
CMakeLists.txt 9.70 KiB
#-------------------------------------------------------------------------------
# Author: Marco Biasini
#-------------------------------------------------------------------------------

cmake_minimum_required(VERSION 2.6.4 FATAL_ERROR)
project(OpenStructure CXX C)
set (CMAKE_EXPORT_COMPILE_COMMANDS 1)
set (OST_VERSION_MAJOR 1)
set (OST_VERSION_MINOR 9)
set (OST_VERSION_PATCH 0)
set (OST_VERSION_STRING ${OST_VERSION_MAJOR}.${OST_VERSION_MINOR}.${OST_VERSION_PATCH} )
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake_support)
include(OST)


if (CMAKE_COMPILER_IS_GNUCXX)  
  exec_program(gcc ARGS --version OUTPUT_VARIABLE CMAKE_C_COMPILER_VERSION)
  if(CMAKE_C_COMPILER_VERSION MATCHES ".*4\\.[5-9].*")
    set(OST_GCC_45 true)
  else()   
    set(OST_GCC_45 false)  
  endif()
endif()

option(USE_SHADER "whether to compile with shader support"
       OFF)
option(USE_RPATH "embed rpath upon make install"
       OFF)
option(COMPILE_TMTOOLS "whether to compile the tmalign and tmscore programs"
       OFF)
option(PROFILE "whether to compile with profiling support"
       OFF)       
option(ENABLE_GUI "whether the graphical user interface should be enabled"
       ON)
option(ENABLE_GFX "whether graphics support should be enabled"
      ON)
option(USE_MESA "use software rendered Mesa instead of hardware GL"
      OFF)
option(ENABLE_IMG "whether the image processing module should be compiled"
       ON)
option(ENABLE_INFO "whether openstructure should be compiled with support for the info library"
       ON)
option(USE_NUMPY "whether numpy support is added"
      OFF)
option(USE_DOUBLE_PRECISION "whether to compile in double precision" 
       OFF)
option(ENABLE_SPNAV "whether 3DConnexion devices should be supported"
      OFF)
option(STATIC_PROPERTY_WORKAROUND "workaround for static property bug with some boost/boost_python combinations" OFF)
option(COMPILE_TESTS "whether unit tests should be compiled by default" OFF)
option(ENABLE_STATIC "whether static libraries should be compiled" OFF)
option(UBUNTU_LAYOUT "whether Debian/Ubuntu's lib and libexec directory layout should be used" OFF)
option(HIDDEN_VISIBILITY "on gcc, use -fvisibility=hidden" OFF)
option(ENABLE_MM "whether openmm support is added" OFF)

if (CXX)
  set(CMAKE_CXX_COMPILER ${CXX})
endif()

if (CC)
  set(CMAKE_C_COMPILER ${CC})
endif()

if (FORTRAN_COMPILER)
  set(CMAKE_FORTRAN_COMPILER ${FORTRAN_COMPILER})
endif()



if (PREFIX)
  set(CMAKE_INSTALL_PREFIX ${PREFIX})
endif()

if (SYS_ROOT)
  set(CMAKE_PREFIX_PATH ${SYS_ROOT})
endif()

if (OPTIMIZE)
  set(CMAKE_BUILD_TYPE Release)
  set(_OPT ON)
else()
   set(CMAKE_BUILD_TYPE Debug)
    set(_OPT OFF)
endif()

if (USE_DOUBLE_PRECISION)
  set(_DOUBLE_PREC ON)
else()
  set(_DOUBLE_PREC OFF)
  set(_DOUBLE_PREC OFF)
endif()

if (NOT ENABLE_INFO)
  set(ENABLE_GFX OFF)
endif()

if (NOT ENABLE_GFX)
  set(ENABLE_GUI OFF)
endif()

if (ENABLE_INFO)
  set(_INFO ON)
else()
  set(_INFO OFF)
endif()

if (ENABLE_GUI)
  set(_UI ON)
else()
  set(_UI OFF)
endif()

if (ENABLE_GFX)
  set(_OPENGL ON)
else()
  set(_OPENGL OFF)
endif()

if (USE_SHADER)
  set(_SHADER ON)
else()
  set(_SHADER OFF)
endif()
if (USE_NUMPY)
  set(_NUMPY ON)
else()
  set(_NUMPY OFF)
endif()
if (COMPILE_TMTOOLS)
  set(_TM_TOOLS ON)
else()
  set(_TM_TOOLS OFF)
endif()
if (ENABLE_IMG)
  set(_IMG ON)
else()
  set(_IMG OFF)
endif()
if (PROFILE)
  set(_PROFILE ON)
else()
  set(_PROFILE OFF)
endif()
if(ENABLE_MM)
  set(_OPENMM ON)
else()
  set(_OPENMM OFF)
endif()


if (UBUNTU_LAYOUT)
  set(_UBUNTU_LAYOUT ON)
else()
  set(_UBUNTU_LAYOUT OFF)
endif()

if (COMPOUND_LIB)
  set(_COMP_LIB "${COMPOUND_LIB}")
  if (NOT IS_ABSOLUTE "${COMPOUND_LIB}")
    set(COMPOUND_LIB "${CMAKE_CURRENT_BINARY_DIR}/${COMPOUND_LIB}")
  endif()
else()
  set(_COMP_LIB "NONE")
endif()

if (STATIC_PROPERTY_WORKAROUND)
  set(_STATICPROPS ON)
else()
  set(_STATICPROPS OFF)
endif()

if (NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Debug)
endif()

setup_stage()
file(MAKE_DIRECTORY ${STAGE_DIR}
     ${EXECUTABLE_OUTPUT_PATH}
     ${HEADER_STAGE_PATH}
     ${LIB_STAGE_PATH}
     ${LIBEXEC_STAGE_PATH})

setup_compiler_flags()

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY)

if (ENABLE_STATIC AND UNIX AND NOT APPLE)
  set (CMAKE_FIND_LIBRARY_SUFFIXES .a)
endif()

if(BOOST_VERSION)
  message(STATUS "forcing boost to version ${BOOST_VERSION}")
  set(_BOOST_MIN_VERSION ${BOOST_VERSION})
endif()
setup_boost()
if (WIN32)
   ADD_DEFINITIONS("-DBOOST_ALL_NO_LIB")
endif()

if (ENABLE_INFO)        
  find_package(Qt4 4.5.0 REQUIRED)
endif()

if (OPTIMIZE)
  if (CXX_FLAGS)
    set (CMAKE_CXX_FLAGS_RELEASE ${CXX_FLAGS})
  endif()
  if (C_FLAGS)
    set (CMAKE_C_FLAGS_RELEASE ${C_FLAGS})
  endif()
else()
  if (CXX_FLAGS)
    set(CMAKE_CXX_FLAGS_DEBUG ${CXX_FLAGS})
  endif()
  if (C_FLAGS)
    set(CMAKE_C_FLAGS_DEBUG ${C_FLAGS})
  endif()
endif()
if (ENABLE_GFX)
  if(USE_MESA)
    find_package(Mesa REQUIRED)
    set(_USE_MESA ON)
  else()
    find_package(OpenGL REQUIRED)
    set(_USE_MESA OFF)
  endif()
endif()

if (ENABLE_IMG OR ENABLE_GFX)
  find_package(PNG REQUIRED)
else()
  set (PNG_LIBRARY "")
endif()

find_package(Eigen 3.2.0 REQUIRED)
find_package(Python 2.4 REQUIRED)

if(USE_NUMPY)
  find_package(Numpy REQUIRED)
endif()

if(ENABLE_MM)
  find_package(OpenMM REQUIRED)
  set(_OPENMM_PLUGINS "${OPEN_MM_PLUGIN_DIR}")
else(ENABLE_MM)
  set(_OPENMM_PLUGINS "NONE")
endif(ENABLE_MM)

if (ENABLE_IMG)
  find_package(FFTW REQUIRED)
  find_package(TIFF REQUIRED)
endif()


if (ENABLE_STATIC)
  set(Boost_LIBRARIES)
  set(Boost_USE_STATIC_LIBS ON)
  find_package(Boost ${_BOOST_MIN_VERSION} 
               COMPONENTS filesystem system iostreams regex thread REQUIRED)
  find_package(ZLIB REQUIRED)
   
  if (UNIX AND NOT APPLE)
    set(STATIC_LIBRARIES ${Boost_LIBRARIES} ${FFTW_LIBRARIES} ${TIFF_LIBRARIES} 
        ${PNG_LIBRARY} ${ZLIB_LIBRARY})
  else ()
    set(STATIC_LIBRARIES ${Boost_LIBRARIES} ${FFTW_LIBRARIES} ${TIFF_LIBRARIES} 
        ${PNG_LIBRARY} ${ZLIB_LIBRARY})
  endif()
endif()

if (ENABLE_GUI)
  ost_find_python_module(sip)
  ost_find_python_module(PyQt4)
endif()

if (ENABLE_SPNAV)
  #find_package(SpNav REQUIRED)
  set(_SPNAV ON)
else()
  set(_SPNAV OFF)
endif()

if (CMAKE_COMPILER_IS_GNUCXX)
  # do not write back into cache, otherwise the compile command line gets expanded
  # with multiple -fno-strict-aliasing flags, triggering a complete rebuild whenever
  # cmake is run
  set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-strict-aliasing")
  if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_GREATER "4.6")
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-attributes")
  endif("${CMAKE_CXX_COMPILER_VERSION}" VERSION_GREATER "4.6")
  if(HIDDEN_VISIBILITY) 
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
    set (_HIDDEN_VIS ON)
  else(HIDDEN_VISIBILITY)
    set (_HIDDEN_VIS OFF)
  endif(HIDDEN_VISIBILITY)
endif()

# basic environment
include_directories(${Boost_INCLUDE_DIRS} 
                    ${FFTW_INCLUDE_DIRS} 
                    ${EIGEN3_INCLUDE_DIRS}
                    ${TIFF_INCLUDE_DIR}
                    ${PNG_INCLUDE_DIRS}
                    ${OPEN_MM_INCLUDE_DIRS}
                    )
if(USE_NUMPY)
include_directories(${PYTHON_NUMPY_INCLUDE_DIR})
endif()

if (UNIX)
  SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
  SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
  if(USE_RPATH)
    set(_USE_RPATH ON)
    SET(CMAKE_INSTALL_RPATH "$ORIGIN/../${LIB_DIR}")
    SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
  else()
    set(_USE_RPATH OFF)
   SET(CMAKE_INSTALL_RPATH "")
   SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
  endif() 
endif()

if (ENABLE_STATIC)
  SET(CMAKE_SKIP_BUILD_RPATH TRUE)
  SET(LINK_SEARCH_END_STATIC TRUE) 
endif()

add_subdirectory(modules)
add_subdirectory(scripts)
add_subdirectory(tools)
add_subdirectory(actions)
# deployment has to come last, to ensure that all install commands are run before deployment
# magic is done
add_subdirectory(deployment)

set(FILES_TO_BE_REMOVED ${PROJECT_BINARY_DIR}/stage tests)
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
                             "${FILES_TO_BE_REMOVED}")


#ost_match_boost_python_version(${PYTHON_LIBRARIES})

if (CMAKE_COMPILER_IS_GNUCXX)
   set(HIDDEN_VIS_MSG 
       "\n   Hidden object visibility  (-DHIDDEN_VISIBILITY) : ${_HIDDEN_VIS}")
endif()
message(STATUS 
        "OpenStructure will be built with the following options:\n"
        "   Install Prefix                        (-DPREFIX) : ${CMAKE_INSTALL_PREFIX}\n"
        "   RPath in install                   (-DUSE_RPATH) : ${_USE_RPATH}\n"
        "   Info support                     (-DENABLE_INFO) : ${_INFO}\n"
        "   Graphical interface               (-DENABLE_GUI) : ${_UI}\n"
        "   OpenGL support                    (-DENABLE_GFX) : ${_OPENGL}\n"
        "   OpenGL via Mesa                     (-DUSE_MESA) : ${_USE_MESA}\n"
        "   Image Processing support          (-DENABLE_IMG) : ${_IMG}\n"
        "   Shader support                    (-DUSE_SHADER) : ${_SHADER}\n"
        "   Numpy support                      (-DUSE_NUMPY) : ${_NUMPY}\n"
        "   SpaceNav Device support         (-DENABLE_SPNAV) : ${_SPNAV}\n"
        "   OpenMM support                     (-DENABLE_MM) : ${_OPENMM}\n"
        "   OpenMM plugins            (-DOPEN_MM_PLUGIN_DIR) : ${_OPENMM_PLUGINS}\n"
        "   Optimize                            (-DOPTIMIZE) : ${_OPT}\n"
        "   Profiling support                    (-DPROFILE) : ${_PROFILE}\n"
        "   Double Precision        (-DUSE_DOUBLE_PRECISION) : ${_DOUBLE_PREC}\n"
        "   Compound Lib                    (-DCOMPOUND_LIB) : ${_COMP_LIB}\n"
        "   TMAlign and TMScore          (-DCOMPILE_TMTOOLS) : ${_TM_TOOLS}\n"
        "   Static Libraries               (-DENABLE_STATIC) : ${ENABLE_STATIC}\n"
        "   Debian/Ubuntu directory layout (-DUBUNTU_LAYOUT) : ${_UBUNTU_LAYOUT}"
        ${HIDDEN_VIS_MSG})