Fix python scripts to work with python3 (#2426)

Updated script to work with python3 and python2.

Added required tools.

We added a section to the readme to mention the tools that are needed to
build and test spirv-tools. For the compiler, the compilers used by the
bots are mentioned.

The bots have been changed. The windows bots will not use python 3.6 for testing. The other bots will still use python 2.7. Both Python2 and Python3 will be tested.

Fixes #2407.
Fixes #1856.
This commit is contained in:
Steven Perron 2019-03-06 14:11:01 -05:00 committed by GitHub
parent 86f6ac086c
commit 07f80c4df1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 50 additions and 17 deletions

View File

@ -42,7 +42,7 @@ install:
- set NINJA_URL="https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-win.zip" - set NINJA_URL="https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-win.zip"
- appveyor DownloadFile %NINJA_URL% -FileName ninja.zip - appveyor DownloadFile %NINJA_URL% -FileName ninja.zip
- 7z x ninja.zip -oC:\ninja > nul - 7z x ninja.zip -oC:\ninja > nul
- set PATH=C:\ninja;%PATH% - set PATH=C:\ninja;C:\Python36;%PATH%
before_build: before_build:
- git clone --depth=1 https://github.com/KhronosGroup/SPIRV-Headers.git external/spirv-headers - git clone --depth=1 https://github.com/KhronosGroup/SPIRV-Headers.git external/spirv-headers

View File

@ -176,7 +176,7 @@ if(NOT COMMAND find_host_program)
endmacro() endmacro()
endif() endif()
find_host_package(PythonInterp 2.7 REQUIRED) find_host_package(PythonInterp)
# Check for symbol exports on Linux. # Check for symbol exports on Linux.
# At the moment, this check will fail on the OSX build machines for the Android NDK. # At the moment, this check will fail on the OSX build machines for the Android NDK.

View File

@ -269,6 +269,36 @@ cmake [-G <platform-generator>] <spirv-dir>
Once the build files have been generated, build using your preferred Once the build files have been generated, build using your preferred
development environment. development environment.
### Tools you'll need
For building and testing SPIRV-Tools, the following tools should be
installed regardless of your OS:
- [CMake](http://www.cmake.org/): for generating compilation targets. Version
2.8.12 or later.
- [Python](http://www.python.org/): for utility scripts and running the test
suite. Version 2 or 3.
We will be moving to Python3 only in the future. If you are using Python2, you
will need to install Python-future:
```pip install future
```
SPIRV-Tools is regularly tested with the the following compilers:
On Linux
- GCC version 4.8.5
- Clang version 3.8
On MacOS
- AppleClang 10.0
On Windows
- Visual Studio 2015
- Visual Studio 2017
Other compilers or later versions may work, but they are not tested.
### CMake options ### CMake options
The following CMake options are supported: The following CMake options are supported:

View File

@ -78,7 +78,7 @@ mkdir build && cd $SRC/build
# Invoke the build. # Invoke the build.
BUILD_SHA=${KOKORO_GITHUB_COMMIT:-$KOKORO_GITHUB_PULL_REQUEST_COMMIT} BUILD_SHA=${KOKORO_GITHUB_COMMIT:-$KOKORO_GITHUB_PULL_REQUEST_COMMIT}
echo $(date): Starting build... echo $(date): Starting build...
cmake -GNinja -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=install -DRE2_BUILD_TESTING=OFF $ADDITIONAL_CMAKE_FLAGS $CMAKE_C_CXX_COMPILER .. cmake -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/python2.7 -GNinja -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=install -DRE2_BUILD_TESTING=OFF $ADDITIONAL_CMAKE_FLAGS $CMAKE_C_CXX_COMPILER ..
echo $(date): Build everything... echo $(date): Build everything...
ninja ninja

View File

@ -21,8 +21,8 @@ set SRC=%cd%\github\SPIRV-Tools
set BUILD_TYPE=%1 set BUILD_TYPE=%1
set VS_VERSION=%2 set VS_VERSION=%2
:: Force usage of python 2.7 rather than 3.6 :: Force usage of python 3.6
set PATH=C:\python27;%PATH% set PATH=C:\python36;%PATH%
cd %SRC% cd %SRC%
git clone --depth=1 https://github.com/KhronosGroup/SPIRV-Headers external/spirv-headers git clone --depth=1 https://github.com/KhronosGroup/SPIRV-Headers external/spirv-headers

View File

@ -18,15 +18,18 @@ as superclass and providing the expected_* variables required by the check_*()
methods in the mixin classes. methods in the mixin classes.
""" """
import difflib import difflib
import functools
import os import os
import re import re
import subprocess import subprocess
import traceback
from spirv_test_framework import SpirvTest from spirv_test_framework import SpirvTest
from builtins import bytes
def convert_to_unix_line_endings(source): def convert_to_unix_line_endings(source):
"""Converts all line endings in source to be unix line endings.""" """Converts all line endings in source to be unix line endings."""
return source.replace('\r\n', '\n').replace('\r', '\n') result = source.replace('\r\n', '\n').replace('\r', '\n')
return result
def substitute_file_extension(filename, extension): def substitute_file_extension(filename, extension):
@ -133,7 +136,7 @@ class CorrectBinaryLengthAndPreamble(SpirvTest):
word = binary[index * 4:(index + 1) * 4] word = binary[index * 4:(index + 1) * 4]
if little_endian: if little_endian:
word = reversed(word) word = reversed(word)
return reduce(lambda w, b: (w << 8) | ord(b), word, 0) return functools.reduce(lambda w, b: (w << 8) | b, word, 0)
def check_endianness(binary): def check_endianness(binary):
"""Checks the endianness of the given SPIR-V binary. """Checks the endianness of the given SPIR-V binary.
@ -479,7 +482,7 @@ class ErrorMessageSubstr(SpirvTest):
if not status.stderr: if not status.stderr:
return False, 'Expected error message, but no output on stderr' return False, 'Expected error message, but no output on stderr'
if self.expected_error_substr not in convert_to_unix_line_endings( if self.expected_error_substr not in convert_to_unix_line_endings(
status.stderr): status.stderr.decode('utf8')):
return False, ('Incorrect stderr output:\n{act}\n' return False, ('Incorrect stderr output:\n{act}\n'
'Expected substring not found in stderr:\n{exp}'.format( 'Expected substring not found in stderr:\n{exp}'.format(
act=status.stderr, exp=self.expected_error_substr)) act=status.stderr, exp=self.expected_error_substr))
@ -499,7 +502,7 @@ class WarningMessage(SpirvTest):
' command execution') ' command execution')
if not status.stderr: if not status.stderr:
return False, 'Expected warning message, but no output on stderr' return False, 'Expected warning message, but no output on stderr'
if self.expected_warning != convert_to_unix_line_endings(status.stderr): if self.expected_warning != convert_to_unix_line_endings(status.stderr.decode('utf8')):
return False, ('Incorrect stderr output:\n{act}\n' return False, ('Incorrect stderr output:\n{act}\n'
'Expected:\n{exp}'.format( 'Expected:\n{exp}'.format(
act=status.stderr, exp=self.expected_warning)) act=status.stderr, exp=self.expected_warning))
@ -559,16 +562,16 @@ class StdoutMatch(SpirvTest):
if not status.stdout: if not status.stdout:
return False, 'Expected something on stdout' return False, 'Expected something on stdout'
elif type(self.expected_stdout) == str: elif type(self.expected_stdout) == str:
if self.expected_stdout != convert_to_unix_line_endings(status.stdout): if self.expected_stdout != convert_to_unix_line_endings(status.stdout.decode('utf8')):
return False, ('Incorrect stdout output:\n{ac}\n' return False, ('Incorrect stdout output:\n{ac}\n'
'Expected:\n{ex}'.format( 'Expected:\n{ex}'.format(
ac=status.stdout, ex=self.expected_stdout)) ac=status.stdout, ex=self.expected_stdout))
else: else:
if not self.expected_stdout.search( converted = convert_to_unix_line_endings(status.stdout.decode('utf8'))
convert_to_unix_line_endings(status.stdout)): if not self.expected_stdout.search(converted):
return False, ('Incorrect stdout output:\n{ac}\n' return False, ('Incorrect stdout output:\n{ac}\n'
'Expected to match regex:\n{ex}'.format( 'Expected to match regex:\n{ex}'.format(
ac=status.stdout, ex=self.expected_stdout.pattern)) ac=status.stdout.decode('utf8'), ex=self.expected_stdout.pattern))
return True, '' return True, ''
@ -593,13 +596,13 @@ class StderrMatch(SpirvTest):
if not status.stderr: if not status.stderr:
return False, 'Expected something on stderr' return False, 'Expected something on stderr'
elif type(self.expected_stderr) == str: elif type(self.expected_stderr) == str:
if self.expected_stderr != convert_to_unix_line_endings(status.stderr): if self.expected_stderr != convert_to_unix_line_endings(status.stderr.decode('utf8')):
return False, ('Incorrect stderr output:\n{ac}\n' return False, ('Incorrect stderr output:\n{ac}\n'
'Expected:\n{ex}'.format( 'Expected:\n{ex}'.format(
ac=status.stderr, ex=self.expected_stderr)) ac=status.stderr, ex=self.expected_stderr))
else: else:
if not self.expected_stderr.search( if not self.expected_stderr.search(
convert_to_unix_line_endings(status.stderr)): convert_to_unix_line_endings(status.stderr.decode('utf8'))):
return False, ('Incorrect stderr output:\n{ac}\n' return False, ('Incorrect stderr output:\n{ac}\n'
'Expected to match regex:\n{ex}'.format( 'Expected to match regex:\n{ex}'.format(
ac=status.stderr, ex=self.expected_stderr.pattern)) ac=status.stderr, ex=self.expected_stderr.pattern))
@ -664,7 +667,7 @@ class ExecutedListOfPasses(SpirvTest):
# Collect all the output lines containing a pass name. # Collect all the output lines containing a pass name.
pass_names = [] pass_names = []
pass_name_re = re.compile(r'.*IR before pass (?P<pass_name>[\S]+)') pass_name_re = re.compile(r'.*IR before pass (?P<pass_name>[\S]+)')
for line in status.stderr.splitlines(): for line in status.stderr.decode('utf8').splitlines():
match = pass_name_re.match(line) match = pass_name_re.match(line)
if match: if match:
pass_names.append(match.group('pass_name')) pass_names.append(match.group('pass_name'))