# Macros for compiling solver modules
#
# ADD_ELMER_MODULE(<name> [DIRECTORY <subdiretory>])
# Adds solver module <name> having sources in "<name>.F90".
# Optionally treat all .F90 files in <subdirectory> as sources.
#
#
# ADD_ELMER_MODULES([SKIP <name_1> <name_2> ... <skip_n>])
# Treats all directories and .F90 files from current directory as input
# for ADD_ELMER_MODULE. Skips those files and directories that equal
# to <skip_m> for some 0<m<n+1.
#
#
# MAKE_SKIP_LIST(INCLUDE name_1;name_2;...;name_n)
# Find all modules similarly as ADD_ELMER_MODULES and remove those modules from the list
# that match name_1, or name_2, or, ..., name_n.
#
# Populates a local variable called SKIP_LIST with the resulting list.
#
# Useful when combined with ADD_ELMER_MODULES(SKIP SKIP_LIST)
MACRO(ADD_ELMER_MODULE BASENAME)
CMAKE_PARSE_ARGUMENTS(_parsedArgs "" "" "SOURCES;DIRECTORY" "${ARGN}")
SET(_SOURCES "")
IF(_parsedArgs_DIRECTORY)
FILE(GLOB DIR_SRC_FILES "${_parsedArgs_DIRECTORY}/*.F90")
SET(_SOURCES ${DIR_SRC_FILES})
ELSEIF(_parsedArgs_SOURCES)
SET(_SOURCES ${_parsedArgs_SOURCES})
ELSE()
SET(_SOURCES ${BASENAME}.F90)
ENDIF()
#message(STATUS "adding library ${BASENAME} with sources ${_SOURCES}")
ADD_LIBRARY(${BASENAME} SHARED ${_SOURCES})
SET_TARGET_PROPERTIES(${BASENAME} PROPERTIES PREFIX "")
SET_TARGET_PROPERTIES(${BASENAME} PROPERTIES LINKER_LANGUAGE Fortran)
TARGET_LINK_LIBRARIES(${BASENAME} elmersolver)
ADD_DEPENDENCIES(${BASENAME} elmersolver)
INSTALL(TARGETS ${BASENAME}
LIBRARY DESTINATION "share/elmersolver/lib"
RUNTIME DESTINATION "share/elmersolver/lib")
#ARCHIVE DESTINATION "share/elmersolver/lib")
ENDMACRO()
MACRO(ADD_ELMER_MODULES)
set(num_modules 0)
CMAKE_PARSE_ARGUMENTS(_parsedArgs "" "" "SKIP" "${ARGN}")
# Find files
FILE(GLOB SRC_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*.F90")
FOREACH(FNAME ${SRC_FILES})
GET_FILENAME_COMPONENT(BASENAME ${FNAME} NAME_WE)
LIST(FIND _parsedArgs_SKIP ${BASENAME} FILE_INDEX)
IF(FILE_INDEX EQUAL -1)
IF(NOT BASENAME STREQUAL "")
ADD_ELMER_MODULE(${BASENAME})
ENDIF()
MATH(EXPR num_modules "${num_modules}+1")
ENDIF()
ENDFOREACH()
# Find subdirs
FILE(GLOB SRC_DIRS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*")
FOREACH(DIRNAME ${SRC_DIRS})
IF(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${DIRNAME}")
LIST(FIND _parsedArgs_SKIP ${DIRNAME} DIR_INDEX)
IF(DIR_INDEX EQUAL -1)
ADD_ELMER_MODULE(${DIRNAME} DIRECTORY ${DIRNAME})
MATH(EXPR num_modules "${num_modules}+1")
ENDIF()
ENDIF()
ENDFOREACH()
message(STATUS "Found ${num_modules} modules from ${CMAKE_CURRENT_SOURCE_DIR}")
ENDMACRO()
MACRO(MAKE_SKIP_LIST) # Provide list of modules to be included
CMAKE_PARSE_ARGUMENTS(_parsedArgs "" "" "INCLUDE" "${ARGN}")
FILE(GLOB SRC_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*.F90")
SET(SKIP_LIST "")
FOREACH(FNAME ${SRC_FILES})
GET_FILENAME_COMPONENT(BASENAME ${FNAME} NAME_WE)
IF(NOT ${BASENAME} IN_LIST _parsedArgs_INCLUDE)
LIST(APPEND SKIP_LIST ${BASENAME})
ELSE()
message(STATUS "Including ${BASENAME} module")
ENDIF()
ENDFOREACH()
FILE(GLOB SRC_DIRS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*")
FOREACH(DIRNAME ${SRC_DIRS})
IF(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${DIRNAME}")
LIST(FIND ARGN ${DIRNAME} DIR_INDEX)
IF(NOT ${DIRNAME} IN_LIST _parsedArgs_INCLUDE)
LIST(APPEND SKIP_LIST ${DIRNAME})
ELSE()
message(STATUS "Including ${DIRNAME} module")
ENDIF()
ENDIF()
ENDFOREACH()
ENDMACRO()