python.cmake 3.0 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
include(python_module)
16

17 18
find_package(PythonInterp ${PY_VERSION} REQUIRED)
find_package(PythonLibs ${PY_VERSION} REQUIRED)
M
minqiyang 已提交
19

P
peizhilin 已提交
20
if(WIN32)
21 22 23 24
  execute_process(
    COMMAND
      "${PYTHON_EXECUTABLE}" "-c"
      "from distutils import sysconfig as s;import sys;import struct;
P
peizhilin 已提交
25 26 27
print(sys.prefix);
print(s.get_config_var('LDVERSION') or s.get_config_var('VERSION'));
"
28 29 30
    RESULT_VARIABLE _PYTHON_SUCCESS
    OUTPUT_VARIABLE _PYTHON_VALUES
    ERROR_VARIABLE _PYTHON_ERROR_VALUE)
P
peizhilin 已提交
31

32 33 34 35
  if(NOT _PYTHON_SUCCESS EQUAL 0)
    set(PYTHONLIBS_FOUND FALSE)
    return()
  endif()
P
peizhilin 已提交
36

37 38 39 40 41
  # 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 已提交
42

43 44
  # Make sure all directory separators are '/'
  string(REGEX REPLACE "\\\\" "/" PYTHON_PREFIX ${PYTHON_PREFIX})
P
peizhilin 已提交
45

46
  set(PYTHON_LIBRARY "${PYTHON_PREFIX}/libs/Python${PYTHON_LIBRARY_SUFFIX}.lib")
P
peizhilin 已提交
47

48 49 50 51 52 53 54
  # 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()
P
peizhilin 已提交
55

56 57 58 59 60
  # 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}")
P
peizhilin 已提交
61 62
endif(WIN32)

63
# Fixme: Maybe find a static library. Get SHARED/STATIC by FIND_PACKAGE.
64 65
add_library(python SHARED IMPORTED GLOBAL)
set_property(TARGET python PROPERTY IMPORTED_LOCATION ${PYTHON_LIBRARIES})
66

67 68 69 70 71 72 73 74 75 76 77 78
set(py_env "")
if(PYTHONINTERP_FOUND)
  find_python_module(pip REQUIRED)
  find_python_module(numpy REQUIRED)
  find_python_module(wheel REQUIRED)
  find_python_module(google.protobuf REQUIRED)
  find_package(NumPy REQUIRED)
  if(${PY_GOOGLE.PROTOBUF_VERSION} AND ${PY_GOOGLE.PROTOBUF_VERSION}
                                       VERSION_LESS "3.0.0")
    message(
      FATAL_ERROR
        "Found Python Protobuf ${PY_GOOGLE.PROTOBUF_VERSION} < 3.0.0, "
R
reyoung 已提交
79
        "please use pip to upgrade protobuf. pip install -U protobuf")
80 81 82 83
  endif()
endif(PYTHONINTERP_FOUND)
include_directories(${PYTHON_INCLUDE_DIR})
include_directories(${PYTHON_NUMPY_INCLUDE_DIR})