FindNumPy.cmake 5.31 KB
Newer Older
1
2

#-------------------------------------------------------------------------------
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Copyright (c) 2013, Lars Baehren <lbaehren@gmail.com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
#  * Redistributions of source code must retain the above copyright notice, this
#    list of conditions and the following disclaimer.
#  * Redistributions in binary form must reproduce the above copyright notice,
#    this list of conditions and the following disclaimer in the documentation
#    and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
26
27
#-------------------------------------------------------------------------------

# - Check for the presence of NumPy
28
#
29
30
31
32
33
# The following variables are set when NumPy is found:
#  NUMPY_FOUND          = Set to true, if all components of NUMPY have been found.
#  NUMPY_INCLUDE_DIRS   = Include path for the header files of NUMPY
#  NUMPY_LIBRARIES      = Link these to use NUMPY
#  NUMPY_LFLAGS         = Linker flags (optional)
34

35
if (NOT NUMPY_FOUND)
36

37
38
39
    if (NOT NUMPY_ROOT_DIR)
        set (NUMPY_ROOT_DIR ${CMAKE_INSTALL_PREFIX})
    endif (NOT NUMPY_ROOT_DIR)
40

41
42
43
    if (NOT PYTHON_FOUND)
        find_package (PythonInterp)
    endif (NOT PYTHON_FOUND)
44

45
46
    ##__________________________________________________________________________
    ## Check for the header files
47

48
49
    ## Use Python to determine the include directory
    execute_process (
50
        COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print(numpy.get_include());"      
51
52
53
54
55
56
57
58
59
        ERROR_VARIABLE NUMPY_FIND_ERROR
        RESULT_VARIABLE NUMPY_FIND_RESULT
        OUTPUT_VARIABLE NUMPY_FIND_OUTPUT
        OUTPUT_STRIP_TRAILING_WHITESPACE
        )
    ## process the output from the execution of the command
    if (NOT NUMPY_FIND_RESULT)
        set (NUMPY_INCLUDE_DIRS ${NUMPY_FIND_OUTPUT})
    endif (NOT NUMPY_FIND_RESULT)
60

61
62
    ##__________________________________________________________________________
    ## Check for the library
63

64
    unset (NUMPY_LIBRARIES)
65

66
67
68
69
70
71
72
73
74
    if (PYTHON_SITE_PACKAGES_DIR)
        find_library (NUMPY_NPYMATH_LIBRARY npymath
            HINTS ${PYTHON_SITE_PACKAGES_DIR}/numpy/core
            PATH_SUFFIXES lib
            )
        if (NUMPY_NPYMATH_LIBRARY)
            list (APPEND NUMPY_LIBRARIES ${NUMPY_NPYMATH_LIBRARY})
        endif (NUMPY_NPYMATH_LIBRARY)
    endif (PYTHON_SITE_PACKAGES_DIR)
75

76
77
78
79
80
    ##__________________________________________________________________________
    ## Get API version of NumPy from 'numpy/numpyconfig.h'

    if (PYTHON_EXECUTABLE)
        execute_process (
81
            COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print(numpy.__version__);"
82
83
84
85
            ERROR_VARIABLE NUMPY_API_VERSION_ERROR
            RESULT_VARIABLE NUMPY_API_VERSION_RESULT
            OUTPUT_VARIABLE NUMPY_API_VERSION
            OUTPUT_STRIP_TRAILING_WHITESPACE
86
            )
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
    else ()
        ## Backup procedure: extract version number directly from the header file
        if (NUMPY_INCLUDE_DIRS)
            find_file (HAVE_NUMPYCONFIG_H numpy/numpyconfig.h
                HINTS ${NUMPY_INCLUDE_DIRS}
                )
        endif (NUMPY_INCLUDE_DIRS)
    endif ()

    ## Dissect full version number into major, minor and patch version
    if (NUMPY_API_VERSION)
        string (REGEX REPLACE "\\." ";" _tmp ${NUMPY_API_VERSION})
        list (GET _tmp 0 NUMPY_API_VERSION_MAJOR)
        list (GET _tmp 1 NUMPY_API_VERSION_MINOR)
        list (GET _tmp 2 NUMPY_API_VERSION_PATCH)
    endif (NUMPY_API_VERSION)

    ##__________________________________________________________________________
    ## Actions taken when all components have been found

107
    find_package_handle_standard_args (NumPy DEFAULT_MSG NUMPY_INCLUDE_DIRS)
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

    if (NUMPY_FOUND)
        if (NOT NUMPY_FIND_QUIETLY)
            message (STATUS "Found components for NumPy")
            message (STATUS "NUMPY_ROOT_DIR    = ${NUMPY_ROOT_DIR}")
            message (STATUS "NUMPY_INCLUDE_DIRS    = ${NUMPY_INCLUDE_DIRS}")
            message (STATUS "NUMPY_LIBRARIES   = ${NUMPY_LIBRARIES}")
            message (STATUS "NUMPY_API_VERSION = ${NUMPY_API_VERSION}")
        endif (NOT NUMPY_FIND_QUIETLY)
    else (NUMPY_FOUND)
        if (NUMPY_FIND_REQUIRED)
            message (FATAL_ERROR "Could not find NUMPY!")
        endif (NUMPY_FIND_REQUIRED)
    endif (NUMPY_FOUND)

    ##__________________________________________________________________________
    ## Mark advanced variables

  mark_as_advanced (
    NUMPY_ROOT_DIR
    NUMPY_INCLUDE_DIRS
    NUMPY_LIBRARIES
    )

endif (NOT NUMPY_FOUND)