225 lines
8.3 KiB
CMake
225 lines
8.3 KiB
CMake
cmake_minimum_required(VERSION 3.5)
|
|
|
|
project(IFEM)
|
|
|
|
set(IFEM_VERSION_MAJOR 0)
|
|
set(IFEM_VERSION_MINOR 9)
|
|
set(IFEM_VERSION_PATCH 0)
|
|
set(IFEM_VERSION "${IFEM_VERSION_MAJOR}.${IFEM_VERSION_MINOR}.${IFEM_VERSION_PATCH}")
|
|
set(IFEM_ABI_VERSION ${IFEM_VERSION_MAJOR}.${IFEM_VERSION_MINOR})
|
|
|
|
# Generate header with version info
|
|
configure_file(${PROJECT_SOURCE_DIR}/src/IFEM.h.in
|
|
IFEM.h @ONLY)
|
|
|
|
# Required defines (well, PROFILE_LEVEL is not actually required, but...)
|
|
set(CMAKE_CXX_FLAGS "${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()
|
|
|
|
set(IFEM_LIBRARY_BUILD 1)
|
|
|
|
# Add local modules
|
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
|
|
${CMAKE_SOURCE_DIR}/cmake/Modules
|
|
${CMAKE_SOURCE_DIR}/cmake/Scripts)
|
|
|
|
include(cmake/Scripts/UseMultiArch.cmake)
|
|
|
|
if(NOT IFEM_AS_SUBMODULE)
|
|
if(NOT IFEM_PATH)
|
|
set(IFEM_PATH ${PROJECT_SOURCE_DIR})
|
|
endif()
|
|
find_package(IFEMDeps)
|
|
endif()
|
|
|
|
add_definitions(${IFEM_DEFINITIONS})
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${IFEM_BUILD_CXX_FLAGS}")
|
|
|
|
if(NOT IFEM_USE_SYSTEM_TINYXML)
|
|
message(STATUS "Using bundled tinyxml")
|
|
set(IFEM_INCLUDES ${IFEM_INCLUDES}
|
|
${PROJECT_SOURCE_DIR}/3rdparty/tinyxml)
|
|
file(GLOB_RECURSE TINYXML_SRCS ${PROJECT_SOURCE_DIR}/3rdparty/tinyxml/*.C)
|
|
endif()
|
|
|
|
if(LRSpline_LIBRARIES AND LRSpline_INCLUDE_DIRS)
|
|
set(IFEM_INCLUDES ${IFEM_INCLUDES}
|
|
${PROJECT_SOURCE_DIR}/src/ASM/LR)
|
|
endif()
|
|
|
|
# Required include directories
|
|
set(IFEM_INCLUDES
|
|
${IFEM_INCLUDES}
|
|
${IFEM_DEPINCLUDES}
|
|
${PROJECT_SOURCE_DIR}/src/ASM
|
|
${PROJECT_SOURCE_DIR}/src/Eig
|
|
${PROJECT_SOURCE_DIR}/src/LinAlg
|
|
${PROJECT_SOURCE_DIR}/src/SIM
|
|
${PROJECT_SOURCE_DIR}/src/Utility
|
|
${PROJECT_SOURCE_DIR}/3rdparty
|
|
${PROJECT_SOURCE_DIR}/3rdparty/expreval
|
|
${PROJECT_SOURCE_DIR}/3rdparty/autodiff
|
|
${PROJECT_BINARY_DIR}
|
|
)
|
|
|
|
include_directories(${IFEM_INCLUDES})
|
|
|
|
set(EXECUTABLE_OUTPUT_PATH bin)
|
|
set(LIBRARY_OUTPUT_PATH lib)
|
|
|
|
# Generate build flags in build tree
|
|
configure_file(${PROJECT_SOURCE_DIR}/cmake/Modules/IFEMFlags.cmake.in
|
|
IFEMFlags.cmake @ONLY)
|
|
|
|
# Make the IFEM library
|
|
file(GLOB IFEM_SRCS ${PROJECT_SOURCE_DIR}/src/IFEM.C
|
|
${PROJECT_SOURCE_DIR}/src/ASM/*.C
|
|
${PROJECT_SOURCE_DIR}/src/Eig/*.C
|
|
${PROJECT_SOURCE_DIR}/src/LinAlg/*.C
|
|
${PROJECT_SOURCE_DIR}/src/SIM/*.C
|
|
${PROJECT_SOURCE_DIR}/src/Utility/*.C
|
|
${PROJECT_SOURCE_DIR}/src/ASM/*.f
|
|
${PROJECT_SOURCE_DIR}/src/Eig/*.f
|
|
${PROJECT_SOURCE_DIR}/3rdparty/expreval/*.cpp)
|
|
string(REGEX REPLACE "${PROJECT_SOURCE_DIR}/src/ASM/ASMs.DInterpolate.C" "" IFEM_SRCS "${IFEM_SRCS}")
|
|
|
|
if(NOT PETSC_FOUND)
|
|
list(REMOVE_ITEM IFEM_SRCS
|
|
${PROJECT_SOURCE_DIR}/src/ASM/SAMpatchPETSc.C
|
|
${PROJECT_SOURCE_DIR}/src/LinAlg/PETScMatrix.C
|
|
${PROJECT_SOURCE_DIR}/src/LinAlg/PETScPCPerm.C
|
|
${PROJECT_SOURCE_DIR}/src/LinAlg/PETScPCProd.C
|
|
${PROJECT_SOURCE_DIR}/src/LinAlg/PETScPCScale.C
|
|
${PROJECT_SOURCE_DIR}/src/LinAlg/PETScSchurPC.C
|
|
${PROJECT_SOURCE_DIR}/src/LinAlg/PETScSolParams.C)
|
|
endif()
|
|
|
|
if(NOT ISTL_FOUND)
|
|
list(REMOVE_ITEM IFEM_SRCS
|
|
${PROJECT_SOURCE_DIR}/src/LinAlg/ISTLMatrix.C
|
|
${PROJECT_SOURCE_DIR}/src/LinAlg/ISTLSolParams.C)
|
|
endif()
|
|
|
|
if(LRSPLINE_FOUND OR LRSpline_FOUND)
|
|
file(GLOB LR_SRCS ${PROJECT_SOURCE_DIR}/src/ASM/LR/*.C)
|
|
list(APPEND IFEM_SRCS ${LR_SRCS})
|
|
endif()
|
|
list(APPEND CHECK_SOURCES ${IFEM_SRCS})
|
|
add_library(IFEM ${IFEM_SRCS} ${TINYXML_SRCS})
|
|
target_link_libraries(IFEM ${IFEM_DEPLIBS})
|
|
set_target_properties(IFEM PROPERTIES VERSION ${IFEM_VERSION}
|
|
SOVERSION ${IFEM_ABI_VERSION})
|
|
|
|
set(IFEM_PATH ${PROJECT_SOURCE_DIR})
|
|
if(NOT IFEM_SUBTREE_BUILD AND NOT IFEM_AS_SUBMODULE)
|
|
set(EXTRA_DOXY_PATHS ${PROJECT_SOURCE_DIR}/doc)
|
|
endif()
|
|
|
|
# Generate doxy in build tree
|
|
configure_file(${PROJECT_SOURCE_DIR}/doc/Doxyfile.in
|
|
Doxyfile @ONLY)
|
|
|
|
# For generating the doxy
|
|
add_custom_target(lib_doc doxygen ${PROJECT_BINARY_DIR}/Doxyfile
|
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
|
COMMENT "Generating API documentation" VERBATIM)
|
|
if(NOT TARGET doc AND NOT IFEM_AS_SUBMODULE)
|
|
add_custom_target(doc)
|
|
add_dependencies(doc lib_doc)
|
|
endif()
|
|
|
|
if(NOT IFEM_AS_SUBMODULE AND NOT IFEM_COMMON_APP_BUILD)
|
|
set(IFEM_INTREE_BUILD ON)
|
|
set(IFEM_LIBRARIES IFEM ${IFEM_DEPLIBS})
|
|
set(IFEM_PATH ${PROJECT_SOURCE_DIR})
|
|
endif()
|
|
|
|
enable_testing()
|
|
include(cmake/Scripts/IFEMTesting.cmake)
|
|
|
|
add_subdirectory(Apps/Common)
|
|
|
|
# Unit tests
|
|
if(IFEM_AS_SUBMODULE OR IFEM_COMMON_APP_BUILD)
|
|
set(TEST_APPS ${TEST_APPS} PARENT_SCOPE)
|
|
else()
|
|
add_check_target()
|
|
endif()
|
|
|
|
if(WIN32)
|
|
# TODO
|
|
else()
|
|
# lib
|
|
install(TARGETS IFEM DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT bin)
|
|
|
|
# headers
|
|
file(GLOB IFEM_HEADERS src/ASM/AlgEqSystem.h src/ASM/ASMbase.h
|
|
src/ASM/ASMenums.h src/ASM/ASMmxBase.h
|
|
src/ASM/ASMs?Dmx.h src/ASM/BasisFunction*.h
|
|
src/ASM/ASM*truct.h src/ASM/*Mats.h src/ASM/ElmNorm.h
|
|
src/ASM/Field.h src/ASM/Fields.h src/ASM/GlbForceVec.h
|
|
src/ASM/FiniteElement.h src/ASM/GlbNorm.h
|
|
src/ASM/GlbL2projector.h src/ASM/GlobalIntegral.h
|
|
src/ASM/IntegrandBase.h
|
|
src/ASM/ImmersedBoundaries.h src/ASM/Interface.h
|
|
src/ASM/Integrand.h src/ASM/Lagrange.h
|
|
src/ASM/LocalIntegral.h src/ASM/SAMpatch.h
|
|
src/ASM/SplineField?D.h src/ASM/SplineFields?D.h
|
|
src/ASM/TimeDomain.h src/ASM/ASMs?D.h src/ASM/ASM?D.h
|
|
src/ASM/ASMs?DLag.h
|
|
src/ASM/DomainDecomposition.h src/ASM/ItgPoint.h
|
|
src/ASM/ReactionsOnly.h
|
|
src/LinAlg/*.h src/SIM/*.h src/Utility/*.h
|
|
3rdparty/*.h
|
|
${CMAKE_BINARY_DIR}/IFEM.h)
|
|
if(NOT IFEM_USE_SYSTEM_TINYXML)
|
|
list(APPEND IFEM_HEADERS 3rdparty/tinyxml/tinyxml.h)
|
|
endif()
|
|
install(FILES ${IFEM_HEADERS}
|
|
DESTINATION include/IFEM COMPONENT ${IFEM_DEV_COMPONENT})
|
|
|
|
set(IFEM_INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/include/IFEM ${IFEM_DEPINCLUDES})
|
|
if(LRSpline_FOUND)
|
|
file(GLOB IFEM_LR_HEADERS src/ASM/LR/*.h)
|
|
install(FILES ${IFEM_LR_HEADERS} DESTINATION include/IFEM/LR)
|
|
list(APPEND IFEM_INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/include/IFEM/LR)
|
|
endif()
|
|
|
|
# cmake modules
|
|
string(REPLACE ";" " " IFEM_CXX_FLAGS ${IFEM_CXX_FLAGS})
|
|
string(REPLACE ";" " " IFEM_DEPLIBS "${IFEM_DEPLIBS}")
|
|
string(REPLACE ";" " " IFEM_DEFINITIONS "${IFEM_DEFINITIONS}")
|
|
configure_file(cmake/Templates/IFEMConfigVersion.cmake.in IFEMConfigVersion.cmake @ONLY)
|
|
configure_file(cmake/Templates/IFEMConfig.cmake.in IFEMConfig.cmake @ONLY)
|
|
install(FILES ${CMAKE_BINARY_DIR}/IFEMConfigVersion.cmake
|
|
${CMAKE_BINARY_DIR}/IFEMConfig.cmake
|
|
cmake/Modules/FindTestLib.cmake
|
|
cmake/Scripts/CheckCommits.cmake
|
|
cmake/Scripts/DownloadGTest.cmake
|
|
cmake/Scripts/UseMultiArch.cmake
|
|
cmake/Scripts/IFEMDoxy.cmake
|
|
cmake/Scripts/IFEMTesting.cmake DESTINATION lib/IFEM)
|
|
|
|
# source code
|
|
install(FILES src/IFEM-test.C DESTINATION lib/IFEM/src)
|
|
|
|
# documentation and license
|
|
if(IFEM_INSTALL_DOXY)
|
|
install(CODE "EXECUTE_PROCESS(COMMAND ${CMAKE_BUILD_TOOL} doc WORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\")" COMPONENT doc)
|
|
install(DIRECTORY ${PROJECT_BINARY_DIR}/doc/html DESTINATION ${CMAKE_INSTALL_DOCDIR}
|
|
COMPONENT doc
|
|
PATTERN *.md5 EXCLUDE
|
|
PATTERN *.map EXCLUDE)
|
|
install(FILES doc/petsc.pdf doc/sim-input.pdf doc/Tutorials/GettingStarted.pdf DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
|
endif()
|
|
endif()
|
|
|
|
if(IFEM_COMMON_APP_BUILD OR IFEM_AS_SUBMODULE)
|
|
set(UNIT_TEST_NUMBER ${UNIT_TEST_NUMBER} PARENT_SCOPE)
|
|
set(TEST_APPS ${TEST_APPS} PARENT_SCOPE)
|
|
set(CHECK_SOURCES ${CHECK_SOURCES} PARENT_SCOPE)
|
|
endif()
|