# Project setup. # cmake_minimum_required(VERSION 3.6) project(Manticore VERSION 1.5 LANGUAGES CXX) # # Convenience values. set(bin ${CMAKE_BINARY_DIR}) set(src ${CMAKE_SOURCE_DIR}) set(os ${CMAKE_HOST_SYSTEM}) set(el7 ^Linux-3\.10\.0-) # Compiler setup. # # To aid code portability, disable GNU extensions by default. option(CMAKE_CXX_EXTENSIONS "Enable compiler-specific extensions" OFF) message(STATUS "Compiler-specific extensions are ${CMAKE_CXX_EXTENSIONS}") # # STL runtime ABI. Only relevant for EL7 compilation with alternate compilers # (in which case OFF is normally the correct setting). if (${os} MATCHES ${el7}) option(cxx11_abi "Whether to use C++11 ABI for EL7 STL" OFF) if (${cxx11_abi}) set (cxx11_abi 1) message(STATUS "EL7 C++11 ABI is ON") else() set (cxx11_abi 0) message(STATUS "EL7 C++11 ABI is OFF") endif() endif() # # For alternate compilers CMake borks CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES. get_filename_component(cxx_bin "${CMAKE_CXX_COMPILER}" DIRECTORY) if (NOT "${cxx_bin}" EQUAL /usr/bin) unset(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH ON) endif() # Library dependencies. set(CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX}) set(l ${CMAKE_SHARED_LIBRARY_PREFIX}) set(so ${CMAKE_SHARED_LIBRARY_SUFFIX}) set(a ${CMAKE_STATIC_LIBRARY_SUFFIX}) message(STATUS "OS is ${os}") message(STATUS "Install prefix is '${CMAKE_INSTALL_PREFIX}'") # find_package(GSL REQUIRED) set(lgsl ${GSL_LIBRARIES}) # find_path(ceres ceres/ceres.h) if (${ceres} STREQUAL ceres-NOTFOUND) message(FATAL_ERROR "Failed to find Ceres.") endif() message(STATUS "Found Ceres: ${ceres}") get_filename_component(ceres_root ${ceres} DIRECTORY) find_library(lceres ${l}ceres${a} ${l}ceres${so} HINTS ${ceres_root}) find_library(lglog ${l}glog${a} ${l}glog${so} HINTS ${ceres_root}) find_library(lgflags ${l}gflags${a} ${l}gflags${so} HINTS ${ceres_root}) find_package(LAPACK REQUIRED) set(lapack ${LAPACK_LIBRARIES}) # find_path(eigen3 Eigen/Eigen PATH_SUFFIXES eigen3) if (${eigen3} STREQUAL eigen3-NOTFOUND) message(FATAL_ERROR "Failed to find Eigen3.") endif() message(STATUS "Found Eigen3: ${eigen3}") # find_path(ccfits CCfits/CCfits.h) if (${ccfits} STREQUAL ccfits-NOTFOUND) message(FATAL_ERROR "Failed to find CCfits.") endif() message(STATUS "Found CCfits: ${ccfits}") get_filename_component(ccfits_root ${ccfits} DIRECTORY) find_library(lccfits ${l}CCfits${a} ${l}CCfits${so} HINTS ${ccfits_root}) find_library(lcfitsio ${l}cfitsio${a} ${l}cfitsio${so} HINTS ${ccfits_root}) # include_directories(${src} ${ccfits} ${eigen3} ${ceres} ${GSL_INCLUDE_DIRS}) # Configure variables. # # Extra linker flags. message(STATUS "Using ldextra='${ldextra}'") # # cppreference location (for doxygen documentation). set(cpp_tag cppreference-doxygen-local.tag.xml) find_path(cpp_path ${cpp_tag} PATHS "${cppref}" NO_DEFAULT_PATH) if (NOT ${cpp_path} MATCHES NOTFOUND) set(cppref_tag ${cpp_path}/${cpp_tag}=${cpp_path}/reference/en/) else() unset(cppref) endif() message(STATUS "Using cppref='${cppref}'") # # MathJax location (for doxygen documentation). find_path(mj_path MathJax.js PATHS "${mathjax}" NO_DEFAULT_PATH) if (NOT DEFINED mathjax OR ${mj_path} MATCHES NOTFOUND) set (mathjax https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/) endif() message(STATUS "Using mathjax='${mathjax}'") # # Installed program name. if (NOT DEFINED program) set(program manticore) endif() message(STATUS "Using program='${program}'") message(STATUS "Using reldate='${reldate}'") # # Official version information. if (NOT DEFINED version) set(version ${PROJECT_VERSION}dev) endif() message(STATUS "Using version='${version}'") # # Configured file output. configure_file(Doxyfile.in ${src}/Doxyfile @ONLY) configure_file(Makefile.in ${src}/Makefile @ONLY) configure_file(version.h.in ${src}/version.h @ONLY) add_custom_target(confclean WORKING_DIRECTORY ${src} COMMAND rm -f Doxyfile Makefile version.h ) # Build targets. # # Library target. set(lib_files Detector.cc Dust.cc Graybody.cc PACS.cc SPIRE.cc process.cc solve.cc mutils/CommandLine.cc mutils/kgauss.cc mutils/statics.cc ) add_library(libmant STATIC ${lib_files}) target_compile_features(libmant PUBLIC cxx_decltype cxx_lambdas) set_property(TARGET libmant PROPERTY OUTPUT_NAME manticore) target_link_libraries(libmant ${ldextra} ${lccfits} ${lcfitsio} ${lceres} ${lglog} ${lgflags} ${lgsl} ${lapack} curl pthread m ) # # Executable targets. add_executable(mant manticore.cc) target_link_libraries(mant libmant) set_property(TARGET mant PROPERTY OUTPUT_NAME ${program}) # add_executable(pacsResponse pacsResponse.cc) target_link_libraries(pacsResponse libmant) # # Set EL7 STL ABI. if (${os} MATCHES ${el7}) set_property(TARGET libmant mant pacsResponse PROPERTY COMPILE_DEFINITIONS _GLIBCXX_USE_CXX11_ABI=${cxx11_abi} ) endif() # # Documentation target. add_custom_target(docs WORKING_DIRECTORY ${src} COMMENT "Generating HTML documentation..." COMMAND doxygen >${bin}/doxygen.log ) # # Install target. install(TARGETS mant DESTINATION bin)