diff --git a/bsp/abstract-machine/.gitignore b/bsp/abstract-machine/.gitignore index 27ab723..655483d 100644 --- a/bsp/abstract-machine/.gitignore +++ b/bsp/abstract-machine/.gitignore @@ -1,2 +1,3 @@ rtconfig.h files.mk +am-apps.mk diff --git a/bsp/abstract-machine/Makefile b/bsp/abstract-machine/Makefile index 2479062..fde621b 100644 --- a/bsp/abstract-machine/Makefile +++ b/bsp/abstract-machine/Makefile @@ -9,6 +9,7 @@ CFLAGS += -DHAVE_CCONFIG_H -D__RTTHREAD__ CFLAGS += -Wno-nonnull-compare LDFLAGS += -T extra.ld -include $(FILE_MK) +-include am-apps.mk include $(AM_HOME)/Makefile $(RTCONFIG_H): diff --git a/bsp/abstract-machine/integrate-am-apps.py b/bsp/abstract-machine/integrate-am-apps.py new file mode 100644 index 0000000..856f10b --- /dev/null +++ b/bsp/abstract-machine/integrate-am-apps.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 + +import sys, os, shutil +from pathlib import Path + +AM_HOME = Path(os.environ["AM_HOME"]) +AM_KERNELS_HOME = (AM_HOME / ".." / "am-kernels").resolve() +app_dir_list = AM_KERNELS_HOME / "kernels" / "hello" +ARCH = "native" +Path("build").mkdir(exist_ok=True) +am_app_mk_fp = open("am-apps.mk", "w") +am_app_c_fp = open("build/am-apps.c" , "w") + +def integrate(app_dir): + app_name = app_dir.name + os.system("make -j ARCH=" + ARCH + " -C " + str(app_dir)) + dst = Path("build") / ARCH / "am-apps" / app_name + dst.mkdir(parents=True, exist_ok=True) + shutil.copytree(app_dir / "build" / ARCH / "", dst, dirs_exist_ok=True) + objs = dst.rglob("*.o") + for obj in objs: + os.system("objcopy --prefix-symbols=__am_" + app_name + "_ " + str(obj)) + am_app_mk_fp.write("SRCS += " + str(obj.relative_to("build/" + ARCH)) + "\n") + am_app_c_fp.write(f"""extern int __am_{app_name}_main(const char *); +static void am_{app_name}(int argc, char *argv[]) {{ + __am_{app_name}_main(argc >= 2 ? argv[1] : ""); +}} +MSH_CMD_EXPORT(am_{app_name}, AM {app_name});""") + +am_app_mk_fp.write("SRCS += build/am-apps.c\n") +am_app_c_fp.write("#include \n") +integrate(app_dir_list) +am_app_mk_fp.close() +am_app_c_fp.close()