Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/cmake/Modules/AddModules.cmake
3206 views
# 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()