https://github.com/ElsevierSoftwareX/SOFTX_2019_219
Revision 99932db9e71d31a76425d68eef7d5859523ca0e4 authored by Konrad Werys on 04 November 2019, 09:33:32 UTC, committed by Konrad Werys on 04 November 2019, 09:33:32 UTC
1 parent c5202ea
Raw File
Tip revision: 99932db9e71d31a76425d68eef7d5859523ca0e4 authored by Konrad Werys on 04 November 2019, 09:33:32 UTC
doc: changes in the documentation
Tip revision: 99932db
CMakeLists.txt
##############
### Tomato ###
##############
# you can build tomato with command:
# cmake .
#       -DCMAKE_BUILD_TYPE=RELEASE
#       -DCMAKE_INSTALL_PREFIX="install"
# additionally for osx:
#       -DCMAKE_MACOSX_RPATH=1
# additionally for windows:
#       -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON
# see .travis.yml and appveyor.yml for examples
#
# Konrad Werys

cmake_minimum_required (VERSION 2.8)

project (Tomato)

# The version number
set (Tomato_VERSION_MAJOR 0)
set (Tomato_VERSION_MINOR 5)

# Compiler flags
set (CMAKE_CXX_STANDARD_REQUIRED ON)
set (CMAKE_CXX_STANDARD 98 CACHE STRING "")
if (CMAKE_CXX_STANDARD EQUAL 98)
    set (CXX_STANDARD_98 ON) # flag used in the code
endif()

# RPATH preparation for the executables
set(CMAKE_INSTALL_RPATH
        @executable_path
        @executable_path/lib
        @executable_path/../lib
        @loader_path
        @loader_path/lib
        @loader_path/../lib
        $ORIGIN
        $ORIGIN/lib
        $ORIGIN/../lib/)

#############################
### DOWNLOAD DEPENDENCIES ###
#############################

# scripts to download pre-compiled dependencis, running only if DOWNLOAD_DEPENDENCIES is ON
set(DOWNLOAD_DEPENDENCIES ON CACHE BOOL "Do you want to download the dependencies?")
include(cmake/downloadItk.cmake)
include(cmake/downloadLmfit.cmake)

##################
### list files ###
##################

# list of source files TODO: do not use glob, as it is not recommended https://cmake.org/cmake/help/latest/command/file.html#filesystem
file (GLOB_RECURSE APP_FILES app/*.c* app/*.h* app/*.t*)
file (GLOB_RECURSE LIB_FILES lib/*.c* lib/*.h* lib/*.t*)
file (GLOB_RECURSE API_FILES lib/*.h lib/KWUtil.hxx)

###############
### PRIVATE ###
###############

# unfortunatelly I cannot publish numerical recipes code according to numerical recipes licence
set(PRIVATE_NR2_DIR ../tomato_private CACHE PATH "")
set(USE_PRIVATE_NR2 OFF CACHE BOOL "")
if (USE_PRIVATE_NR2)
    add_subdirectory(${PRIVATE_NR2_DIR} ${CMAKE_BINARY_DIR}/private)
    include_directories(${PRIVATE_NR2_DIR}/lib)
endif()

############
### YAML ###
############

set(USE_YAML ON CACHE BOOL "Do you want to use yaml?")
include(cmake/libyaml.cmake)

###############
### Fitting ###
###############

# lmfit currently not on windows
set(USE_LMFIT ON CACHE BOOL "Do you want to use LMFIT?")
include(cmake/lmfit.cmake)

###########
### ITK ###
###########

set(USE_ITK ON CACHE BOOL "Do you want to use ITK?")

if(USE_ITK)
    set(USE_ITK OFF)
    set(USE_VNL OFF)
    find_package(ITK HINTS ${ITK_DIR_HINTS})
    MESSAGE("ITK version:" ${ITK_VERSION})
    if (ITK_FOUND)
        set(USE_ITK ON)
        set(USE_VNL ON)
        include(${ITK_USE_FILE})
        set(TOMATO_LIBS_TO_LINK ${TOMATO_LIBS_TO_LINK} ${ITK_LIBRARIES})
    endif()
else()
    set(USE_VNL OFF)
endif(USE_ITK)

####################
### MAIN PROGRAM ###
####################

set(Tomato_BUILD_TESTING ON CACHE BOOL "Do you want to build Tomato tests?")

set(BUILD_APP OFF)
if(USE_ITK AND  USE_YAML)
    set(BUILD_APP ON)
endif()

MESSAGE("CXX_STANDARD_98:      " ${CXX_STANDARD_98})
MESSAGE("DOWNLOAD_DEPENDENCIES:" ${DOWNLOAD_DEPENDENCIES})
MESSAGE("USE_ITK:              " ${USE_ITK})
MESSAGE("USE_VNL:              " ${USE_VNL})
MESSAGE("USE_PRIVATE_NR2:      " ${USE_PRIVATE_NR2})
MESSAGE("USE_LMFIT:            " ${USE_LMFIT})
MESSAGE("USE_YAML:             " ${USE_YAML})
MESSAGE("BUILD_APP:            " ${BUILD_APP})
MESSAGE("Tomato_BUILD_TESTING: " ${Tomato_BUILD_TESTING})
MESSAGE("BUILD_SHARED_LIBS:    " ${BUILD_SHARED_LIBS})
MESSAGE("CMAKE_INSTALL_PREFIX: " ${CMAKE_INSTALL_PREFIX})

# configure a header file to pass some of the CMake settings to the source code
configure_file ("${PROJECT_SOURCE_DIR}/cmake/CmakeConfigForTomato.h.in" "${PROJECT_BINARY_DIR}/CmakeConfigForTomato.h")
set (LIB_FILES ${LIB_FILES} "${PROJECT_BINARY_DIR}/CmakeConfigForTomato.h")
set (API_FILES ${API_FILES} "${PROJECT_BINARY_DIR}/CmakeConfigForTomato.h")

#################
### TOMATOLIB ###
#################

# include
include_directories (lib)
include_directories ("${PROJECT_BINARY_DIR}") # for the configuration header

# target
add_library (TomatoLib SHARED ${LIB_FILES})

#link
target_link_libraries (TomatoLib ${TOMATO_LIBS_TO_LINK})
set(TOMATO_LIBS_TO_LINK ${TOMATO_LIBS_TO_LINK} TomatoLib)

# generating TomatoLib_export.h
include(GenerateExportHeader)
generate_export_header(TomatoLib)
set(API_FILES ${API_FILES} ${PROJECT_SOURCE_DIR}/cmake/tomatolib_export.h) # to make tomatolib_export.h available in installation step

#################
### TOMATOAPP ###
#################

if(BUILD_APP)

    # include
    include_directories (app)

    # target
    add_executable (TomatoExe ${APP_FILES} ${LIB_FILES})

    # link
    target_link_libraries (TomatoExe ${TOMATO_LIBS_TO_LINK})

endif()

##################
### Installing ###
##################

install (TARGETS TomatoLib
            RUNTIME DESTINATION bin
            LIBRARY DESTINATION lib
            ARCHIVE DESTINATION lib)
install (FILES ${API_FILES} DESTINATION include) # headers
if(BUILD_APP)
    install (TARGETS TomatoExe DESTINATION bin)
endif()

###############
### TESTING ###
###############

if(Tomato_BUILD_TESTING AND USE_YAML)
    add_subdirectory (tests)
    install(TARGETS TomatoLib DESTINATION tests)
endif()

##############################
#### DISPLAY ALL VARIABLES ###
##############################
#
##get_cmake_property (_variableNames VARIABLES)
##list (SORT _variableNames)
##foreach (_variableName ${_variableNames})
##    message (STATUS "${_variableName}=${${_variableName}}")
##endforeach()
back to top