File: f77_get_fortran_handle_max.cmake

package info (click to toggle)
openmpi 1.6.5-9.1%2Bdeb8u1
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 91,628 kB
  • ctags: 44,305
  • sloc: ansic: 408,966; cpp: 44,454; sh: 27,828; makefile: 10,486; asm: 3,882; python: 1,239; lex: 805; perl: 549; csh: 253; fortran: 232; f90: 126; tcl: 12
file content (106 lines) | stat: -rw-r--r-- 4,697 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# Copyright (c) 2010      High Performance Computing Center Stuttgart, 
#                         University of Stuttgart.  All rights reserved.
#
# $COPYRIGHT$
# 
# Additional copyrights may follow
# 
# $HEADER$
#


# OMPI_F77_GET_FORTRAN_HANDLE_MAX()
# -------------------------------------------------------
# Find the maximum value of fortran integers, then calculate
# min(INT_MAX, max fortran INTEGER).  This represents the maximum
# number of fortran MPI handle index.
MACRO(OMPI_F77_GET_FORTRAN_HANDLE_MAX)

    #store previous value for later use.
    IF(DEFINED OMPI_FINT_MAX)
        SET(OMPI_FINT_MAX_OLD ${OMPI_FINT_MAX})
    ENDIF(DEFINED OMPI_FINT_MAX)

    IF(NOT OMPI_WANT_F77_BINDINGS)
        SET(OMPI_FINT_MAX 0 CACHE INTERNAL "fortran int max")
    ELSE(NOT OMPI_WANT_F77_BINDINGS)
        # Calculate the number of f's that we need to append to the hex
        # value.  Do one less than we really need becaue we assume the
        # top nybble is 0x7 to avoid sign issues.
        MATH(EXPR OMPI_NUMF ${OMPI_SIZEOF_FORTRAN_INTEGER}*2-1)
        SET(OMPI_FINT_MAX 0x7)

        WHILE(${OMPI_NUMF} GREATER 0)
            SET(OMPI_FINT_MAX ${OMPI_FINT_MAX}f CACHE INTERNAL "fortran int max")
            MATH(EXPR OMPI_NUMF ${OMPI_NUMF}-1)
        ENDWHILE(${OMPI_NUMF} GREATER 0)
    ENDIF(NOT OMPI_WANT_F77_BINDINGS)

    #OMPI_CINT_MAX doesn't change, check only once and cache the result.
    IF(NOT DEFINED CINT_MAX_CHECK_DONE)

        FILE(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/fortran_handle_max.c
            "#include <stdio.h>\n"
            "#include <limits.h>\n"
            "\n"
            "#ifdef __cplusplus\n"
            "extern \"C\" {\n"
            "#endif\n"
            "\n"
            "void main()\n"
            "{\n"
            "    FILE *fp = fopen(\"fortran_handle_max\", \"w\");\n"
            "    long cint = INT_MAX;\n"
            "    fprintf(fp, \"%ld\", cint);\n"
            "    fclose(fp);\n"
            "}\n"
            )

        EXECUTE_PROCESS(COMMAND ${CMAKE_C_COMPILER} fortran_handle_max.c ${OMPI_C_INCLUDE_DIR}${C_COMPILER_INCLUDE}
            WORKING_DIRECTORY ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp
            OUTPUT_VARIABLE OUTPUT
            RESULT_VARIABLE RESULT
            ERROR_VARIABLE ERROR)

        EXECUTE_PROCESS(COMMAND fortran_handle_max.exe
            WORKING_DIRECTORY ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp
            OUTPUT_VARIABLE OUTPUT
            RESULT_VARIABLE RESULT
            ERROR_VARIABLE ERROR)

        IF(EXISTS ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/fortran_handle_max)
            FILE(READ ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/fortran_handle_max OUTPUT_VALUE)
            SET(OMPI_CINT_MAX ${OUTPUT_VALUE} CACHE INTERNAL "c int max")
        ELSE(EXISTS ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/fortran_handle_max)
            SET(OMPI_CINT_MAX 0)
        ENDIF(EXISTS ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/fortran_handle_max)

    ENDIF(NOT DEFINED CINT_MAX_CHECK_DONE)

    #whenever OMPI_FINT_MAX changes, recalculate OMPI_FORTRAN_HANDLE_MAX
    IF(NOT DEFINED OMPI_FINT_MAX OR NOT "${OMPI_FINT_MAX}" STREQUAL "${OMPI_FINT_MAX_OLD}")

        MESSAGE(STATUS "Check Max handle value for Fortran MPI handles...")

        IF(${OMPI_CINT_MAX} EQUAL 0)
            # wow - something went really wrong.  Be conservative
            SET(OMPI_FORTRAN_HANDLE_MAX 32767 CACHE INTERNAL "Fortran handle max")
        ELSEIF(${OMPI_FINT_MAX} EQUAL 0)
             # we aren't compiling Fortran - just set it to C INT_MAX
            SET(OMPI_FORTRAN_HANDLE_MAX ${OMPI_CINT_MAX} CACHE INTERNAL "Fortran handle max")
        ELSE(${OMPI_FINT_MAX} EQUAL 0)
             # take the lesser of C INT_MAX and Fortran INTEGER
             # max.  The resulting value will then be storable in
             # either type.  There's no easy way to do this in
             # the shell, so make the preprocessor do it.
            SET(OMPI_FORTRAN_HANDLE_MAX "( ${OMPI_FINT_MAX} < ${OMPI_CINT_MAX} ? ${OMPI_FINT_MAX} : ${OMPI_CINT_MAX} )" CACHE INTERNAL "Fortran handle max")
        ENDIF(${OMPI_CINT_MAX} EQUAL 0)

        MESSAGE(STATUS "Check Max handle value for Fortran MPI handles...${OMPI_FORTRAN_HANDLE_MAX}")
        SET(FORTRAN_MAX_HANDLE_CHECK_DONE TRUE CACHE INTERNAL "Fortran handle max check done")

    ENDIF(NOT DEFINED OMPI_FINT_MAX OR NOT "${OMPI_FINT_MAX}" STREQUAL "${OMPI_FINT_MAX_OLD}")

    OMPI_DEF_VAR(OMPI_FORTRAN_HANDLE_MAX "Max handle value for fortran MPI handles, effectively min(INT_MAX, max fortran INTEGER value)." 0 1)

ENDMACRO(OMPI_F77_GET_FORTRAN_HANDLE_MAX)