diff options
author | Bastien Montagne <bastien@blender.org> | 2020-12-07 17:28:24 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2020-12-14 13:00:28 +0300 |
commit | 5d570c875eda8fb9aa3635f7f4edac0dc1eaedc8 (patch) | |
tree | c25cf569dd78fcacab71fc1fea1d1eed11bad276 | |
parent | 53ed96641c60531e2ece17230879088df899f8a5 (diff) |
Fix several issues with handling of numpy in CMake.
Issues were:
* Abusing of `WITH_PYTHON_INSTALL_NUMPY` by both Audaspace and
Mantaflow.
- `PYTHON_INSTALL` options only decide whether we copy python (and
some extra modules) in our Blender installation. On linux it
makes much more sense to use global python installation.
- Now we have instead a proper `WITH_PYTHON_NUMPY`
* Bad assumptions regarding path of headers relative to path of python
module.
- In current Debian testing, modules are under `python3.9`
directory, while headers are under `python3` directory.
- Now we properly `find_path` for headers as well, modifying
`find_python_package` to take an optional argument for headers.
Note that the required changes done to `extern` libraries are in
blender-specific files that do not exist upstream.
Differential Revision: https://developer.blender.org/D9773
-rw-r--r-- | CMakeLists.txt | 15 | ||||
-rw-r--r-- | build_files/cmake/macros.cmake | 40 | ||||
-rw-r--r-- | extern/audaspace/blender_config.cmake | 2 | ||||
-rw-r--r-- | extern/mantaflow/CMakeLists.txt | 7 |
4 files changed, 51 insertions, 13 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d7cf4e325c..71186a58281 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -349,14 +349,16 @@ endif() option(WITH_PYTHON_INSTALL "Copy system python into the blender install folder" ON) if(WIN32 OR APPLE) # Windows and macOS have this bundled with Python libraries. -elseif(WITH_PYTHON_INSTALL OR (WITH_AUDASPACE AND NOT WITH_SYSTEM_AUDASPACE)) +elseif(WITH_PYTHON_INSTALL OR (WITH_AUDASPACE AND NOT WITH_SYSTEM_AUDASPACE) OR WITH_MOD_FLUID) + option(WITH_PYTHON_NUMPY "Include NumPy in Blender (used by Audaspace and Mantaflow)" ON) + set(PYTHON_NUMPY_PATH "" CACHE PATH "Path to python site-packages or dist-packages containing 'numpy' module") mark_as_advanced(PYTHON_NUMPY_PATH) - set(PYTHON_NUMPY_INCLUDE_DIRS ${PYTHON_NUMPY_PATH}/numpy/core/include CACHE PATH "Path to the include directory of the numpy module") + set(PYTHON_NUMPY_INCLUDE_DIRS "" CACHE PATH "Path to the include directory of the NumPy module") mark_as_advanced(PYTHON_NUMPY_INCLUDE_DIRS) endif() if(WITH_PYTHON_INSTALL) - option(WITH_PYTHON_INSTALL_NUMPY "Copy system numpy into the blender install folder" ON) + option(WITH_PYTHON_INSTALL_NUMPY "Copy system NumPy into the blender install folder" ON) if(UNIX AND NOT APPLE) option(WITH_PYTHON_INSTALL_REQUESTS "Copy system requests into the blender install folder" ON) @@ -1621,12 +1623,9 @@ if(WITH_PYTHON) if(WIN32 OR APPLE) # Windows and macOS have this bundled with Python libraries. - elseif((WITH_PYTHON_INSTALL AND WITH_PYTHON_INSTALL_NUMPY) OR (WITH_AUDASPACE AND NOT WITH_SYSTEM_AUDASPACE)) + elseif((WITH_PYTHON_INSTALL AND WITH_PYTHON_INSTALL_NUMPY) OR WITH_PYTHON_NUMPY) if(("${PYTHON_NUMPY_PATH}" STREQUAL "") OR (${PYTHON_NUMPY_PATH} MATCHES NOTFOUND)) - find_python_package(numpy) - unset(PYTHON_NUMPY_INCLUDE_DIRS CACHE) - set(PYTHON_NUMPY_INCLUDE_DIRS ${PYTHON_NUMPY_PATH}/numpy/core/include CACHE PATH "Path to the include directory of the numpy module") - mark_as_advanced(PYTHON_NUMPY_INCLUDE_DIRS) + find_python_package(numpy "core/include") endif() endif() diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake index 202b44f611c..aeedcf30c31 100644 --- a/build_files/cmake/macros.cmake +++ b/build_files/cmake/macros.cmake @@ -1139,6 +1139,7 @@ endfunction() function(find_python_package package + relative_include_dir ) string(TOUPPER ${package} _upper_package) @@ -1170,7 +1171,10 @@ function(find_python_package dist-packages vendor-packages NO_DEFAULT_PATH + DOC + "Path to python site-packages or dist-packages containing '${package}' module" ) + mark_as_advanced(PYTHON_${_upper_package}_PATH) if(NOT EXISTS "${PYTHON_${_upper_package}_PATH}") message(WARNING @@ -1188,6 +1192,42 @@ function(find_python_package set(WITH_PYTHON_INSTALL_${_upper_package} OFF PARENT_SCOPE) else() message(STATUS "${package} found at '${PYTHON_${_upper_package}_PATH}'") + + if(NOT "${relative_include_dir}" STREQUAL "") + unset(PYTHON_${_upper_package}_INCLUDE_DIRS CACHE) + find_path(PYTHON_${_upper_package}_INCLUDE_DIRS + NAMES + "${package}/${relative_include_dir}" + HINTS + "${PYTHON_LIBPATH}/" + "${PYTHON_LIBPATH}/python${PYTHON_VERSION}/" + "${PYTHON_LIBPATH}/python${_PY_VER_MAJOR}/" + PATH_SUFFIXES + "site-packages/" + "dist-packages/" + "vendor-packages/" + NO_DEFAULT_PATH + DOC + "Path to python site-packages or dist-packages containing '${package}' module header files" + ) + mark_as_advanced(PYTHON_${_upper_package}_INCLUDE_DIRS) + + if(NOT EXISTS "${PYTHON_${_upper_package}_INCLUDE_DIRS}") + message(WARNING + "Python package '${package}' include dir path could not be found in:\n" + "'${PYTHON_LIBPATH}/python${PYTHON_VERSION}/site-packages/${package}/${relative_include_dir}', " + "'${PYTHON_LIBPATH}/python${_PY_VER_MAJOR}/site-packages/${package}/${relative_include_dir}', " + "'${PYTHON_LIBPATH}/python${PYTHON_VERSION}/dist-packages/${package}/${relative_include_dir}', " + "'${PYTHON_LIBPATH}/python${_PY_VER_MAJOR}/dist-packages/${package}/${relative_include_dir}', " + "'${PYTHON_LIBPATH}/python${PYTHON_VERSION}/vendor-packages/${package}/${relative_include_dir}', " + "'${PYTHON_LIBPATH}/python${_PY_VER_MAJOR}/vendor-packages/${package}/${relative_include_dir}', " + "\n" + "The 'WITH_PYTHON_${_upper_package}' option will be disabled.\n" + "The build will be usable, only add-ons that depend on this package won't be functional." + ) + set(WITH_PYTHON_${_upper_package} OFF PARENT_SCOPE) + endif() + endif() endif() endif() endfunction() diff --git a/extern/audaspace/blender_config.cmake b/extern/audaspace/blender_config.cmake index 1f8f85b9868..12810e2b044 100644 --- a/extern/audaspace/blender_config.cmake +++ b/extern/audaspace/blender_config.cmake @@ -24,6 +24,6 @@ set(JACK_FOUND ${WITH_JACK}) set(LIBSNDFILE_FOUND ${WITH_CODEC_SNDFILE}) set(OPENAL_FOUND ${WITH_OPENAL}) set(PYTHONLIBS_FOUND TRUE) -set(NUMPY_FOUND TRUE) +set(NUMPY_FOUND ${WITH_PYTHON_NUMPY}) set(NUMPY_INCLUDE_DIRS ${PYTHON_NUMPY_INCLUDE_DIRS}) set(SDL_FOUND ${WITH_SDL}) diff --git a/extern/mantaflow/CMakeLists.txt b/extern/mantaflow/CMakeLists.txt index ee155ee8636..ccf272650e3 100644 --- a/extern/mantaflow/CMakeLists.txt +++ b/extern/mantaflow/CMakeLists.txt @@ -85,7 +85,7 @@ if(WIN32) add_definitions(-D_USE_MATH_DEFINES) endif() -if(WITH_MANTA_NUMPY AND WITH_PYTHON_INSTALL_NUMPY) +if(WITH_MANTA_NUMPY AND WITH_PYTHON_NUMPY) add_definitions(-DNUMPY=1) endif() @@ -109,7 +109,7 @@ set(INC_SYS ${ZLIB_INCLUDE_DIRS} ) -if(WITH_MANTA_NUMPY AND WITH_PYTHON_INSTALL_NUMPY) +if(WITH_MANTA_NUMPY AND WITH_PYTHON_NUMPY) list(APPEND INC_SYS ${PYTHON_NUMPY_INCLUDE_DIRS} ) @@ -255,8 +255,7 @@ if(WITH_MANTA_DEPENDENCIES) ${MANTA_DEP}/cnpy/cnpy.h ) endif() - -if(WITH_MANTA_NUMPY AND WITH_PYTHON_INSTALL_NUMPY) +if(WITH_MANTA_NUMPY AND WITH_PYTHON_NUMPY) list(APPEND SRC ${MANTA_PP}/plugin/numpyconvert.cpp ${MANTA_PP}/plugin/tfplugins.cpp |