python.cmake 3.4 KB
Newer Older
1
# Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved.
X
xuwei06 已提交
2
#
L
liaogang 已提交
3 4 5
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
X
xuwei06 已提交
6
#
L
liaogang 已提交
7
# http://www.apache.org/licenses/LICENSE-2.0
X
xuwei06 已提交
8
#
L
liaogang 已提交
9 10 11 12 13 14
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

15 16 17 18
IF(NOT WITH_PYTHON)
    return()
ENDIF()

19 20
INCLUDE(python_module)

M
minqiyang 已提交
21 22 23
FIND_PACKAGE(PythonInterp ${PY_VERSION})
FIND_PACKAGE(PythonLibs ${PY_VERSION})

P
peizhilin 已提交
24 25
if(WIN32)
    execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c"
P
peizhilin 已提交
26
"from distutils import sysconfig as s;import sys;import struct;import sysconfig;
P
peizhilin 已提交
27 28
print(sys.prefix);
print(s.get_config_var('LDVERSION') or s.get_config_var('VERSION'));
P
peizhilin 已提交
29 30 31
print(sysconfig.get_platform());
print(sysconfig.get_config_var('py_version_nodot'));
print(sysconfig.get_config_var('SOABI'));
P
peizhilin 已提交
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
"
            RESULT_VARIABLE _PYTHON_SUCCESS
            OUTPUT_VARIABLE _PYTHON_VALUES
            ERROR_VARIABLE _PYTHON_ERROR_VALUE)

    if(NOT _PYTHON_SUCCESS MATCHES 0)
        set(PYTHONLIBS_FOUND FALSE)
        return()
    endif()

    # Convert the process output into a list
    string(REGEX REPLACE ";" "\\\\;" _PYTHON_VALUES ${_PYTHON_VALUES})
    string(REGEX REPLACE "\n" ";" _PYTHON_VALUES ${_PYTHON_VALUES})
    list(GET _PYTHON_VALUES 0 PYTHON_PREFIX)
    list(GET _PYTHON_VALUES 1 PYTHON_LIBRARY_SUFFIX)
P
peizhilin 已提交
47 48 49
    list(GET _PYTHON_VALUES 2 SYS_PLATFORM)
    list(GET _PYTHON_VALUES 3 PYTHON_SHORT_VERSION_NODOT)
    list(GET _PYTHON_VALUES 4 PYTHON_SOABI)
P
peizhilin 已提交
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

    # Make sure all directory separators are '/'
    string(REGEX REPLACE "\\\\" "/" PYTHON_PREFIX ${PYTHON_PREFIX})

    set(PYTHON_LIBRARY
            "${PYTHON_PREFIX}/libs/Python${PYTHON_LIBRARY_SUFFIX}.lib")

    # when run in a venv, PYTHON_PREFIX points to it. But the libraries remain in the
    # original python installation. They may be found relative to PYTHON_INCLUDE_DIR.
    if(NOT EXISTS "${PYTHON_LIBRARY}")
        get_filename_component(_PYTHON_ROOT ${PYTHON_INCLUDE_DIR} DIRECTORY)
        set(PYTHON_LIBRARY
                "${_PYTHON_ROOT}/libs/Python${PYTHON_LIBRARY_SUFFIX}.lib")
    endif()

    # raise an error if the python libs are still not found.
    if(NOT EXISTS "${PYTHON_LIBRARY}")
        message(FATAL_ERROR "Python libraries not found")
    endif()
    SET(PYTHON_LIBRARIES "${PYTHON_LIBRARY}")
endif(WIN32)

72 73 74
# Fixme: Maybe find a static library. Get SHARED/STATIC by FIND_PACKAGE.
ADD_LIBRARY(python SHARED IMPORTED GLOBAL)
SET_PROPERTY(TARGET python PROPERTY IMPORTED_LOCATION ${PYTHON_LIBRARIES})
75

L
liaogang 已提交
76
SET(py_env "")
77
IF(PYTHONINTERP_FOUND)
78 79 80 81
    find_python_module(pip REQUIRED)
    find_python_module(numpy REQUIRED)
    find_python_module(wheel REQUIRED)
    find_python_module(google.protobuf REQUIRED)
82
    FIND_PACKAGE(NumPy REQUIRED)
R
reyoung 已提交
83
    IF(${PY_GOOGLE.PROTOBUF_VERSION} AND ${PY_GOOGLE.PROTOBUF_VERSION} VERSION_LESS "3.0.0")
L
liaogang 已提交
84
        MESSAGE(FATAL_ERROR "Found Python Protobuf ${PY_GOOGLE.PROTOBUF_VERSION} < 3.0.0, "
R
reyoung 已提交
85 86
        "please use pip to upgrade protobuf. pip install -U protobuf")
    ENDIF()
87
ENDIF(PYTHONINTERP_FOUND)
L
liaogang 已提交
88

89 90
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIR})
INCLUDE_DIRECTORIES(${PYTHON_NUMPY_INCLUDE_DIR})