199df1eadf
This commit was SVN r23959.
325 строки
14 KiB
CMake
325 строки
14 KiB
CMake
# Copyright (c) 2007-2010 High Performance Computing Center Stuttgart,
|
|
# University of Stuttgart. All rights reserved.
|
|
# $COPYRIGHT$
|
|
#
|
|
# Additional copyrights may follow
|
|
#
|
|
# $HEADER$
|
|
#
|
|
|
|
INCLUDE(list_subdirs)
|
|
|
|
# there are several steps and issues for checking mca components:
|
|
#
|
|
# 1. go through each framwork dir, add the top-level headers
|
|
# to the source list.
|
|
#
|
|
# 2. go through each component dir, the framwork base dir is checked
|
|
# also in this setp, and is added to the source list.
|
|
#
|
|
# 2a. if a .windows file exists in a framwork base dir, that means there
|
|
# might be properties that have to be checked for this dir, e.g. files
|
|
# need to be excluded.
|
|
#
|
|
# 2b. if a .windows file exists in a component dir, this component
|
|
# should be included in the solution. There could be properties that
|
|
# need to check for this component. If it's a static build or not a
|
|
# DSO shared build, just add necessary sources; if it is a DSO build,
|
|
# generate a proper CMakeLists.txt file for each component, so that
|
|
# this component will be compiled separately.
|
|
#
|
|
# 3. Generate static-components.h file with available mca components.
|
|
#
|
|
#
|
|
# Available properties in .windows files:
|
|
#
|
|
# exclude_list: files that need to be excluded from the solution.
|
|
#
|
|
# required_check: a CMake module has to be run to check the libraries/headers
|
|
# that needed by this component. The check might return two
|
|
# variables: RESULT_INCLUDE_PATH, RESULT_LINK_LIBRARIES and RESULT_SOURCE_FILES.
|
|
# RESULT_INCLUDE_PATH is handled in this macro, and RESULT_LINK_LIBRARIES
|
|
# is handled in upper layer.
|
|
#
|
|
# not_single_shared_lib: this component should not be built separately, it's not
|
|
# a single mca shared library.
|
|
#
|
|
# mca_link_libraries: this component has to be linked with other targets or libraries,
|
|
# e.g. Ws2_32.lib
|
|
|
|
|
|
SET(MCA_FRAMEWORK_LIST "")
|
|
CHECK_SUBDIRS("${PROJECT_SOURCE_DIR}/mca" MCA_FRAMEWORK_LIST)
|
|
#MESSAGE("MCA_FRAMEWORK_LIST:${MCA_FRAMEWORK_LIST}")
|
|
|
|
|
|
FILE(GLOB ${PROJECT_NAME}_MCA_HEADER_FILES "mca/*.C" "mca/*.h")
|
|
SET(${PROJECT_NAME}_MCA_FILES ${${PROJECT_NAME}_MCA_FILES} ${${PROJECT_NAME}_MCA_HEADER_FILES})
|
|
SOURCE_GROUP(mca FILES ${${PROJECT_NAME}_MCA_HEADER_FILES})
|
|
|
|
# clear the variables first
|
|
SET(MCA_FRAMEWORK "")
|
|
SET(MCA_FRAMEWORK_FILES "")
|
|
SET(MCA_FILES "")
|
|
|
|
# parse each mca subdir
|
|
FOREACH (MCA_FRAMEWORK ${MCA_FRAMEWORK_LIST})
|
|
|
|
IF(NOT ${MCA_FRAMEWORK} STREQUAL "CMakeFiles" AND NOT ${MCA_FRAMEWORK} STREQUAL "svn")
|
|
#SET(CURRENT_PATH "mca/${${PROJECT_NAME}_MCA_SUBDIR}")
|
|
FILE(GLOB MCA_FRAMEWORK_FILES "mca/${MCA_FRAMEWORK}/*.c" "mca/${MCA_FRAMEWORK}/*.h"
|
|
"mca/${MCA_FRAMEWORK}/*.cc" "mca/${MCA_FRAMEWORK}/*.cpp")
|
|
SET(MCA_FILES ${MCA_FILES} ${MCA_FRAMEWORK_FILES})
|
|
SOURCE_GROUP(mca\\${MCA_FRAMEWORK} FILES ${MCA_FRAMEWORK_FILES})
|
|
|
|
SET(COMPONENT_LIST "")
|
|
CHECK_SUBDIRS("${PROJECT_SOURCE_DIR}/mca/${MCA_FRAMEWORK}" COMPONENT_LIST)
|
|
|
|
SET(CURRENT_COMPONENT_PRIORITY 0)
|
|
SET(BEST_COMPONENT_PRIORITY 0)
|
|
|
|
# parse each component subdir of current mca framework
|
|
FOREACH (MCA_COMPONENT ${COMPONENT_LIST})
|
|
|
|
IF(${MCA_COMPONENT} STREQUAL "base")
|
|
|
|
SET(CURRENT_PATH "${PROJECT_SOURCE_DIR}/mca/${MCA_FRAMEWORK}/base")
|
|
FILE(GLOB MCA_FRAMEWORK_BASE_FILES "${CURRENT_PATH}/*.c" "${CURRENT_PATH}/*.h"
|
|
"${CURRENT_PATH}/*.cc" "${CURRENT_PATH}/*.cpp")
|
|
|
|
IF(EXISTS "${CURRENT_PATH}/.windows")
|
|
|
|
#MESSAGE("MCA_FRAMEWORK_BASE_FILES:${MCA_FRAMEWORK_BASE_FILES}")
|
|
SET(EXCLUDE_LIST "")
|
|
FILE(STRINGS ${CURRENT_PATH}/.windows EXCLUDE_LIST REGEX "^exclude_list=")
|
|
|
|
IF(NOT EXCLUDE_LIST STREQUAL "")
|
|
STRING(REPLACE "exclude_list=" "" EXCLUDE_LIST ${EXCLUDE_LIST})
|
|
ENDIF(NOT EXCLUDE_LIST STREQUAL "")
|
|
|
|
# remove the files in the exclude list
|
|
FOREACH(FILE ${EXCLUDE_LIST})
|
|
LIST(REMOVE_ITEM MCA_FRAMEWORK_BASE_FILES "${CURRENT_PATH}/${FILE}")
|
|
ENDFOREACH(FILE)
|
|
|
|
ENDIF(EXISTS "${CURRENT_PATH}/.windows")
|
|
|
|
SET_SOURCE_FILES_PROPERTIES(${PROJECT_BINARY_DIR}/mca/${MCA_FRAMEWORK}/base/static-components.h
|
|
PROPERTIES GENERATED true)
|
|
SET(MCA_FRAMEWORK_BASE_FILES ${MCA_FRAMEWORK_BASE_FILES}
|
|
${PROJECT_BINARY_DIR}/mca/${MCA_FRAMEWORK}/base/static-components.h)
|
|
SET(MCA_FILES ${MCA_FILES} ${MCA_FRAMEWORK_BASE_FILES})
|
|
|
|
SOURCE_GROUP(mca\\${MCA_FRAMEWORK}\\base FILES ${MCA_FRAMEWORK_BASE_FILES})
|
|
|
|
# Install help files if they are here.
|
|
INSTALL(DIRECTORY ${CURRENT_PATH}/ DESTINATION share/openmpi/
|
|
FILES_MATCHING PATTERN "*.txt"
|
|
PATTERN ".svn" EXCLUDE
|
|
PATTERN ".hg" EXCLUDE)
|
|
|
|
ELSEIF(EXISTS "${PROJECT_SOURCE_DIR}/mca/${MCA_FRAMEWORK}/${MCA_COMPONENT}/.windows")
|
|
|
|
SET(COMPONENT_FILES "")
|
|
SET(RESULT_SOURCE_FILES "")
|
|
SET(CURRENT_PATH ${PROJECT_SOURCE_DIR}/mca/${MCA_FRAMEWORK}/${MCA_COMPONENT})
|
|
|
|
# by default, build this component.
|
|
SET(BUILD_COMPONENT TRUE)
|
|
|
|
# do we have to run a check module first?
|
|
SET(REQUIRED_CHECK "")
|
|
FILE(STRINGS ${CURRENT_PATH}/.windows REQUIRED_CHECK REGEX "^required_check=")
|
|
|
|
SET(EXTRA_INCLUDE_PATH "")
|
|
IF(NOT REQUIRED_CHECK STREQUAL "")
|
|
STRING(REPLACE "required_check=" "" REQUIRED_CHECK ${REQUIRED_CHECK})
|
|
UNSET(RESULT_INCLUDE_PATH)
|
|
UNSET(RESULT_LINK_LIBRARIES)
|
|
INCLUDE(${REQUIRED_CHECK})
|
|
IF(RESULT)
|
|
SET(COMPONENT_FILES ${COMPONENT_FILES} ${RESULT_SOURCE_FILES})
|
|
SET(EXTRA_INCLUDE_PATH ${RESULT_INCLUDE_PATH})
|
|
# these extra libraries will be set up in up layer, e.g. ompi
|
|
SET(EXTRA_LINK_LIBRARIES ${EXTRA_LINK_LIBRARIES} ${RESULT_LINK_LIBRARIES})
|
|
ELSE(RESULT)
|
|
# Required check failed, don't build this component.
|
|
SET(BUILD_COMPONENT FALSE)
|
|
ENDIF(RESULT)
|
|
ENDIF(NOT REQUIRED_CHECK STREQUAL "")
|
|
|
|
IF(BUILD_COMPONENT)
|
|
|
|
IF(NOT COMPONENT_FILES)
|
|
FILE(GLOB_RECURSE COMPONENT_FILES "${CURRENT_PATH}/*.C" "${CURRENT_PATH}/*.h"
|
|
"${CURRENT_PATH}/*.cc" "${CURRENT_PATH}/*.cpp")
|
|
|
|
#check exclude list
|
|
SET(EXCLUDE_LIST "")
|
|
FILE(STRINGS ${CURRENT_PATH}/.windows EXCLUDE_LIST REGEX "^exclude_list=")
|
|
|
|
IF(NOT EXCLUDE_LIST STREQUAL "")
|
|
STRING(REPLACE "exclude_list=" "" EXCLUDE_LIST ${EXCLUDE_LIST})
|
|
ENDIF(NOT EXCLUDE_LIST STREQUAL "")
|
|
|
|
# remove the files in the exclude list
|
|
FOREACH(FILE ${EXCLUDE_LIST})
|
|
LIST(REMOVE_ITEM COMPONENT_FILES "${CURRENT_PATH}/${FILE}")
|
|
ENDFOREACH(FILE)
|
|
ENDIF(NOT COMPONENT_FILES)
|
|
|
|
# check the library build type
|
|
FILE(STRINGS ${CURRENT_PATH}/.windows
|
|
VALUE REGEX "^not_single_shared_lib=")
|
|
IF(NOT VALUE STREQUAL "")
|
|
STRING(REPLACE "not_single_shared_lib=" "" NOT_SINGLE_SHARED_LIB ${VALUE})
|
|
ENDIF(NOT VALUE STREQUAL "")
|
|
|
|
IF(NOT OPAL_WANT_LIBLTDL OR NOT_SINGLE_SHARED_LIB STREQUAL "1")
|
|
SET(NOT_SINGLE_SHARED_LIB "")
|
|
# add sources for static build or for the shared build when this is not a stand along library.
|
|
SET(MCA_FILES ${MCA_FILES} ${COMPONENT_FILES})
|
|
SOURCE_GROUP(mca\\${MCA_FRAMEWORK}\\${MCA_COMPONENT} FILES ${COMPONENT_FILES})
|
|
|
|
INCLUDE_DIRECTORIES(${EXTRA_INCLUDE_PATH})
|
|
|
|
IF(EXISTS "${CURRENT_PATH}/configure.params")
|
|
FILE(STRINGS "${CURRENT_PATH}/configure.params"
|
|
CURRENT_COMPONENT_PRIORITY REGEX "PRIORITY")
|
|
IF(NOT CURRENT_COMPONENT_PRIORITY STREQUAL "")
|
|
STRING(REGEX REPLACE "[A-Z_]+=" "" CURRENT_COMPONENT_PRIORITY ${CURRENT_COMPONENT_PRIORITY})
|
|
ENDIF(NOT CURRENT_COMPONENT_PRIORITY STREQUAL "")
|
|
ENDIF(EXISTS "${CURRENT_PATH}/configure.params")
|
|
|
|
IF(CURRENT_COMPONENT_PRIORITY GREATER BEST_COMPONENT_PRIORITY)
|
|
# I have a higher priority for this mca, put me at the very beginning.
|
|
SET (OUTFILE_EXTERN
|
|
"extern const mca_base_component_t mca_${MCA_FRAMEWORK}_${MCA_COMPONENT}_component"
|
|
"\n${OUTFILE_EXTERN}")
|
|
SET(FRAMEWORK_STRUCT_DEF
|
|
"&mca_${MCA_FRAMEWORK}_${MCA_COMPONENT}_component,\n"
|
|
${FRAMEWORK_STRUCT_DEF})
|
|
SET(BEST_COMPONENT_PRIORITY ${CURRENT_COMPONENT_PRIORITY})
|
|
ELSE(CURRENT_COMPONENT_PRIORITY GREATER BEST_COMPONENT_PRIORITY)
|
|
SET (OUTFILE_EXTERN ${OUTFILE_EXTERN}
|
|
"\nextern const mca_base_component_t mca_${MCA_FRAMEWORK}_${MCA_COMPONENT}_component;")
|
|
SET(FRAMEWORK_STRUCT_DEF ${FRAMEWORK_STRUCT_DEF}
|
|
"&mca_${MCA_FRAMEWORK}_${MCA_COMPONENT}_component,\n")
|
|
ENDIF(CURRENT_COMPONENT_PRIORITY GREATER BEST_COMPONENT_PRIORITY)
|
|
|
|
|
|
ELSE(NOT OPAL_WANT_LIBLTDL OR NOT_SINGLE_SHARED_LIB STREQUAL "1")
|
|
|
|
# get the libraries required for this component.
|
|
SET(MCA_LINK_LIBRARIES "")
|
|
FILE(STRINGS ${CURRENT_PATH}/.windows VALUE REGEX "^mca_link_libraries=")
|
|
IF(NOT VALUE STREQUAL "")
|
|
STRING(REPLACE "mca_link_libraries=" "" MCA_LINK_LIBRARIES ${VALUE})
|
|
ENDIF(NOT VALUE STREQUAL "")
|
|
|
|
# the mca_common_* libraries should be installed into bin,
|
|
# this will avoid the runtime open module failure.
|
|
IF("${MCA_FRAMEWORK}" STREQUAL "common")
|
|
SET(LIB_NAME_PREFIX "lib")
|
|
SET(INSTALL_DEST "RUNTIME DESTINATION bin
|
|
LIBRARY DESTINATION lib
|
|
ARCHIVE DESTINATION lib")
|
|
SET(PDB_DEST "bin")
|
|
ELSE("${MCA_FRAMEWORK}" STREQUAL "common")
|
|
SET(LIB_NAME_PREFIX "")
|
|
IF(OMPI_DEBUG_BUILD)
|
|
SET(INSTALL_DEST "RUNTIME DESTINATION lib/openmpi/debug
|
|
LIBRARY DESTINATION lib/openmpi/debug
|
|
ARCHIVE DESTINATION lib/openmpi/debug")
|
|
SET(PDB_DEST "lib/openmpi/debug")
|
|
ELSE(OMPI_DEBUG_BUILD)
|
|
SET(INSTALL_DEST "RUNTIME DESTINATION lib/openmpi
|
|
LIBRARY DESTINATION lib/openmpi
|
|
ARCHIVE DESTINATION lib/openmpi")
|
|
ENDIF(OMPI_DEBUG_BUILD)
|
|
ENDIF("${MCA_FRAMEWORK}" STREQUAL "common")
|
|
|
|
|
|
# generate CMakeLists.txt for each component for DSO build.
|
|
FILE (WRITE "${PROJECT_BINARY_DIR}/mca/${MCA_FRAMEWORK}/${MCA_COMPONENT}/CMakeLists.txt"
|
|
"
|
|
#
|
|
# Copyright (c) 2007-2008 High Performance Computing Center Stuttgart,
|
|
# University of Stuttgart. All rights reserved.
|
|
# $COPYRIGHT$
|
|
#
|
|
# Additional copyrights may follow
|
|
#
|
|
# $HEADER$
|
|
#
|
|
|
|
# make new project for shared build
|
|
|
|
INCLUDE_DIRECTORIES(\${EXTRA_INCLUDE_PATH})
|
|
|
|
ADD_LIBRARY(${LIB_NAME_PREFIX}mca_${MCA_FRAMEWORK}_${MCA_COMPONENT} SHARED
|
|
\${COMPONENT_FILES})
|
|
|
|
SET_TARGET_PROPERTIES(${LIB_NAME_PREFIX}mca_${MCA_FRAMEWORK}_${MCA_COMPONENT}
|
|
PROPERTIES COMPILE_FLAGS \"-D_USRDLL -DOPAL_IMPORTS -DOMPI_IMPORTS -DORTE_IMPORTS /TP\")
|
|
|
|
TARGET_LINK_LIBRARIES (${LIB_NAME_PREFIX}mca_${MCA_FRAMEWORK}_${MCA_COMPONENT}
|
|
libopen-pal ${MCA_LINK_LIBRARIES} ${EXTRA_LINK_LIBRARIES})
|
|
|
|
INSTALL(TARGETS ${LIB_NAME_PREFIX}mca_${MCA_FRAMEWORK}_${MCA_COMPONENT} ${INSTALL_DEST})
|
|
IF (OMPI_DEBUG_BUILD)
|
|
INSTALL(FILES ${OpenMPI_BINARY_DIR}/Debug/${LIB_NAME_PREFIX}mca_${MCA_FRAMEWORK}_${MCA_COMPONENT}${CMAKE_DEBUG_POSTFIX}.pdb
|
|
DESTINATION ${PDB_DEST})
|
|
ENDIF (OMPI_DEBUG_BUILD)
|
|
")
|
|
|
|
ADD_SUBDIRECTORY (${PROJECT_BINARY_DIR}/mca/${MCA_FRAMEWORK}/${MCA_COMPONENT} mca/${MCA_FRAMEWORK}/${MCA_COMPONENT})
|
|
|
|
# for single dll, reset these two variables for the next component.
|
|
UNSET(EXTRA_INCLUDE_PATH)
|
|
UNSET(EXTRA_LINK_LIBRARIES)
|
|
|
|
ENDIF(NOT OPAL_WANT_LIBLTDL OR NOT_SINGLE_SHARED_LIB STREQUAL "1")
|
|
|
|
# Install help files if they are here.
|
|
INSTALL(DIRECTORY ${CURRENT_PATH}/ DESTINATION share/openmpi/
|
|
FILES_MATCHING PATTERN "*.txt"
|
|
PATTERN ".svn" EXCLUDE
|
|
PATTERN ".hg" EXCLUDE)
|
|
|
|
ENDIF(BUILD_COMPONENT)
|
|
ENDIF(${MCA_COMPONENT} STREQUAL "base")
|
|
|
|
ENDFOREACH(MCA_COMPONENT)
|
|
|
|
STRING(LENGTH "${FRAMEWORK_STRUCT_DEF}" STRUCT_STRING_LENTH)
|
|
IF(STRUCT_STRING_LENTH GREATER 0)
|
|
STRING (REPLACE ";" "" OUTFILE_STRUCT ${FRAMEWORK_STRUCT_DEF})
|
|
ENDIF(STRUCT_STRING_LENTH GREATER 0)
|
|
# write out static-component.h for this mca.
|
|
FILE(WRITE "${PROJECT_BINARY_DIR}/mca/${MCA_FRAMEWORK}/base/static-components.h"
|
|
"/*
|
|
* $HEADER$
|
|
*/
|
|
#if defined(c_plusplus) || defined(__cplusplus)
|
|
extern \"C\" {
|
|
#endif
|
|
|
|
${OUTFILE_EXTERN}
|
|
|
|
const mca_base_component_t *mca_${MCA_FRAMEWORK}_base_static_components[] = {
|
|
${OUTFILE_STRUCT}
|
|
NULL
|
|
};
|
|
|
|
#if defined(c_plusplus) || defined(__cplusplus)
|
|
}
|
|
#endif
|
|
")
|
|
|
|
SET(OUTFILE_EXTERN "")
|
|
SET(OUTFILE_STRUCT "")
|
|
SET(FRAMEWORK_STRUCT_DEF "")
|
|
ENDIF(NOT ${MCA_FRAMEWORK} STREQUAL "CMakeFiles" AND NOT ${MCA_FRAMEWORK} STREQUAL "svn")
|
|
ENDFOREACH (MCA_FRAMEWORK)
|