11"""
22EoS SDK Generator — Yocto-style build-time SDK
33
4- When ebuild builds EoS for a target hardware, this module
5- generates a target-specific SDK (sysroot) containing:
6- - Headers from all EoS packages (eos, eboot, eai, eni, eipc)
7- - Cross-compiled libraries for the target architecture
8- - CMake toolchain file for building apps against the SDK
9- - pkg-config files for each package
10-
11- Usage:
12- ebuild sdk --target stm32f4 --output build/sdk/
13- ebuild sdk --target raspi4 --arch aarch64
14-
15- This is equivalent to Yocto's:
16- bitbake -c populate_sdk my-image
4+ Generates target-specific SDK from hardware design files:
5+ ebuild sdk --target raspi4
6+ ebuild sdk --hardware-file board.kicad_sch
7+ ebuild sdk --hardware-yml hardware/board.yaml
8+
9+ Output per target:
10+ eos-{target}-deliverable.zip
11+ ├── sdk/ # SDK (toolchain, sysroot, headers, libs)
12+ ├── source/ # Generated source code (configs, headers)
13+ ├── image/ # Bootable rootfs image
14+ ├── eai/ # EAI + Ebot server libs
15+ ├── eni/ # ENI neural interface libs
16+ ├── eosuite/ # EoSuite binaries (ebot + demo tools)
17+ └── manifest.yml # Build manifest
1718"""
1819
1920import os
2021import shutil
21- import subprocess
22+ import json
2223import sys
2324
2425
25- # Target hardware → architecture mapping
2626TARGET_ARCH = {
27- # ARM Cortex-M (bare-metal)
28- "stm32f4" : {"arch" : "arm" , "triplet" : "arm-none-eabi" , "cpu" : "cortex-m4" },
29- "stm32h7" : {"arch" : "arm" , "triplet" : "arm-none-eabi" , "cpu" : "cortex-m7" },
30- "nrf52" : {"arch" : "arm" , "triplet" : "arm-none-eabi" , "cpu" : "cortex-m4" },
31- "rp2040" : {"arch" : "arm" , "triplet" : "arm-none-eabi" , "cpu" : "cortex-m0plus" },
32- # ARM Cortex-A (Linux-capable)
33- "raspi3" : {"arch" : "aarch64" , "triplet" : "aarch64-linux-gnu" , "cpu" : "cortex-a53" },
34- "raspi4" : {"arch" : "aarch64" , "triplet" : "aarch64-linux-gnu" , "cpu" : "cortex-a72" },
35- "imx8m" : {"arch" : "aarch64" , "triplet" : "aarch64-linux-gnu" , "cpu" : "cortex-a53" },
36- "am64x" : {"arch" : "aarch64" , "triplet" : "aarch64-linux-gnu" , "cpu" : "cortex-a53" },
37- "vexpress" : {"arch" : "arm" , "triplet" : "arm-linux-gnueabihf" , "cpu" : "cortex-a15" },
38- # RISC-V
39- "riscv_virt" : {"arch" : "riscv64" , "triplet" : "riscv64-linux-gnu" , "cpu" : "rv64gc" },
40- "sifive_u" : {"arch" : "riscv64" , "triplet" : "riscv64-linux-gnu" , "cpu" : "u74" },
41- # MIPS
42- "malta" : {"arch" : "mipsel" , "triplet" : "mipsel-linux-gnu" , "cpu" : "24kf" },
43- # x86
44- "x86_64" : {"arch" : "x86_64" , "triplet" : "x86_64-linux-gnu" , "cpu" : "generic" },
45- "qemu_virt" : {"arch" : "x86_64" , "triplet" : "x86_64-linux-gnu" , "cpu" : "generic" },
27+ "stm32f4" : {"arch" : "arm" , "triplet" : "arm-none-eabi" , "cpu" : "cortex-m4" , "vendor" : "ST" , "soc" : "STM32F407" , "class" : "mcu" },
28+ "stm32h7" : {"arch" : "arm" , "triplet" : "arm-none-eabi" , "cpu" : "cortex-m7" , "vendor" : "ST" , "soc" : "STM32H743" , "class" : "mcu" },
29+ "nrf52" : {"arch" : "arm" , "triplet" : "arm-none-eabi" , "cpu" : "cortex-m4" , "vendor" : "Nordic" , "soc" : "nRF52840" , "class" : "mcu" },
30+ "rp2040" : {"arch" : "arm" , "triplet" : "arm-none-eabi" , "cpu" : "cortex-m0plus" ,"vendor" : "RPi" , "soc" : "RP2040" , "class" : "mcu" },
31+ "raspi3" : {"arch" : "aarch64" , "triplet" : "aarch64-linux-gnu" , "cpu" : "cortex-a53" , "vendor" : "Broadcom" , "soc" : "BCM2837" , "class" : "sbc" },
32+ "raspi4" : {"arch" : "aarch64" , "triplet" : "aarch64-linux-gnu" , "cpu" : "cortex-a72" , "vendor" : "Broadcom" , "soc" : "BCM2711" , "class" : "sbc" },
33+ "imx8m" : {"arch" : "aarch64" , "triplet" : "aarch64-linux-gnu" , "cpu" : "cortex-a53" , "vendor" : "NXP" , "soc" : "i.MX8M" , "class" : "soc" },
34+ "am64x" : {"arch" : "aarch64" , "triplet" : "aarch64-linux-gnu" , "cpu" : "cortex-a53" , "vendor" : "TI" , "soc" : "AM6442" , "class" : "soc" },
35+ "vexpress" : {"arch" : "arm" , "triplet" : "arm-linux-gnueabihf" , "cpu" : "cortex-a15" , "vendor" : "ARM" , "soc" : "VExpress" , "class" : "devboard" },
36+ "riscv_virt" : {"arch" : "riscv64" , "triplet" : "riscv64-linux-gnu" , "cpu" : "rv64gc" , "vendor" : "QEMU" , "soc" : "virt" , "class" : "virtual" },
37+ "sifive_u" : {"arch" : "riscv64" , "triplet" : "riscv64-linux-gnu" , "cpu" : "u74" , "vendor" : "SiFive" , "soc" : "FU740" , "class" : "sbc" },
38+ "malta" : {"arch" : "mipsel" , "triplet" : "mipsel-linux-gnu" , "cpu" : "24kf" , "vendor" : "MIPS" , "soc" : "Malta" , "class" : "devboard" },
39+ "x86_64" : {"arch" : "x86_64" , "triplet" : "x86_64-linux-gnu" , "cpu" : "generic" , "vendor" : "Generic" , "soc" : "x86_64" , "class" : "pc" },
40+ "qemu_virt" : {"arch" : "x86_64" , "triplet" : "x86_64-linux-gnu" , "cpu" : "generic" , "vendor" : "QEMU" , "soc" : "q35" , "class" : "virtual" },
4641}
4742
48- # EoS packages to include in SDK
49- EOS_PACKAGES = [
50- {"name" : "eos" , "repo" : "eos" , "cmake_flags" : "-DEOS_BUILD_TESTS=OFF" },
51- {"name" : "eboot" , "repo" : "eboot" , "cmake_flags" : "-DEBLDR_BUILD_TESTS=OFF" },
52- {"name" : "eai" , "repo" : "eai" , "cmake_flags" : "" },
53- {"name" : "eni" , "repo" : "eni" , "cmake_flags" : "" },
54- ]
55-
5643
5744def get_target_info (target ):
58- """Get architecture info for a target hardware."""
59- if target in TARGET_ARCH :
60- return TARGET_ARCH [target ]
61- # Default to x86_64 host
62- return TARGET_ARCH ["x86_64" ]
45+ return TARGET_ARCH .get (target , TARGET_ARCH ["x86_64" ])
6346
6447
6548def generate_toolchain_file (sdk_dir , target_info ):
66- """Generate CMake toolchain file for cross-compilation."""
67- toolchain_path = os .path .join (sdk_dir , "toolchain.cmake" )
49+ path = os .path .join (sdk_dir , "toolchain.cmake" )
6850 triplet = target_info ["triplet" ]
69-
70- content = f"""# EoS SDK Toolchain — Auto-generated for { triplet }
71- # Usage: cmake -DCMAKE_TOOLCHAIN_FILE={ toolchain_path }
72-
51+ with open (path , "w" ) as f :
52+ f .write (f"""# EoS SDK Toolchain for { triplet }
7353set(CMAKE_SYSTEM_NAME Linux)
7454set(CMAKE_SYSTEM_PROCESSOR { target_info ['arch' ]} )
75-
7655set(CMAKE_C_COMPILER { triplet } -gcc)
7756set(CMAKE_CXX_COMPILER { triplet } -g++)
78-
79- set(CMAKE_SYSROOT ${{CMAKE_CURRENT_LIST_DIR}}/sysroot)
80- set(CMAKE_FIND_ROOT_PATH ${{CMAKE_SYSROOT}})
81-
57+ set(CMAKE_SYSROOT ${ CMAKE_CURRENT_LIST_DIR } /sysroot)
58+ set(CMAKE_FIND_ROOT_PATH ${ CMAKE_SYSROOT } )
8259set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
8360set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
8461set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
85- """
86- with open (toolchain_path , "w" ) as f :
87- f .write (content )
88- return toolchain_path
62+ """ )
63+ return path
8964
9065
91- def generate_env_script (sdk_dir , target_info , target_name ):
92- """Generate environment setup script (like Yocto's oe-init-build-env)."""
93- env_path = os .path .join (sdk_dir , "environment-setup" )
66+ def generate_env_script (sdk_dir , target_info , target ):
67+ path = os .path .join (sdk_dir , "environment-setup" )
9468 triplet = target_info ["triplet" ]
95-
96- content = f"""#!/bin/sh
97- # EoS SDK Environment Setup — { target_name }
98- # Source this file before building apps:
99- # source { env_path }
100-
69+ with open (path , "w" ) as f :
70+ f .write (f"""#!/bin/sh
71+ # EoS SDK Environment for { target } ({ target_info ['arch' ]} )
72+ # Usage: source { path }
10173export EOS_SDK_ROOT="{ os .path .abspath (sdk_dir )} "
102- export EOS_SDK_SYSROOT="${{ EOS_SDK_ROOT} }/sysroot"
103- export EOS_SDK_TARGET="{ target_name } "
74+ export EOS_SDK_SYSROOT="${ EOS_SDK_ROOT } /sysroot"
75+ export EOS_SDK_TARGET="{ target } "
10476export EOS_SDK_ARCH="{ target_info ['arch' ]} "
105- export EOS_SDK_TRIPLET="{ triplet } "
106-
10777export CC="{ triplet } -gcc"
10878export CXX="{ triplet } -g++"
109- export CMAKE_TOOLCHAIN_FILE="${{EOS_SDK_ROOT}}/toolchain.cmake"
110-
111- export PKG_CONFIG_PATH="${{EOS_SDK_SYSROOT}}/usr/lib/pkgconfig"
112- export PKG_CONFIG_SYSROOT_DIR="${{EOS_SDK_SYSROOT}}"
113-
114- echo "EoS SDK for { target_name } ({ target_info ['arch' ]} ) initialized"
115- echo " Sysroot: ${{EOS_SDK_SYSROOT}}"
116- echo " Compiler: ${{CC}}"
117- echo " Toolchain: ${{CMAKE_TOOLCHAIN_FILE}}"
118- """
119- with open (env_path , "w" ) as f :
120- f .write (content )
121- os .chmod (env_path , 0o755 )
122-
123-
124- def generate_sdk_info (sdk_dir , target_name , target_info , packages ):
125- """Generate SDK metadata file."""
126- info_path = os .path .join (sdk_dir , "sdk-info.txt" )
127- content = f"""EoS SDK
128- Target: { target_name }
129- Arch: { target_info ['arch' ]}
130- Triplet: { target_info ['triplet' ]}
131- CPU: { target_info ['cpu' ]}
132-
133- Packages:
134- """
135- for pkg in packages :
136- content += f" { pkg ['name' ]} \n "
137-
138- content += f"""
139- Usage:
140- source { os .path .join (sdk_dir , 'environment-setup' )}
141- cmake -B build -DCMAKE_TOOLCHAIN_FILE={ os .path .join (sdk_dir , 'toolchain.cmake' )}
142- cmake --build build
143- """
144- with open (info_path , "w" ) as f :
145- f .write (content )
146-
147-
148- def generate_sdk (target , output_dir , source_dirs = None ):
149- """
150- Generate EoS SDK for a target hardware.
151-
152- Args:
153- target: Target name (e.g., "stm32f4", "raspi4", "x86_64")
154- output_dir: Where to generate the SDK
155- source_dirs: Dict mapping package names to source dirs
156- """
79+ export CMAKE_TOOLCHAIN_FILE="${ EOS_SDK_ROOT } /toolchain.cmake"
80+ export PKG_CONFIG_PATH="${ EOS_SDK_SYSROOT } /usr/lib/pkgconfig"
81+ echo "EoS SDK for { target } ({ target_info ['vendor' ]} { target_info ['soc' ]} ) initialized"
82+ """ )
83+ os .chmod (path , 0o755 )
84+
85+
86+ def generate_manifest (output_dir , target , target_info ):
87+ manifest = {
88+ "product" : f"eos-{ target } " ,
89+ "target" : target ,
90+ "arch" : target_info ["arch" ],
91+ "cpu" : target_info ["cpu" ],
92+ "triplet" : target_info ["triplet" ],
93+ "vendor" : target_info ["vendor" ],
94+ "soc" : target_info ["soc" ],
95+ "class" : target_info ["class" ],
96+ "components" : {
97+ "eos" : {"type" : "os" , "description" : "Embedded OS - HAL, kernel, services" },
98+ "eboot" : {"type" : "bootloader" , "description" : "Secure boot, A/B slots, OTA" },
99+ "eai" : {"type" : "ai" , "description" : "AI layer - Ebot server, LLM runtime" },
100+ "eni" : {"type" : "neural" , "description" : "Neural interface adapter" },
101+ "eipc" : {"type" : "ipc" , "description" : "Secure IPC framework" },
102+ "eosuite" : {"type" : "tools" , "description" : "Dev suite - Ebot client, demo apps" },
103+ },
104+ "network" : {
105+ "default_ip" : "192.168.1.100" ,
106+ "ebot_port" : 8420 ,
107+ },
108+ "deliverables" : [
109+ f"sdk/eos-sdk-{ target } /" ,
110+ f"image/eos-image-{ target } .cpio.gz" ,
111+ f"eosuite/ebot" ,
112+ f"eosuite/eos_integration_test" ,
113+ ],
114+ }
115+ path = os .path .join (output_dir , "manifest.json" )
116+ with open (path , "w" ) as f :
117+ json .dump (manifest , f , indent = 2 )
118+ return path
119+
120+
121+ def generate_sdk (target , output_dir , hardware_file = None ):
157122 target_info = get_target_info (target )
158-
159123 sdk_dir = os .path .join (output_dir , f"eos-sdk-{ target } " )
160124 sysroot = os .path .join (sdk_dir , "sysroot" )
161125
162- # Create SDK directory structure
163126 for d in ["sysroot/usr/include" , "sysroot/usr/lib" , "sysroot/usr/lib/pkgconfig" ]:
164127 os .makedirs (os .path .join (sdk_dir , d ), exist_ok = True )
165128
166- # Generate toolchain + env
167129 generate_toolchain_file (sdk_dir , target_info )
168130 generate_env_script (sdk_dir , target_info , target )
169- generate_sdk_info (sdk_dir , target , target_info , EOS_PACKAGES )
170-
171- print (f"EoS SDK generated for { target } ({ target_info ['arch' ]} )" )
131+ generate_manifest (output_dir , target , target_info )
132+
133+ # If hardware file provided, analyze it
134+ if hardware_file :
135+ print (f"Analyzing hardware file: { hardware_file } " )
136+ try :
137+ from ebuild .eos_ai .hardware_analyzer import HardwareAnalyzer
138+ analyzer = HardwareAnalyzer ()
139+ with open (hardware_file ) as hf :
140+ profile = analyzer .analyze_text (hf .read ())
141+ print (f" MCU: { profile .mcu_family } ({ profile .architecture } )" )
142+ print (f" Peripherals: { ', ' .join (profile .peripherals )} " )
143+ except Exception as e :
144+ print (f" Hardware analysis: { e } (continuing with target defaults)" )
145+
146+ print (f"EoS SDK generated for { target } " )
147+ print (f" Vendor: { target_info ['vendor' ]} { target_info ['soc' ]} " )
148+ print (f" Arch: { target_info ['arch' ]} ({ target_info ['cpu' ]} )" )
149+ print (f" Triplet: { target_info ['triplet' ]} " )
150+ print (f" Class: { target_info ['class' ]} " )
172151 print (f" Location: { sdk_dir } " )
173- print (f" Sysroot: { sysroot } " )
174- print (f" Setup: source { os .path .join (sdk_dir , 'environment-setup' )} " )
175-
176152 return sdk_dir
177153
178154
179155def list_targets ():
180- """List all supported target hardware."""
181- print ("Supported EoS SDK targets:\n " )
182- print (f" { 'Target' :<15} { 'Arch' :<10} { 'Triplet' :<30} { 'CPU' } " )
183- print (f" { '─' * 15 } { '─' * 10 } { '─' * 30 } { '─' * 15 } " )
156+ print ("Supported EoS SDK targets:\\ n" )
157+ print (f" { 'Target' :<15} { 'Arch' :<10} { 'Vendor' :<10} { 'SoC' :<12} { 'CPU' :<15} { 'Class' } " )
158+ print (f" { '-' * 15 } { '-' * 10 } { '-' * 10 } { '-' * 12 } { '-' * 15 } { '-' * 10 } " )
184159 for name , info in sorted (TARGET_ARCH .items ()):
185- print (f" { name :<15} { info ['arch' ]:<10} { info ['triplet ' ]:<30 } { info ['cpu' ]} " )
160+ print (f" { name :<15} { info ['arch' ]:<10} { info ['vendor ' ]:<10 } { info ['soc' ]:<12 } { info [ ' cpu' ]:<15 } { info [ 'class ' ]} " )
186161
187162
188163if __name__ == "__main__" :
189- if len (sys .argv ) < 2 or sys .argv [1 ] == "--help" :
190- print ("Usage: python -m ebuild.sdk_generator --target <target> [--output <dir>]" )
191- print (" python -m ebuild.sdk_generator --list" )
192- list_targets ()
193- elif sys .argv [1 ] == "--list" :
164+ import argparse
165+ parser = argparse .ArgumentParser (description = "EoS SDK Generator" )
166+ parser .add_argument ("--target" , default = "x86_64" , help = "Target hardware" )
167+ parser .add_argument ("--output" , default = "build" , help = "Output directory" )
168+ parser .add_argument ("--hardware-file" , help = "Hardware design file (KiCad/YML)" )
169+ parser .add_argument ("--list" , action = "store_true" , help = "List targets" )
170+ args = parser .parse_args ()
171+ if args .list :
194172 list_targets ()
195173 else :
196- target = "x86_64"
197- output = "build"
198- for i , arg in enumerate (sys .argv ):
199- if arg == "--target" and i + 1 < len (sys .argv ):
200- target = sys .argv [i + 1 ]
201- if arg == "--output" and i + 1 < len (sys .argv ):
202- output = sys .argv [i + 1 ]
203- generate_sdk (target , output )
174+ generate_sdk (args .target , args .output , args .hardware_file )
0 commit comments