PROJECT(IFEM) CMAKE_MINIMUM_REQUIRED(VERSION 2.6) # Required defines (well, PROFILE_LEVEL is not actually required, but...) SET(CMAKE_CXX_FLAGS "-Dreal=double -DepsZ=1.0e-12 -DPROFILE_LEVEL=3") SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DINDEX_CHECK=2") IF(VERBOSE_DEBUG GREATER 0) SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSP_DEBUG=${VERBOSE_DEBUG}") ENDIF(VERBOSE_DEBUG GREATER 0) ENABLE_LANGUAGE(Fortran) IF(CMAKE_Fortran_COMPILER MATCHES ifort) SET(LANGUAGE_LIBS -lifcore) ENDIF(CMAKE_Fortran_COMPILER MATCHES ifort) ENABLE_LANGUAGE(CXX) IF(CMAKE_CXX_COMPILER MATCHES icpc) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_MKL") ELSE(CMAKE_CXX_COMPILER MATCHES icpc) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_CBLAS") ENDIF(CMAKE_CXX_COMPILER MATCHES icpc) # Add local modules set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake/Modules) # Required packages FIND_PACKAGE(Boost REQUIRED) FIND_PACKAGE(GoTools REQUIRED) FIND_PACKAGE(GoTrivariate REQUIRED) FIND_PACKAGE(LAPACK REQUIRED) FIND_PACKAGE(ARPACK REQUIRED) # Optional packages IF(${ENABLE_PETSC}) FIND_PACKAGE(Petsc) ENDIF(${ENABLE_PETSC}) IF(NOT "${DISABLE_SUPERLU}") FIND_PACKAGE(SuperLU) ENDIF(NOT "${DISABLE_SUPERLU}") IF(${ENABLE_SAMG}) FIND_PACKAGE(SAMG) ENDIF(${ENABLE_SAMG}) FIND_PACKAGE(VTFWriter) # Required libraries SET(DEPLIBS ${GoTrivariate_LIBRARIES} ${GoTools_LIBRARIES} ${ARPACK_LIBRARIES} ${LAPACK_LIBRARIES} ${Boost_LIBRARIES} ${LANGUAGE_LIBS} ) # Required include directories SET(INCLUDES ${Boost_INCLUDE_DIRS} ${GoTools_INCLUDE_DIRS} ${GoTrivariate_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/src/ASM ${PROJECT_SOURCE_DIR}/src/Eig ${PROJECT_SOURCE_DIR}/src/Integrands ${PROJECT_SOURCE_DIR}/src/LinAlg ${PROJECT_SOURCE_DIR}/src/SIM ${PROJECT_SOURCE_DIR}/src/Utility ) IF(SuperLU_MT_LIBRARIES AND SuperLU_MT_INCLUDES AND "${ENABLE_SUPERLU_MT}") FIND_PACKAGE(Threads REQUIRED) SET(DEPLIBS ${DEPLIBS} ${SuperLU_MT_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) SET(INCLUDES ${INCLUDES} ${SuperLU_MT_INCLUDES}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAS_SUPERLU_MT") ELSEIF(SuperLU_LIBRARIES AND SuperLU_INCLUDES) SET(DEPLIBS ${DEPLIBS} ${SuperLU_LIBRARIES}) SET(INCLUDES ${INCLUDES} ${SuperLU_INCLUDES}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAS_SUPERLU") ENDIF(SuperLU_MT_LIBRARIES AND SuperLU_MT_INCLUDES AND "${ENABLE_SUPERLU_MT}") IF(PETSC_LIBRARIES AND PETSC_INCLUDE_DIR) SET(INCLUDES ${INCLUDES} ${PETSC_INCLUDE_DIR} ${PETSCCONF_INCLUDE_DIR}) SET(DEPLIBS ${DEPLIBS} ${PETSC_LIBRARIES}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAS_PETSC") IF(${ENABLE_PARALLEL_PETSC}) FIND_PACKAGE(MPI REQUIRED) SET(INCLUDES ${INCLUDES} ${MPI_INCLUDE_PATH}) SET(DEPLIBS ${DEPLIBS} ${MPI_LIBRARIES}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPARALLEL_PETSC") ENDIF(${ENABLE_PARALLEL_PETSC}) FIND_PACKAGE(SLEPc) IF(SLEPC_LIBRARIES AND SLEPC_INCLUDES) SET(INCLUDES ${INCLUDES} ${SLEPC_INCLUDES}) SET(DEPLIBS ${DEPLIBS} ${SLEPC_LIBRARIES}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAS_SLEPC") ENDIF(SLEPC_LIBRARIES AND SLEPC_INCLUDES) ENDIF(PETSC_LIBRARIES AND PETSC_INCLUDE_DIR) IF(SAMG_LIBRARIES AND SAMG_INCLUDES) SET(DEPLIBS ${DEPLIBS} ${SAMG_LIBRARIES}) SET(INCLUDES ${INCLUDES} ${SAMG_INCLUDES}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAS_SAMG -DSAMG_UNIX_LINUX=1 -DSAMG_LCASE_USCORE") ENDIF(SAMG_LIBRARIES AND SAMG_INCLUDES) IF(VTFWRITER_LIBRARIES AND VTFWRITER_INCLUDES) SET(DEPLIBS ${DEPLIBS} ${VTFWRITER_LIBRARIES}) SET(INCLUDES ${INCLUDES} ${VTFWRITER_INCLUDES}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAS_VTFAPI=1") ENDIF(VTFWRITER_LIBRARIES AND VTFWRITER_INCLUDES) INCLUDE_DIRECTORIES(${INCLUDES}) SET(EXECUTABLE_OUTPUT_PATH bin) SET(LIBRARY_OUTPUT_PATH lib) IF(NOT WIN32) # Emit position-independent code, suitable for dynamic linking SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") # Enable all warnings SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-parentheses") ENDIF(NOT WIN32) # Make the IFEM library FILE(GLOB_RECURSE IFEM_SRCS ${PROJECT_SOURCE_DIR}/src/*.[Cf]) ADD_LIBRARY(IFEM ${IFEM_SRCS}) # Make the Apps FILE(GLOB_RECURSE Poisson_SRCS ${PROJECT_SOURCE_DIR}/Apps/Poisson/*.C) ADD_EXECUTABLE(Poisson ${Poisson_SRCS}) TARGET_LINK_LIBRARIES(Poisson IFEM ${DEPLIBS}) FILE(GLOB_RECURSE LinEl_SRCS ${PROJECT_SOURCE_DIR}/Apps/LinearElasticity/main_LinEl3D.C ${PROJECT_SOURCE_DIR}/Apps/LinearElasticity/SIMLinEl*.C) ADD_EXECUTABLE(LinEl ${LinEl_SRCS}) TARGET_LINK_LIBRARIES(LinEl IFEM ${DEPLIBS}) IF(NOT IFEM_INSTALL_PREFIX) SET(IFEM_INSTALL_PREFIX $ENV{HOME}) ENDIF(NOT IFEM_INSTALL_PREFIX) # 'install' target IF(WIN32) # TODO ELSE(WIN32) # lib INSTALL(TARGETS IFEM DESTINATION ${IFEM_INSTALL_PREFIX}/lib) # headers FILE(GLOB_RECURSE IFEM_HEADERS src/ASM/*.h src/Integrands/*.h src/LinAlg/*.h src/SIM/*.h src/Utility/*.h) INSTALL(FILES ${IFEM_HEADERS} DESTINATION ${IFEM_INSTALL_PREFIX}/include/IFEM) FILE(GLOB_RECURSE LOCAL_CMAKE_MODULES cmake/Modules/*.cmake) # cmake modules INSTALL(FILES ${LOCAL_CMAKE_MODULES} DESTINATION ${IFEM_INSTALL_PREFIX}/cmake/Modules) ENDIF(WIN32)