IFEM/CMakeLists.txt
Arne Morten Kvarving 327a855d1b expreval: make all classes a template over a scalar
instance for double and autodiff::Variable<double>
2023-10-11 08:52:55 +02:00

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()