[Piglit] [Patch v2 2/3] cmake: Simplify finding python modules

Dylan Baker baker.dylan.c at gmail.com
Mon Dec 15 10:56:47 PST 2014


This patch adds 3 files, PythonModule.cmake, FindPythonMako.cmake and
FindPythonNumpy.cmake.

PythonModule provides a simple function for running python and parsing
the version strings, each FindPython*.cmake then just calls that
function, and then calls the find_package_handle_standard_args macro for
simple, standard finding. This is much more in line with how the core
cmake modules work, and makes is trivial to add additional python
modules with all of the standard cmake awesomeness like version
checking.

v2: - add copyright notice
    - don't set a few variables that don't need to be set
---
 CMakeLists.txt                      | 18 ++-----
 cmake/Modules/FindPythonMako.cmake  | 30 ++++++++++++
 cmake/Modules/FindPythonNumpy.cmake | 30 ++++++++++++
 cmake/Modules/PiglitFindMako.cmake  | 93 -------------------------------------
 cmake/Modules/PythonModule.cmake    | 28 +++++++++++
 5 files changed, 93 insertions(+), 106 deletions(-)
 create mode 100644 cmake/Modules/FindPythonMako.cmake
 create mode 100644 cmake/Modules/FindPythonNumpy.cmake
 delete mode 100644 cmake/Modules/PiglitFindMako.cmake
 create mode 100644 cmake/Modules/PythonModule.cmake

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ba48ea7..e85bb37 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -171,19 +171,11 @@ IF(PIGLIT_BUILD_GLX_TESTS)
 	pkg_check_modules(GLPROTO REQUIRED glproto)
 ENDIF()
 
-# Check for presence of Python 2.7 or greater.
-FIND_PACKAGE(PythonInterp 2.7 REQUIRED)
-include(PiglitFindMako)
-
-# Require numpy
-execute_process(
-	COMMAND ${PYTHON_EXECUTABLE} -c "import numpy"
-	OUTPUT_QUIET
-	ERROR_QUIET
-	RESULT_VARIABLE import_numpy_error_code)
-if(NOT import_numpy_error_code EQUAL 0)
-	message(FATAL_ERROR "numpy python module not found")
-endif(NOT import_numpy_error_code EQUAL 0)
+# Check for presence of Python 2.7.x
+find_package(PythonInterp 2.7 REQUIRED)
+
+find_package(PythonNumpy REQUIRED)
+find_package(PythonMako 0.7.3 REQUIRED)
 
 # Default to compiling with debug information (`gcc -g`):
 if(NOT CMAKE_BUILD_TYPE)
diff --git a/cmake/Modules/FindPythonMako.cmake b/cmake/Modules/FindPythonMako.cmake
new file mode 100644
index 0000000..4194dac
--- /dev/null
+++ b/cmake/Modules/FindPythonMako.cmake
@@ -0,0 +1,30 @@
+# Copyright (C) 2014 Intel Corporation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+# OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+# Find mako
+
+include(PythonModule)
+find_python_module(mako PythonMako)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(
+	REQUIRED_VARS PythonMako_STATUS
+    VERSION_VAR PythonMako_VERSION_STRING
+)
diff --git a/cmake/Modules/FindPythonNumpy.cmake b/cmake/Modules/FindPythonNumpy.cmake
new file mode 100644
index 0000000..d3fd5aa
--- /dev/null
+++ b/cmake/Modules/FindPythonNumpy.cmake
@@ -0,0 +1,30 @@
+# Copyright (C) 2014 Intel Corporation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+# OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+# Find numpy
+
+include(PythonModule)
+find_python_module(numpy PythonNumpy)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(
+	REQUIRED_VARS PythonNumpy_STATUS
+    VERSION_VAR PythonNumpy_VERSION_STRING
+)
diff --git a/cmake/Modules/PiglitFindMako.cmake b/cmake/Modules/PiglitFindMako.cmake
deleted file mode 100644
index 0637d30..0000000
--- a/cmake/Modules/PiglitFindMako.cmake
+++ /dev/null
@@ -1,93 +0,0 @@
-# Copyright 2014 Intel Corporation
-#
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the "Software"),
-# to deal in the Software without restriction, including without limitation
-# the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# and/or sell copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice (including the next
-# paragraph) shall be included in all copies or substantial portions of the
-# Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-# IN THE SOFTWARE.
-
-# This module sets the following variables:
-#
-#   MAKO_REQUIRED_VERSION
-#
-#   MAKO_FOUND (CACHE)
-#       True if and only if the installed Mako version is at least
-#       MAKO_REQUIRED_VERSION.
-#
-#    MAKO_VERSION (CACHE)
-#       If MAKO_FOUND, then this is the installed Mako's full version string,
-#       given by the Python value ``mako.__version__``. Otherwise,
-#       "MAKO_VERSION-NOTFOUND".
-#
-# This module avoids checking the installed Mako version when not needed, by
-# performing the check the check only if the cached MAKO_VERSION does not
-# satisfy the current value of MAKO_REQUIRED_VERSION.
-
-set(MAKO_REQUIRED_VERSION "0.7.3")
-
-set(__MAKO_CHECK_VERSION_PY "
-try:
-	import mako
-except ImportError as err:
-	import sys
-	sys.exit(err)
-else:
-	print(mako.__version__)
-")
-
-set(__MAKO_INSTALL_HINT "Hint: Try installing Mako with `pip install --user --upgrade Mako`")
-
-if(MAKO_VERSION VERSION_LESS MAKO_REQUIRED_VERSION)
-	message(STATUS "Looking for Mako >= ${MAKO_REQUIRED_VERSION}")
-
-	set(MAKO_FOUND false)
-	set(MAKO_VERSION "MAKO_VERSION-NOTFOUND")
-
-	execute_process(
-		COMMAND ${PYTHON_EXECUTABLE} -c "${__MAKO_CHECK_VERSION_PY}"
-		OUTPUT_VARIABLE __MAKO_ACTUAL_VERSION
-		OUTPUT_STRIP_TRAILING_WHITESPACE
-		ERROR_VARIABLE __MAKO_STDERR
-		ERROR_STRIP_TRAILING_WHITESPACE
-		RESULT_VARIABLE __MAKO_EXIT_STATUS
-	)
-
-	if(NOT __MAKO_EXIT_STATUS EQUAL 0)
-		message(SEND_ERROR
-			"  Failed to find Mako\n"
-			"  ${__MAKO_INSTALL_HINT}\n")
-	elseif(__MAKO_ACTUAL_VERSION VERSION_LESS MAKO_REQUIRED_VERSION)
-		message(SEND_ERROR
-			"  Found Mako ${__MAKO_ACTUAL_VERSION}, but Mako >= ${MAKO_REQUIRED_VERSION} is required\n"
-			"  ${__MAKO_INSTALL_HINT}\n")
-	else()
-		message(STATUS "Found Mako ${__MAKO_ACTUAL_VERSION}")
-		set(MAKO_FOUND true)
-		set(MAKO_VERSION "${__MAKO_ACTUAL_VERSION}")
-	endif()
-endif()
-
-if(NOT MAKO_FOUND)
-endif()
-
-set(MAKO_FOUND "${MAKO_FOUND}"
-    CACHE INTERNAL "Was Mako >= ${MAKO_REQUIRED_VERSION} found?"
-    FORCE
-)
-set(MAKO_VERSION "${MAKO_VERSION}"
-    CACHE INTERNAL "Full version string of installed Mako, if MAKO_FOUND."
-    FORCE
-)
diff --git a/cmake/Modules/PythonModule.cmake b/cmake/Modules/PythonModule.cmake
new file mode 100644
index 0000000..5cc5f06
--- /dev/null
+++ b/cmake/Modules/PythonModule.cmake
@@ -0,0 +1,28 @@
+function(find_python_module module _name)
+	execute_process(
+		COMMAND ${PYTHON_EXECUTABLE} -c "import sys, ${module}; sys.stdout.write(${module}.__version__.replace('.', ';'))"
+		OUTPUT_VARIABLE _version
+		RESULT_VARIABLE _mako_status
+		ERROR_QUIET
+		OUTPUT_STRIP_TRAILING_WHITESPACE
+	)
+
+	string(REPLACE ";" "." _VERSION_STRING "${_version}")
+	list(GET _VERSION 0 _VERSION_MAJOR)
+	list(GET _VERSION 1 _VERSION_MINOR)
+	list(GET _VERSION 2 _VERSION_PATCH)
+
+	# Export variables to parent scope
+	set(${_name}_VERSION_STRING ${_VERSION_STRING} PARENT_SCOPE)
+	set(${_name}_VERSION_MAJOR ${_VERSION_MAJOR} PARENT_SCOPE)
+	set(${_name}_VERSION_MINOR ${_VERSION_MINOR} PARENT_SCOPE)
+	set(${_name}_VERSION_PATCH ${_VERSION_PATCH} PARENT_SCOPE)
+
+	# A status returns 0 if everything is okay. And zero is false. To make
+	# checking in the outer scope less surprising
+	if (_mako_status EQUAL 0)
+		set(${_name}_STATUS TRUE PARENT_SCOPE)
+	else ()
+		set(${_name}_STATUS FALSE PARENT_SCOPE)
+	endif (_mako_status EQUAL 0)
+endfunction(find_python_module module)
-- 
2.2.0



More information about the Piglit mailing list