diff --git a/build_tools/sim_object_param_struct_hh.py b/build_tools/sim_object_param_struct_hh.py
new file mode 100644
index 0000000..0652ae5
--- /dev/null
+++ b/build_tools/sim_object_param_struct_hh.py
@@ -0,0 +1,50 @@
+# Copyright 2021 Google, Inc.
+#
+# 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.
+
+import argparse
+import importlib
+import os.path
+import sys
+
+import importer
+
+from code_formatter import code_formatter
+
+parser = argparse.ArgumentParser()
+parser.add_argument('modpath', help='module the simobject belongs to')
+parser.add_argument('param_hh', help='parameter header file to generate')
+
+args = parser.parse_args()
+
+basename = os.path.basename(args.param_hh)
+sim_object_name = os.path.splitext(basename)[0]
+
+importer.install()
+module = importlib.import_module(args.modpath)
+sim_object = getattr(module, sim_object_name)
+
+code = code_formatter()
+sim_object.cxx_param_decl(code)
+code.write(args.param_hh)
diff --git a/src/SConscript b/src/SConscript
index c390b81..97214a4 100644
--- a/src/SConscript
+++ b/src/SConscript
@@ -664,34 +664,17 @@
 
 # Generate all of the SimObject param C++ struct header files
 
-def createSimObjectParamStruct(target, source, env):
-    assert len(target) == 1 and len(source) == 1
-
-    name = source[0].get_text_contents()
-    obj = sim_objects[name]
-
-    code = code_formatter()
-    obj.cxx_param_decl(code)
-    code.write(target[0].abspath)
-
-params_hh_files = []
-for name,simobj in sorted(sim_objects.items()):
-    # If this simobject's source changes, we need to regenerate the header.
-    py_source = PySource.modules[simobj.__module__]
-    extra_deps = [ py_source.tnode ]
-
-    # Get the params for just this SimObject, excluding base classes.
-    params = simobj._params.local.values()
-    # Extract the parameters' c++ types.
-    types = sorted(map(lambda p: p.ptype.cxx_type, params))
-    # If any of these types have changed, we need to regenerate the header.
-    extra_deps.append(Value(types))
-
-    hh_file = File('params/%s.hh' % name)
-    params_hh_files.append(hh_file)
-    env.Command(hh_file, Value(name),
-                MakeAction(createSimObjectParamStruct, Transform("SO PARAM")))
-    env.Depends(hh_file, depends + extra_deps)
+for module, simobjs in sorted(SimObject.sim_objects.items()):
+    for simobj in simobjs:
+        gem5py_env.Command(f'params/{simobj}.hh',
+                [ Value(module), Value(simobj),
+                    "${GEM5PY_M5}", "${PARAMSTRUCT_PY}" ],
+                MakeAction('"${GEM5PY_M5}" "${PARAMSTRUCT_PY}" "${MODULE}" ' \
+                        '"${TARGET}"',
+                    Transform("SO Param", 2)),
+                PARAMSTRUCT_PY=build_tools.File(
+                    'sim_object_param_struct_hh.py'),
+                MODULE=module)
 
 # C++ parameter description files
 if GetOption('with_cxx_config'):
