# For each of the components

SET(MCA_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/mca)

FILE(GLOB MCA_COMPONENTS RELATIVE ${MCA_BASE_DIR} ${MCA_BASE_DIR}/*)

MESSAGE(STATUS "PARSEC Modular Component Architecture (MCA) discovery:")
SET(MCA_NB_STATIC_COMPONENTS 0)
FOREACH (COMPONENT ${MCA_COMPONENTS})
    IF( EXISTS "${MCA_BASE_DIR}/${COMPONENT}/${COMPONENT}.h" )
        MESSAGE(STATUS "-- Found Component `${COMPONENT}'")
        FILE(GLOB MODS RELATIVE ${MCA_BASE_DIR}/${COMPONENT} ${MCA_BASE_DIR}/${COMPONENT}/*)
        FOREACH (MODULE ${MODS})
            IF( EXISTS "${MCA_BASE_DIR}/${COMPONENT}/${MODULE}/.ignore" )
                MESSAGE(STATUS "---- Module `${COMPONENT}/${MODULE}` is ignored (due to .ignore)")
                CONTINUE()
            ENDIF( EXISTS "${MCA_BASE_DIR}/${COMPONENT}/${MODULE}/.ignore" )
            IF( EXISTS "${MCA_BASE_DIR}/${COMPONENT}/${MODULE}/ValidateModule.CMake" )
                include("${MCA_BASE_DIR}/${COMPONENT}/${MODULE}/ValidateModule.CMake")
            ELSE( "${MCA_BASE_DIR}/${COMPONENT}/${MODULE}/ValidateModule.CMake" )
                IF( EXISTS "${MCA_BASE_DIR}/${COMPONENT}/${MODULE}/${COMPONENT}_${MODULE}.h" )
                    SET(MCA_${COMPONENT}_${MODULE} ON)
                    FILE(GLOB MCA_${COMPONENT}_${MODULE}_SOURCES ${MCA_BASE_DIR}/${COMPONENT}/${MODULE}/[^\\.]*.c)
                    SET(MCA_${COMPONENT}_${MODULE}_CONSTRUCTOR "${COMPONENT}_${MODULE}_static_component")
                ENDIF( EXISTS "${MCA_BASE_DIR}/${COMPONENT}/${MODULE}/${COMPONENT}_${MODULE}.h" )
            ENDIF( EXISTS "${MCA_BASE_DIR}/${COMPONENT}/${MODULE}/ValidateModule.CMake" )
            IF( MCA_${COMPONENT}_${MODULE} )
                FOREACH(SRC ${MCA_${COMPONENT}_${MODULE}_SOURCES})
                    LIST(APPEND MCA_${COMPONENT}_EXTRASOURCES ${SRC})
                ENDFOREACH(SRC ${MCA_${COMPONENT}_${MODULE}_SOURCES})
                MESSAGE(STATUS "---- Module `${MODULE}' is ON")
                MATH(EXPR MCA_NB_STATIC_COMPONENTS "${MCA_NB_STATIC_COMPONENTS}+1")
                SET(MCA_STATIC_COMPONENTS_PROTOTYPES "${MCA_STATIC_COMPONENTS_PROTOTYPES}\nmca_base_component_t *${MCA_${COMPONENT}_${MODULE}_CONSTRUCTOR}(void);")
                SET(MCA_STATIC_COMPONENTS_ACCESSORS "${MCA_STATIC_COMPONENTS_ACCESSORS}\n    p = add_static_component(${MCA_${COMPONENT}_${MODULE}_CONSTRUCTOR}(), p);")
            ENDIF()
        ENDFOREACH(MODULE)
        SET(MCA_STATIC_COMPONENTS_ACCESSORS "${MCA_STATIC_COMPONENTS_ACCESSORS}  register_base_component(\"${COMPONENT}\");")

        # Give the component a chance to get involved in the configuration step and
        # define a list of files to be installed.
        IF( EXISTS "${MCA_BASE_DIR}/${COMPONENT}/CMakeLists.txt" )
            include("${MCA_BASE_DIR}/${COMPONENT}/CMakeLists.txt")
        ELSE( EXISTS "${MCA_BASE_DIR}/${COMPONENT}/CMakeLists.txt" )
            FILE(GLOB MCA_${COMPONENT}_SOURCES ${MCA_BASE_DIR}/${COMPONENT}/[^\\.]*.c)
        ENDIF( EXISTS "${MCA_BASE_DIR}/${COMPONENT}/CMakeLists.txt" )
        #MESSAGE(STATUS "Component ${COMPONENT} sources: ${MCA_${COMPONENT}_SOURCES}")

        FOREACH(SRC ${MCA_${COMPONENT}_SOURCES})
            LIST(APPEND MCA_EXTRA_SOURCES ${SRC}) # this will include sources in the component top-level dir
        ENDFOREACH(SRC ${MCA_${COMPONENT}_SOURCES})
        FOREACH(SRC ${MCA_${COMPONENT}_EXTRASOURCES})
            LIST(APPEND MCA_EXTRA_SOURCES ${SRC})
        ENDFOREACH(SRC MCA_${COMPONENT}_EXTRASOURCES)
    ENDIF( EXISTS "${MCA_BASE_DIR}/${COMPONENT}/${COMPONENT}.h" )
ENDFOREACH(COMPONENT)
MESSAGE(STATUS "PARSEC Modular Component Architecture (MCA) discovery done.")

CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/mca/mca_static_components.h.in ${CMAKE_CURRENT_BINARY_DIR}/mca/mca_static_components.h)
