1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
|
# STANDARD NEKERNEL FRAMEWORK SPECIFICATION
## Overview
The NeKernel framework system (`.fwrk`) provides a standardized structure for creating modular, reusable libraries and components. Frameworks are self-contained packages that include headers, source code, metadata, and configuration for compilation and deployment within the NeKernel ecosystem.
## Framework Directory Structure
Each framework follows the standardized directory layout below:
```
<FrameworkName>.fwrk/
├── <FrameworkName>.json # Framework manifest and build configuration
├── headers/ # Public API headers
│ ├── *.h # Public header files (C++ headers)
│ └── ...
├── src/ # Implementation source files
│ ├── *.cc # C++ implementation files
│ ├── DylibMain.cc # Dynamic library entry point (optional)
│ └── ...
├── xml/ # Framework metadata and properties
│ └── app.xml # Framework property list
├── dist/ # Build output directory
│ └── lib<FrameworkName>.fwrk.dylib # Compiled dynamic library
└── .keep # Placeholder file
```
## Component Specifications
### 1. Framework Manifest (`<FrameworkName>.json`)
The JSON manifest file defines the build configuration, compilation flags, and metadata for the framework.
**Required Fields:**
- **`compiler_path`** (string): Path to the C++ compiler executable
- Example: `"clang++"`, `"x86_64-w64-mingw32-g++"`
- **`compiler_std`** (string): C++ standard version
- Example: `"c++20"`, `"c++17"`
- **`headers_path`** (array): Array of header search paths (relative to framework)
- Include paths for finding dependencies and kernel interfaces
- Example: `["./", "../../../dev/kernel", "../../../public/frameworks/", "../../../dev/"]`
- **`sources_path`** (array): Array of source file globs to compile
- Example: `["src/*.cc"]`
- **`output_name`** (string): Path and filename for compiled library output
- Example: `"./dist/libCoreFoundation.fwrk.dylib"`
**Optional Fields:**
- **`compiler_flags`** (array): Custom compilation flags
- Example: `["-ffreestanding", "-shared", "-fno-rtti", "-fno-exceptions"]`
- **`cpp_macros`** (array): C++ preprocessor macro definitions
- Example: `["kCFVersion=0x0100", "__NE_AMD64__", "__CF_64BIT__"]`
**Example Manifest:**
```json
{
"compiler_path": "x86_64-w64-mingw32-g++",
"compiler_std": "c++20",
"headers_path": ["../", "./", "../../../dev", "../../../dev/kernel"],
"sources_path": ["src/*.cc"],
"output_name": "./dist/libCoreFoundation.fwrk.dylib",
"compiler_flags": [
"-ffreestanding",
"-shared",
"-fno-rtti",
"-fno-exceptions",
"-Wl,--subsystem=17"
],
"cpp_macros": [
"kCFVersion=0x0100",
"kCFVersionHighest=0x0100",
"kCFVersionLowest=0x0100",
"__NE_AMD64__",
"__CF_64BIT__"
]
}
```
### 2. Public Headers Directory (`headers/`)
Contains all public-facing C++ header files that define the framework's API.
**Conventions:**
- File extension: `.h` (not `.hpp`)
- Namespace: Typically matches framework name (e.g., `CF::` for CoreFoundation)
- Include guards: Use `#pragma once` for header protection
- Copyright headers: Include NeKernel copyright notice at the top
**Typical Headers:**
- Main header providing overall framework interface
- Specialized headers for different components
- Type definitions and class declarations
- Exception/error definitions
### 3. Source Implementation Directory (`src/`)
Contains C++ implementation files for the framework.
**Key Files:**
- **`DylibMain.cc`** (Optional):
- Entry point for dynamic library initialization
- Contains `_DylibAttach(SInt32 argc, Char* argv[])` function
- Returns status code (0 for success, EXIT_FAILURE otherwise)
**Example:**
```cpp
#include <libSystem/SystemKit/System.h>
SInt32 _DylibAttach(SInt32 argc, Char* argv[]) {
// Initialization code here
return EXIT_FAILURE; // Change based on initialization result
}
```
- **Implementation Files** (`*.cc`):
- Correspond to public headers
- Contain class definitions and function implementations
- Include necessary system and framework headers
### 4. Metadata Directory (`xml/`)
Contains XML-based property list files for framework metadata.
**`app.xml` Structure:**
- PropertyList format for framework configuration
- Typically includes:
- `LibraryName`: Framework name (string)
- `CacheLibs`: Whether to cache library (boolean)
- Other framework-specific properties
**Example:**
```xml
<PropertyList/>
<PLEntry Type="CFString" Name="LibraryName" Len="255" Value="CoreFoundation" />
<PLEntry Type="BOOL" Name="CacheLibs" Value="YES" />
```
### 5. Build Output Directory (`dist/`)
Auto-generated directory containing compiled framework binaries.
- **Output file**: `lib<FrameworkName>.fwrk.dylib`
- Created during build process via `mk_fwrk.py`
- Not committed to version control
## Built-in Frameworks
The NeKernel project includes the following standard frameworks:
### CoreFoundation.fwrk
**Purpose:** Core data structures and utilities foundation
**Provides:**
- Reference types (CFRef)
- String handling (CFString)
- Collections (Arrays, Dictionaries)
- Geometric types (CFPoint, CFRect, CFColor)
- Object system (CFObject, CFProperty)
### DiskImage.fwrk
**Purpose:** Disk image management and handling
### KernelTest.fwrk
**Purpose:** Testing framework for kernel components
### LaunchHelpers.fwrk
**Purpose:** Helper functions for system launch and initialization
## Framework Creation
### Using mk_fwrk.py
The `mk_fwrk.py` tool automates framework creation:
```bash
python3 tools/mk_fwrk.py <framework_name>
```
This generates:
1. Complete directory structure
2. Template `<framework_name>.json` manifest
3. Skeleton `DylibMain.cc` entry point
4. Template `xml/app.xml` metadata
**Generated Structure:**
```
<framework_name>.fwrk/
├── <framework_name>.json
├── headers/
│ └── .keep
├── src/
│ ├── .keep
│ └── DylibMain.cc
├── xml/
│ └── app.xml
└── .keep
```
## Compilation and Linking
### Build Process
1. **Configuration Phase**: Read and parse `<framework_name>.json`
2. **Compilation Phase**: Compile source files with specified compiler and flags
3. **Linking Phase**: Link object files into dynamic library
4. **Output Phase**: Place compiled binary in `dist/` directory
### Dependencies
- Frameworks can depend on:
- System libraries (via SystemKit)
- Other frameworks (via headers_path)
- Kernel components (via kernel paths in headers_path)
### Linking Order
When building applications that use frameworks:
1. Frameworks are linked in dependency order
2. CoreFoundation is typically a base dependency
3. Framework paths and library names must match manifest output names
## Naming Conventions
- **Framework directories**: `<Name>.fwrk` (PascalCase + .fwrk suffix)
- **JSON manifest**: `<Name>.json` (matches framework directory name)
- **Output library**: `lib<Name>.fwrk.dylib`
- **Namespaces**: Two-letter abbreviations (e.g., `CF`, `DI`, `KT`, `LH`)
- **Macros**: `k<ComponentName>` prefix (e.g., `kCFVersion`)
## Version Specification
Frameworks should include version information via preprocessor macros:
- **`k<Framework>Version`**: Current framework version (e.g., `0x0100` for v1.0)
- **`k<Framework>VersionHighest`**: Highest compatible version
- **`k<Framework>VersionLowest`**: Lowest compatible version
**Version Format**: Hexadecimal (e.g., `0x0100` = 1.0, `0x0201` = 2.1)
## Architecture Support
Frameworks can be compiled for multiple architectures:
- **x86_64** (amd64): 64-bit x86/AMD64 architecture
- **ARM64**: 64-bit ARM architecture
- **RISC-V 64**: RISC-V 64-bit architecture
- **PowerPC 64**: PowerPC 64-bit architecture
Architecture is typically controlled via:
- Compiler selection in manifest
- C++ macros (`__NE_AMD64__`, `__NE_ARM64__`, etc.)
## Best Practices
1. **Header Organization**: Keep headers minimal; place implementation in `.cc` files
2. **Namespace Usage**: Encapsulate all public APIs in framework namespace
3. **Dependencies**: Minimize external dependencies; prefer kernel APIs
4. **Configuration**: Use `.json` manifest for all build-time configuration
5. **Documentation**: Include copyright headers and documentation comments in code
6. **Error Handling**: Define framework-specific error codes and status returns
7. **Testing**: Provide test cases using KernelTest.fwrk when applicable
## Integration with Applications
Applications that use frameworks:
1. **Include Headers**: `#include <Framework/Header.h>`
2. **Link Framework**: Add framework library to linker flags
3. **Initialize**: Call framework initialization if provided
4. **Handle Errors**: Check return codes and handle framework exceptions
## File Permissions
- Framework files: Standard text (`.h`, `.cc`, `.json`, `.xml`)
- Build artifacts: Auto-generated and read-only during runtime
- Framework package: Should be distributable as single `.fwrk` directory
|