[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