From 39f0bcd9aff4851f91d851bd07f2078dc1891857 Mon Sep 17 00:00:00 2001 From: "Bobby R. Bruce" Date: Tue, 12 Sep 2023 14:51:59 -0700 Subject: [PATCH 1/3] python: Mimic Python 3's `-P` flag in gem5 Python 3's `-P` flag, when set, means `sys.path` is not prepended with potentially unsafe paths: https://docs.python.org/3/using/cmdline.html#cmdoption-P This patch allows gem5 to mimic this. This is necesssary when using `mypy.stubgen` as it expects the Python Interpreter to have the `-P` flag. Change-Id: I456c8001d3ee1e806190dc37142566d50d54cc90 --- src/python/m5/main.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/python/m5/main.py b/src/python/m5/main.py index e07e9562ab..3c418ba29b 100644 --- a/src/python/m5/main.py +++ b/src/python/m5/main.py @@ -193,6 +193,14 @@ def parse_options(): callback=collect_args, ) + option( + "-P", + action="store_true", + default=False, + help="Don't prepend the script directory to the system path. " + "Mimics Python 3's `-P` option.", + ) + option( "-s", action="store_true", @@ -601,7 +609,11 @@ def main(): sys.argv = ["-c"] + options.c[1] scope = {"__name__": "__m5_main__"} else: - sys.path = [os.path.dirname(sys.argv[0])] + sys.path + # If `-P` was used (`options.P == true`), don't prepend the script + # directory to the `sys.path`. This mimics Python 3's `-P` option + # (https://docs.python.org/3/using/cmdline.html#cmdoption-P). + if not options.P: + sys.path = [os.path.dirname(sys.argv[0])] + sys.path filename = sys.argv[0] filedata = open(filename, "r").read() filecode = compile(filedata, filename, "exec") From bceac5d951438a43e097be5ea26ab416130e8161 Mon Sep 17 00:00:00 2001 From: "Bobby R. Bruce" Date: Tue, 12 Sep 2023 15:17:50 -0700 Subject: [PATCH 2/3] util: Allow MyPy stubgen to aid Pylance IntelliSense Change-Id: I42fe177e5ae428afd0f23ea482b6af5b7d3ecaf9 --- requirements.txt | 1 + util/gem5-stubgen.py | 63 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 util/gem5-stubgen.py diff --git a/requirements.txt b/requirements.txt index 561cab79cf..c057a43b97 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ pre-commit==2.20.0 +mypy==1.5.1 diff --git a/util/gem5-stubgen.py b/util/gem5-stubgen.py new file mode 100644 index 0000000000..d003e2212e --- /dev/null +++ b/util/gem5-stubgen.py @@ -0,0 +1,63 @@ +# Copyright (c) 2023 The Regents of the University of California +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer; +# redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution; +# neither the name of the copyright holders nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from mypy.stubgen import generate_stubs, parse_options + +""" +This allows us to generate stubs for the modules in gem5. The output will be +a "typings" directory which can be used by Pylance (Python IntelliSense) to +infer typings in Visual Studio Code. + +Note: A "typings" directory in the root of the workspace is the default +location for Pylance to look for typings. This can be changed via +`python.analysis.stubPath` in "settings.json". + +Usage +===== + +```sh +pip3 install -r requirements.txt +scons build/ALL/gem5.opt -j$(nproc) +./build/ALL/gem5.opt util/gem5-stubgen.py +``` + +""" + +if __name__ == "__m5_main__": + import m5 + + # get a list of all modules exported by gem5 + modules = m5.__spec__.loader_state + + options = parse_options( + ("--module " + " --module ".join(modules)).split(" ") + + ["--output", "typings"] + ) + generate_stubs(options) + +if __name__ == "__main__": + print("Error: This script is meant to be run with the gem5 binary") + exit(1) From 133e4ed6369dd5f5069238777e82312c6b91ae0c Mon Sep 17 00:00:00 2001 From: "Bobby R. Bruce" Date: Tue, 12 Sep 2023 15:20:06 -0700 Subject: [PATCH 3/3] misc: Add "typings" directory to .gitignore This is used by Pylance IntelliSense to infer gem5 typing. See "util/gem5-stubgen.py" for generating this directory. Change-Id: Ie39762c718e5392f6194ff7c8238bd0cd677f486 --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 229a0d5ae9..8aaf08f076 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ configs/example/memcheck.cfg configs/dram/lowp_sweep.cfg .pyenv .vscode +typings