[Piglit] [PATCH 3/4] cmake: Simplify finding python modules

Dylan Baker baker.dylan.c at gmail.com
Wed Jan 7 12:00:09 PST 2015


From: Dylan Baker <dylanx.c.baker at intel.com>

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.
---
 CMakeLists.txt                      | 15 ++----
 cmake/Modules/FindPythonMako.cmake  | 23 +++++++++
 cmake/Modules/FindPythonNumpy.cmake | 23 +++++++++
 cmake/Modules/PiglitFindMako.cmake  | 93 -------------------------------------
 cmake/Modules/PythonModule.cmake    | 35 ++++++++++++++
 5 files changed, 84 insertions(+), 105 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 ac4ba1b..8cf046d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -187,18 +187,9 @@ IF(PIGLIT_BUILD_GLX_TESTS)
 	pkg_check_modules(GLPROTO REQUIRED glproto)
 ENDIF()
 
-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)
+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..d404355
--- /dev/null
+++ b/cmake/Modules/FindPythonMako.cmake
@@ -0,0 +1,23 @@
+# 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)
+basic_python_module(mako PythonMako)
diff --git a/cmake/Modules/FindPythonNumpy.cmake b/cmake/Modules/FindPythonNumpy.cmake
new file mode 100644
index 0000000..7b5bd14
--- /dev/null
+++ b/cmake/Modules/FindPythonNumpy.cmake
@@ -0,0 +1,23 @@
+# 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)
+basic_python_module(numpy PythonNumpy)
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..a45576d
--- /dev/null
+++ b/cmake/Modules/PythonModule.cmake
@@ -0,0 +1,35 @@
+function(find_python_module MODULE PREFIX)
+	execute_process(
+		COMMAND ${PYTHON_EXECUTABLE} -c "import sys, ${MODULE}; sys.stdout.write(${MODULE}.__version__)"
+		OUTPUT_VARIABLE _version
+		RESULT_VARIABLE _status
+		ERROR_QUIET
+		OUTPUT_STRIP_TRAILING_WHITESPACE
+	)
+
+	# Export version variables to parent scope. This is needed by
+	# find_package_handle_standard_args
+	set(${PREFIX}_VERSION_STRING ${_version} PARENT_SCOPE)
+
+	# A status returns 0 if everything is okay. And zero is false. To make
+	# checking in the outer scope less surprising
+	if (_status EQUAL 0)
+        set("${PREFIX}_STATUS" "success" PARENT_SCOPE)
+	endif (_status EQUAL 0)
+endfunction(find_python_module MODULE PREFIX)
+
+# This macro provides a simple way for basic python find modules to be
+# extremely simple without duplicate boilerplate
+macro(basic_python_module MODULE PREFIX)
+    find_python_module("${MODULE}" "${PREFIX}")
+
+    include(FindPackageHandleStandardArgs)
+    find_package_handle_standard_args(
+        "${PREFIX}"
+        REQUIRED_VARS "${PREFIX}_STATUS"
+        VERSION_VAR "${PREFIX}_VERSION_STRING"
+    )
+
+    # This isn't needed in the parent scope, just here.
+    unset("${PREFIX}_STATUS")
+endmacro(basic_python_module MODULE PREFIX)
-- 
2.2.1



More information about the Piglit mailing list