diff --git a/.gitignore b/.gitignore index 9d50048ab954..916605791a4b 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,5 @@ build*/ cscope.* ncscope.* +# headers pack +header_pack.zip diff --git a/lmdk/include/headers_manifest.json b/lmdk/include/headers_manifest.json new file mode 100644 index 000000000000..534bddf84b3a --- /dev/null +++ b/lmdk/include/headers_manifest.json @@ -0,0 +1,23 @@ +[ + ["src", "include", "ipc4", "header.h"], + ["src", "include", "module","audio","audio_stream.h"], + ["src","include","module","audio","format.h"], + ["src","include","module","audio","sink_api.h"], + ["src","include","module","audio","source_api.h"], + ["src","include","module","iadk","adsp_error_code.h"], + ["src","include","module","ipc","stream.h"], + ["src","include","module","ipc4","base-config.h"], + ["src","include","module","module","api_ver.h"], + ["src","include","module","module","base.h"], + ["src","include","module","module","interface.h"], + ["src","include","sof","audio","ipc-config.h"], + ["src","include","sof","audio","module_adapter","library","native_system_service.h"], + ["src","include","sof","audio","module_adapter","module","generic.h"], + ["src","include","sof","audio","module_adapter","iadk","adsp_stddef.h"], + ["posix","include","sof","compiler_attributes.h"], + ["posix","include","sof","list.h"], + ["posix","include","rtos","string.h"], + ["src","include","user","trace.h"], + ["src","module","audio","sink_api.c"], + ["src","module","audio","source_api.c"] +] diff --git a/lmdk/modules/dummy/CMakeLists.txt b/lmdk/modules/dummy/CMakeLists.txt index 1ede12ca1445..b66374eee4be 100644 --- a/lmdk/modules/dummy/CMakeLists.txt +++ b/lmdk/modules/dummy/CMakeLists.txt @@ -4,3 +4,18 @@ target_sources(dummy PRIVATE dummy.c) set_target_properties(dummy PROPERTIES HPSRAM_ADDR "0xa06a1000" ) + +target_compile_definitions(dummy PRIVATE CONFIG_XTENSA=1 + CONFIG_IPC_MAJOR_4=1 + CONFIG_LIBRARY=1 + XCHAL_HAVE_HIFI3=1 + SOF_MODULE_API_PRIVATE=1) + +set(LMDK_DIR_INCLUDE ../../../lmdk/include) + +target_include_directories(dummy PRIVATE "${LMDK_DIR_INCLUDE}" + "${LMDK_DIR_INCLUDE}/src/include" + "${LMDK_DIR_INCLUDE}/src/include/sof/audio/module_adapter/iadk" + "${LMDK_DIR_INCLUDE}/posix/include" + "${LMDK_DIR_INCLUDE}/posix/include/sof" +) diff --git a/lmdk/scripts/header_pack.py b/lmdk/scripts/header_pack.py new file mode 100644 index 000000000000..7c2a3b1bab8d --- /dev/null +++ b/lmdk/scripts/header_pack.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: BSD-3-Clause + + +import json +import pathlib +import shutil + + +"""Headers for needs of lmdk are defined in + lmdk/include/headers_list.json""" + + +_SOF_TOP = pathlib.Path(__file__).parents[2].resolve() +LMDK_HEADERS = _SOF_TOP / "lmdk" / "include" / "headers_manifest.json" + + +def str_path_from_json(record): + """parsing json record to string""" + src = '' + for i in record: + src += i + src += "/" + return src[:-1] + + +def create_separate_headers(): + f = open(LMDK_HEADERS) + data = json.load(f) + + for i in data: + src = str_path_from_json(i) + p = pathlib.Path(_SOF_TOP, "lmdk", "include", "sof", src) + p.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(_SOF_TOP / src, _SOF_TOP / "lmdk" /"include" / "sof" / src) + f.close() + +""" -> to do +def validate_separate_headers(): + return 0""" + + +def create_headers_pack(): + """Creates pack of lmdk headers""" + create_separate_headers() + shutil.make_archive(_SOF_TOP / "lmdk" /"include" / "header_pack", "zip", _SOF_TOP / "lmdk" /"include" / "sof") + shutil.rmtree(_SOF_TOP / "lmdk" /"include" / "sof", ignore_errors=True) + return 0 + + +def main(): + create_headers_pack() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/lmdk/scripts/libraries_build.py b/lmdk/scripts/libraries_build.py new file mode 100644 index 000000000000..15b59cf98d28 --- /dev/null +++ b/lmdk/scripts/libraries_build.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: BSD-3-Clause + + +import pathlib +import dataclasses +from tools.utils import rmtree_if_exists, execute_command +import argparse +import platform as py_platform +import sys +import os +import warnings + +SOF_TOP = pathlib.Path(__file__).parents[3].resolve() +MIN_PYTHON_VERSION = 3, 8 +assert sys.version_info >= MIN_PYTHON_VERSION, \ + f"Python {MIN_PYTHON_VERSION} or above is required." + +"""Constant value resolves SOF_TOP directory as: "this script directory/.." """ +SOF_TOP = pathlib.Path(__file__).parents[1].resolve() +LMDK_BUILD_DIR = SOF_TOP / "../.." / "sof" / "lmdk" +RIMAGE_BUILD_DIR = SOF_TOP / "../.." /"build-rimage" + +if py_platform.system() == "Windows": + xtensa_tools_version_postfix = "-win32" +elif py_platform.system() == "Linux": + xtensa_tools_version_postfix = "-linux" +else: + xtensa_tools_version_postfix = "-unsupportedOS" + warnings.warn(f"Your operating system: {py_platform.system()} is not supported") + + +def build_libraries(LMDK_BUILD_DIR, RIMAGE_BUILD_DIR, args): + library_dir = LMDK_BUILD_DIR / "libraries" + """Cmake build""" + for lib in args.libraries: + library_cmake = library_dir / lib / "CMakeLists.txt" + if library_cmake.is_file(): + print(f"\nBuilding loadable module: " + lib) + lib_path = pathlib.Path(library_dir, lib, "build") + print(f"\nRemoving existing artifacts") + rmtree_if_exists(lib_path) + lib_path.mkdir(parents=True, exist_ok=True) + rimage_bin = RIMAGE_BUILD_DIR / "rimage.exe" + if not rimage_bin.is_file(): + rimage_bin = RIMAGE_BUILD_DIR / "rimage" + if args.key: + key = "-DSIGNING_KEY=" + args.key.__str__() + else: + key = "-DSIGNING_KEY=" + PlatformConfig.RIMAGE_KEY.__str__() + execute_command(["cmake", "-B", "build", "-G", "Ninja", + "-DRIMAGE_COMMAND="+str(rimage_bin), key], + cwd=library_dir/lib) + execute_command(["cmake", "--build", "build", "-v"], cwd=library_dir/lib) + + +def parse_args(): + parser = argparse.ArgumentParser(description='Building loadable modules using python scripts') + parser.add_argument("-k", "--key", type=pathlib.Path, required=False, + help="Path to a non-default rimage signing key.") + + parser.add_argument("-l", "--libraries", nargs="*", default=[], + help=""" Function for CMake building modules. We can build more then one module + just by adding more module names.""") + return parser.parse_args() + + +def main(): + args = parse_args() + + if args.libraries: + build_libraries(LMDK_BUILD_DIR, RIMAGE_BUILD_DIR, args) + + +if __name__ == "__main__": + main() diff --git a/lmdk/scripts/tools/__init__.py b/lmdk/scripts/tools/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/lmdk/scripts/tools/utils.py b/lmdk/scripts/tools/utils.py new file mode 100644 index 000000000000..8d76d65cfb6b --- /dev/null +++ b/lmdk/scripts/tools/utils.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: BSD-3-Clause + + +import shlex +import subprocess +import shutil +import os + + +def rmtree_if_exists(directory): + "This is different from ignore_errors=False because it deletes everything or nothing" + if os.path.exists(directory): + shutil.rmtree(directory) + + +def execute_command(*run_args, **run_kwargs): + """[summary] Provides wrapper for subprocess.run that prints + command executed when 'more verbose' verbosity level is set.""" + command_args = run_args[0] + + # If you really need the shell in some non-portable section then + # invoke subprocess.run() directly. + if run_kwargs.get('shell') or not isinstance(command_args, list): + raise RuntimeError("Do not rely on non-portable shell parsing") + + if not 'check' in run_kwargs: + run_kwargs['check'] = True + #pylint:disable=subprocess-run-check + + return subprocess.run(*run_args, **run_kwargs) diff --git a/src/include/module/module/base.h b/src/include/module/module/base.h index 8eb98dd13476..2fcc56230f72 100644 --- a/src/include/module/module/base.h +++ b/src/include/module/module/base.h @@ -15,6 +15,7 @@ #include "interface.h" #include "../ipc4/base-config.h" +#include #define module_get_private_data(mod) ((mod)->priv.private) #define module_set_private_data(mod, data) ((mod)->priv.private = data) @@ -54,7 +55,7 @@ struct module_data { * Below #ifdef is a temporary solution used until work on separating a common interface * for loadable modules is completed. */ -#ifdef SOF_MODULE_API_PRIVATE +#ifdef SOF_MONOLITHIC_BUILD enum module_state state; size_t new_cfg_size; /**< size of new module config data */ void *runtime_params; @@ -84,7 +85,7 @@ struct processing_module { * Below #ifdef is a temporary solution used until work on separating a common interface * for loadable modules is completed. */ -#ifdef SOF_MODULE_API_PRIVATE +#ifdef SOF_MONOLITHIC_BUILD struct sof_ipc_stream_params *stream_params; struct list_item sink_buffer_list; /* list of sink buffers to save produced output */ diff --git a/src/include/sof/audio/module_adapter/iadk/adsp_stddef.h b/src/include/sof/audio/module_adapter/iadk/adsp_stddef.h index 759a60b988de..df1e4a641a6d 100644 --- a/src/include/sof/audio/module_adapter/iadk/adsp_stddef.h +++ b/src/include/sof/audio/module_adapter/iadk/adsp_stddef.h @@ -9,8 +9,9 @@ #include #include #include +#ifndef SOF_MONOLITHIC_BUILD #include - +#endif /* SOF_MONOLITHIC_BUILD */ #ifdef __ZEPHYR__ #include #endif /* __ZEPHYR__ */ diff --git a/src/include/sof/audio/module_adapter/library/native_system_service.h b/src/include/sof/audio/module_adapter/library/native_system_service.h index 74f6a823192b..b7920eef812d 100644 --- a/src/include/sof/audio/module_adapter/library/native_system_service.h +++ b/src/include/sof/audio/module_adapter/library/native_system_service.h @@ -7,8 +7,9 @@ #define NATIVE_SYSTEM_SERVICE_H #include - +#ifndef SOF_MONOLITHIC_BUILD #include "logger.h" +#endif #include "adsp_stddef.h" #include diff --git a/src/include/sof/audio/module_adapter/module/generic.h b/src/include/sof/audio/module_adapter/module/generic.h index 0ddf9169e414..0bb6cb02d866 100644 --- a/src/include/sof/audio/module_adapter/module/generic.h +++ b/src/include/sof/audio/module_adapter/module/generic.h @@ -12,7 +12,9 @@ #ifndef __SOF_AUDIO_MODULE_GENERIC__ #define __SOF_AUDIO_MODULE_GENERIC__ - +#include +#include +#ifndef SOF_MONOLITHIC_BUILD #include #include #include @@ -30,8 +32,9 @@ #define IS_PROCESSING_MODE_SINK_SOURCE(mod) ((mod)->proc_type == MODULE_PROCESS_TYPE_SOURCE_SINK) #define MAX_BLOB_SIZE 8192 +#endif /* SOF_MONOLITHIC_BUILD */ #define MODULE_MAX_SOURCES 8 - +#ifndef SOF_MONOLITHIC_BUILD #define API_CALL(cd, cmd, sub_cmd, value, ret) \ do { \ ret = (cd)->api((cd)->self, \ @@ -87,7 +90,7 @@ UT_STATIC void sys_comp_module_##adapter##_init(void) \ } \ \ DECLARE_MODULE(sys_comp_module_##adapter##_init) - +#endif /* SOF_MONOLITHIC_BUILD */ /** * \enum module_state * \brief Module-specific states @@ -141,12 +144,13 @@ struct module_processing_data { void *out_buff; /**< A pointer to module output buffer. */ }; +#ifndef SOF_MONOLITHIC_BUILD /* * Definition used to extend structure definitions to include fields for exclusive use by SOF. * This is a temporary solution used until work on separating a common interface for loadable * modules is completed. */ -#define SOF_MODULE_API_PRIVATE +#define SOF_MONOLITHIC_BUILD #include @@ -320,4 +324,5 @@ void module_adapter_set_params(struct processing_module *mod, struct sof_ipc_str int module_adapter_set_state(struct processing_module *mod, struct comp_dev *dev, int cmd); int module_adapter_sink_src_prepare(struct comp_dev *dev); +#endif /* SOF_MONOLITHIC_BUILD */ #endif /* __SOF_AUDIO_MODULE_GENERIC__ */