python,scons: Move readCommand and compareVersions into site_scons.

These functions are only used by scons, so it makes sense to move them
to site_scons/gem5_scons/util.py.

Change-Id: If2b3995f208cb71adf3c59aac4eabe378c47f94f
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/41599
Reviewed-by: Gabe Black <gabe.black@gmail.com>
Maintainer: Gabe Black <gabe.black@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Gabe Black
2021-02-18 03:03:34 -08:00
parent 016440c58e
commit 2e27ed2351
9 changed files with 64 additions and 70 deletions

View File

@@ -38,6 +38,8 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import itertools
import re
import sys
import SCons.Script
@@ -50,3 +52,60 @@ def ignore_style():
def get_termcap():
return m5.util.terminal.get_termcap(SCons.Script.GetOption('use_colors'))
def readCommand(cmd, **kwargs):
"""
run the command cmd, read the results and return them
this is sorta like `cmd` in shell
:param cmd: command to run with Popen
:type cmd: string, list
:returns: command stdout
:rtype: string
"""
from subprocess import Popen, PIPE, STDOUT
if isinstance(cmd, str):
cmd = cmd.split()
no_exception = 'exception' in kwargs
exception = kwargs.pop('exception', None)
kwargs.setdefault('shell', False)
kwargs.setdefault('stdout', PIPE)
kwargs.setdefault('stderr', STDOUT)
kwargs.setdefault('close_fds', True)
try:
subp = Popen(cmd, **kwargs)
except Exception as e:
if no_exception:
return -1, exception
raise
output = subp.communicate()[0].decode('utf-8')
return output
def compareVersions(v1, v2):
"""helper function: compare arrays or strings of version numbers.
E.g., compare_version((1,3,25), (1,4,1)')
returns -1, 0, 1 if v1 is <, ==, > v2
"""
def make_version_list(v):
if isinstance(v, (list,tuple)):
return v
elif isinstance(v, str):
return list(map(lambda x: int(re.match('\d+', x).group()),
v.split('.')))
else:
raise TypeError()
v1 = make_version_list(v1)
v2 = make_version_list(v2)
# Compare corresponding elements of lists
# The shorter list is filled with 0 till the lists have the same length
for n1,n2 in itertools.zip_longest(v1, v2, fillvalue=0):
if n1 < n2: return -1
if n1 > n2: return 1
return 0

View File

@@ -42,7 +42,6 @@ import os
import sys
import gem5_scons.util
from m5.util import readCommand
git_style_message = """
You're missing the gem5 style or commit message hook. These hooks help
@@ -52,7 +51,7 @@ Press enter to continue, or ctrl-c to abort: """
def install_style_hooks(env):
try:
gitdir = env.Dir(readCommand(
gitdir = env.Dir(gem5_scons.util.readCommand(
["git", "rev-parse", "--git-dir"]).strip("\n"))
except Exception as e:
print("Warning: Failed to find git repo directory: %s" % e)