[Mesa-dev] [PATCH shader-db] check_dependencies: refactor to a python script

Rhys Kidd rhyskidd at gmail.com
Sat Oct 10 00:45:08 PDT 2015


Deliver consistency with all other shader-db scripts, which are Python scripts.

No change in features or output strings.

Passed pep8, except for two comment lines suggesting commands to add
dependencies to the [require] section of *.shader_test files.

Although not a performance critical feature, equivalent performance to
Perl script other than process_directories() recursive directory traversal.

os.scandir(item) would be significantly faster than os.walk(item), however
its use would introduce a minimum dependency on Python 3.5 which is preferably
avoided at this time.

Signed-off-by: Rhys Kidd <rhyskidd at gmail.com>
---
 check_dependencies.pl | 107 --------------------------------------------------
 check_dependencies.py |  82 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 82 insertions(+), 107 deletions(-)
 delete mode 100755 check_dependencies.pl
 create mode 100755 check_dependencies.py

diff --git a/check_dependencies.pl b/check_dependencies.pl
deleted file mode 100755
index 3e49f7f..0000000
--- a/check_dependencies.pl
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/usr/bin/perl
-#
-# 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.
-
-# For checking that shader_test's dependencies are correct.
-#
-# Run with
-# 	./check_dependencies.pl shaders/
-#
-# And then run a command like these to add dependencies to the [require]
-# section:
-#
-# find shaders/ -name '*.shader_test' -exec grep -l '#version 120' {} + | xargs sed -i -e 's/GLSL >= 1.10/GLSL >= 1.20/'
-# find shaders/ -name '*.shader_test' -exec grep -l '#extension GL_ARB_texture_rectangle : require' {} + | xargs sed -i -e 's/GLSL >= 1.20/GLSL >= 1.20\nGL_ARB_texture_rectangle/'
-
-use strict;
-use File::Find;
-
-die("Not enough arguments: specify a directory\n") if ($#ARGV < 0);
-
-# The array_diff function is copied from the Array::Utils package and contains
-# this copyright:
-#
-# This module is Copyright (c) 2007 Sergei A. Fedorov.
-# All rights reserved.
-#
-# You may distribute under the terms of either the GNU General Public
-# License or the Artistic License, as specified in the Perl README file.
-sub array_diff(\@\@) {
-	my %e = map { $_ => undef } @{$_[1]};
-	return @{[ ( grep { (exists $e{$_}) ? ( delete $e{$_} ) : ( 1 ) } @{ $_[0] } ), keys %e ] };
-}
-
-my @shader_test;
-
-sub wanted {
-	push(@shader_test, $File::Find::name) if (/\.shader_test$/);
-}
-
-finddepth(\&wanted,  @ARGV);
-
-my $fail = 0;
-
-foreach my $shader_test (@shader_test) {
-	my $expected;
-	my $actual;
-	my @expected_ext;
-	my @actual_ext;
-
-	open(my $fh, "<", $shader_test)
-		or die("cannot open < $shader_test: $!\n");
-	
-	while (<$fh>) {
-		chomp;
-
-		if (/^GLSL >= (\d)\.(\d\d)/) {
-			$expected = $1 * 100 + $2;
-		}
-		if (/^\s*#\s*version\s+(\d{3})/) {
-			$actual = $1 if $actual == undef;
-			$actual = $1 if $actual < $1;
-		}
-
-		if (/^(GL_\S+)/) {
-			next if ($1 eq "GL_ARB_fragment_program" ||
-				 $1 eq "GL_ARB_vertex_program");
-			push(@expected_ext, $1);
-		}
-		if (/^\s*#\s*extension\s+(GL_\S+)\s*:\s*require/) {
-			push(@actual_ext, $1);
-		}
-	}
-
-	close($fh);
-
-	if ($actual != undef && $expected != $actual) {
-		print "$shader_test requested $expected, but requires $actual\n";
-		$fail = 1;
-	}
-
-	my @extension = array_diff(@expected_ext, @actual_ext);
-	foreach my $extension (@extension) {
-		print "$shader_test extension $extension mismatch\n";
-		$fail = 1;
-	}
-}
-
-exit($fail);
diff --git a/check_dependencies.py b/check_dependencies.py
new file mode 100755
index 0000000..c1f7860
--- /dev/null
+++ b/check_dependencies.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python3
+
+# For checking that shader_test's dependencies are correct.
+#
+# Run with
+# 	./check_dependencies shaders/
+#
+# And then run a command like these to add dependencies to the [require]
+# section:
+#
+# find shaders/ -name '*.shader_test' -exec grep -l '#version 120' {} + | xargs sed -i -e 's/GLSL >= 1.10/GLSL >= 1.20/'
+# find shaders/ -name '*.shader_test' -exec grep -l '#extension GL_ARB_texture_rectangle : require' {} + | xargs sed -i -e 's/GLSL >= 1.20/GLSL >= 1.20\nGL_ARB_texture_rectangle/
+
+import os
+import re
+import sys
+
+
+def process_directories(item, filetype):
+    if os.path.isfile(item):
+        yield item
+    else:
+        for dirpath, _, filenames in os.walk(item):
+            for fname in filenames:
+                if filetype in fname and fname.endswith(filetype):
+                    yield os.path.join(dirpath, fname)
+
+
+def main():
+    fail = 0
+
+    if len(sys.argv) < 2:
+        print("Not enough arguments: specify a directory")
+        sys.exit(1)
+
+    re_find_GLSL = re.compile(r'GLSL >= (\d).(\d\d)')
+    re_find_version = re.compile(r'\s*#\s*version\s+(\d{3})')
+
+    re_find_GL = re.compile(r'(GL_\S+)')
+    re_find_ext = re.compile(r'\s*#\s*extension\s+(GL_\S+)\s*:\s*require')
+
+    for shader_test in process_directories(sys.argv[1], '.shader_test'):
+        expected = 0
+        actual = 0
+        expected_ext = []
+        actual_ext = []
+
+        with open(shader_test, 'r') as fh:
+            for line in fh:
+                match = re_find_GLSL.match(line)
+                if match:
+                    expected = int(match.group(1) + match.group(2))
+
+                match = re_find_version.match(line)
+                if match:
+                    actual = max(actual, int(match.group(1)))
+
+                match = re_find_GL.match(line)
+                if match:
+                    if match.group(1) != "GL_ARB_fragment_program" \
+                       and match.group(1) != "GL_ARB_vertex_program":
+                        expected_ext.append(match.group(1))
+
+                match = re_find_ext.match(line)
+                if match:
+                    actual_ext.append(match.group(1))
+
+        if (actual is not 0) and (expected is not actual):
+            print("%s requested %s, but requires %s" %
+                  (shader_test, expected, actual))
+            fail = 1
+
+        for extension in set(expected_ext) ^ set(actual_ext):
+            print("%s extension %s mismatch" % (shader_test, extension))
+            fail = 1
+
+    sys.exit(fail)
+
+
+if __name__ == "__main__":
+    main()
+
-- 
2.1.4



More information about the mesa-dev mailing list