about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--flake.nix40
-rw-r--r--src/focaccia/tools/_qemu_tool.py4
-rwxr-xr-xsrc/focaccia/tools/validate_qemu.py26
3 files changed, 44 insertions, 26 deletions
diff --git a/flake.nix b/flake.nix
index b199e83..83bb5a1 100644
--- a/flake.nix
+++ b/flake.nix
@@ -129,6 +129,7 @@
 
 			focaccia = super.focaccia.overrideAttrs (old: {
 				nativeBuildInputs = (old.nativeBuildInputs or []) ++
+									[ pkgs.lldb ] ++
 									self.resolveBuildSystem { editables = []; };
 
 				src = pkgs.lib.fileset.toSource {
@@ -198,11 +199,22 @@
 
 			export REPO_ROOT=$(git rev-parse --show-toplevel)
 		'';
+
+		gdbInternal = pkgs.gdb.override { python3 = python; };
 	in rec {
 		# Default package just builds Focaccia
 		packages = rec {
-			focaccia = pythonEnv;
-			dev = pythonDevEnv;
+			focaccia = pythonEnv.overrideAttrs (old: {
+				propagatedBuildInputs = (old.propagatedBuildInputs or []) ++ [ pkgs.lldb ];
+			});
+
+			dev = pythonDevEnv.overrideAttrs (old: {
+				propagatedBuildInputs = (old.propagatedBuildInputs or []) ++ [ 
+					pkgs.uv
+					pkgs.lldb 
+					gdbInternal # TODO keep this internal somehow
+				];
+			});
 
 			default = focaccia;
 		};
@@ -211,22 +223,27 @@
 		apps = {
 			default = {
 				type = "app";
-				program = "${packages.default}/bin/focaccia";
+				program = "${packages.focaccia}/bin/focaccia";
 			};
 
 			convert-log = {
 				type = "app";
-				program = "${packages.default}/bin/convert";
+				program = "${packages.focaccia}/bin/convert";
 			};
 
 			capture-transforms = {
 				type = "app";
-				program = "${packages.default}/bin/capture-transforms";
+				program = "${packages.focaccia}/bin/capture-transforms";
 			};
 
 			validate-qemu = {
 				type = "app";
-				program = "${packages.default}/bin/validate-qemu";
+				# program = "${packages.focaccia}/bin/validate-qemu";
+				program = let
+					wrapper = pkgs.writeShellScriptBin "validate-qemu" ''
+						exec ${packages.focaccia}/bin/validate-qemu --gdb "${gdbInternal}/bin/gdb" "$@"
+					'';
+				in "${wrapper}/bin/validate-qemu";
 			};
 
 			# Useful for synchronize the uv lockfile
@@ -242,12 +259,7 @@
 		# Developer shell that includes Focaccia and QEMU
 		devShells = {
 			default = pkgs.mkShell {
-				packages = [
-					packages.dev
-					pkgs.uv
-					pkgs.gdb
-					pkgs.git
-				];
+				packages = [ packages.dev ];
 
 				env = uvEnv;
 				shellHook = uvShellHook;
@@ -256,8 +268,6 @@
 			glibc = pkgs.mkShell {
 				packages = [
 					packages.dev
-					pkgs.uv
-					pkgs.gdb
 					pkgs.gcc
 					pkgs.glibc.all
 				];
@@ -269,8 +279,6 @@
 			musl = pkgs.mkShell {
 				packages = [
 					packages.dev
-					pkgs.uv
-					pkgs.gdb
 					musl-pkgs.gcc
 					musl-pkgs.pkg-config
 				];
diff --git a/src/focaccia/tools/_qemu_tool.py b/src/focaccia/tools/_qemu_tool.py
index b365d39..fb23844 100644
--- a/src/focaccia/tools/_qemu_tool.py
+++ b/src/focaccia/tools/_qemu_tool.py
@@ -2,7 +2,7 @@
 
     gdb -n --batch -x qemu_tool.py
 
-But please use `tools/verify_qemu.py` instead because we have some more setup
+But please use `tools/validate_qemu.py` instead because we have some more setup
 work to do.
 """
 
@@ -18,7 +18,7 @@ from focaccia.symbolic import SymbolicTransform, eval_symbol, ExprMem
 from focaccia.trace import Trace, TraceEnvironment
 from focaccia.utils import print_result
 
-from verify_qemu import make_argparser, verbosity
+from validate_qemu import make_argparser, verbosity
 
 class GDBProgramState(ReadableProgramState):
     from focaccia.arch import aarch64, x86
diff --git a/src/focaccia/tools/validate_qemu.py b/src/focaccia/tools/validate_qemu.py
index f5d0bb2..b59809e 100755
--- a/src/focaccia/tools/validate_qemu.py
+++ b/src/focaccia/tools/validate_qemu.py
@@ -6,20 +6,20 @@ Spawn GDB, connect to QEMU's GDB server, and read test states from that.
 We need two scripts (this one and the primary `qemu_tool.py`) because we can't
 pass arguments to scripts executed via `gdb -x <script>`.
 
-This script (`verify_qemu.py`) is the one the user interfaces with. It
+This script (`validate_qemu.py`) is the one the user interfaces with. It
 eventually calls `execv` to spawn a GDB process that calls the main
-`qemu_tool.py` script; `python verify_qemu.py` essentially behaves as if
+`qemu_tool.py` script; `python validate_qemu.py` essentially behaves as if
 something like `gdb --batch -x qemu_tool.py` were executed instead. Before it
 starts GDB, though, it parses command line arguments and applies some weird but
 necessary logic to pass them to `qemu_tool.py`.
 """
 
-import argparse
 import os
-import subprocess
 import sys
+import argparse
+import sysconfig
+import subprocess
 
-import focaccia
 from focaccia.compare import ErrorTypes
 
 verbosity = {
@@ -77,8 +77,8 @@ def main():
                       help='GDB binary to invoke.')
     args = prog.parse_args()
 
-    filepath = focaccia.__file__
-    qemu_tool_path = os.path.join(os.path.dirname(filepath), '_qemu_tool.py')
+    script_dirname = os.path.dirname(__file__)
+    qemu_tool_path = os.path.join(script_dirname, '_qemu_tool.py')
 
     # We have to remove all arguments we don't want to pass to the qemu tool
     # manually here. Not nice, but what can you do..
@@ -92,6 +92,14 @@ def main():
     argv_str = f'[{", ".join(quoted(a) for a in argv)}]'
     path_str = f'[{", ".join(quoted(s) for s in sys.path)}]'
 
+    paths = sysconfig.get_paths()
+    candidates = [paths["purelib"], paths["platlib"]]
+    entries = [p for p in candidates if p and os.path.isdir(p)]
+    venv_site = entries[0]
+    env = os.environ.copy()
+    env["PYTHONPATH"] = ','.join([script_dirname, venv_site])
+
+    print(f"GDB started with Python Path: {env['PYTHONPATH']}")
     gdb_cmd = [
         args.gdb,
         '-nx',  # Don't parse any .gdbinits
@@ -99,9 +107,11 @@ def main():
         '-ex', f'py import sys',
         '-ex', f'py sys.argv = {argv_str}',
         '-ex', f'py sys.path = {path_str}',
+        "-ex", f"py import site; site.addsitedir({venv_site!r})",
+        "-ex", f"py import site; site.addsitedir({script_dirname!r})",
         '-x', qemu_tool_path
     ]
-    proc = subprocess.Popen(gdb_cmd)
+    proc = subprocess.Popen(gdb_cmd, env=env)
 
     ret = proc.wait()
     exit(ret)