From 61b7268b2e7b83cd8c71e6f82e4495fcc07d15aa Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Tue, 17 Aug 2021 22:11:20 -0700 Subject: [PATCH] scons: Use an external script to generate param struct headers. Change-Id: I633537f2b7542350895e50fe79dd80c88a811a41 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/49424 Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power Tested-by: kokoro --- build_tools/sim_object_param_struct_hh.py | 50 +++++++++++++++++++++++ src/SConscript | 39 +++++------------- 2 files changed, 61 insertions(+), 28 deletions(-) create mode 100644 build_tools/sim_object_param_struct_hh.py 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 0000000000..0652ae5801 --- /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 c390b812f7..97214a4ebc 100644 --- a/src/SConscript +++ b/src/SConscript @@ -664,34 +664,17 @@ gem5py_env.Program(gem5py_m5, [ 'python/gem5py.cc' ] + m5_module_static) # 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'):