chore(build): 移除 VPUI64 动态库并调整构建入口

- 删除 Libs/VPUI64(linker.ld / project.vpj / vpui64.vp),同步 README
- viperc 路径改到 ViperC/__vpcbuild__/output
- 新增 --nokernel(显式 --kernel 优先,且与 --kernel-only 互斥)
- 未编内核时的提示改为「跳过内核编译」
This commit is contained in:
TermiNexus committed 2026-10-26 22:41:47 +08:00
1 parent fa1a92b568
commit ca448eee98
5 files changed
+21 -161

No files matched your search

-34
View File
@@ -1,34 +0,0 @@
SECTIONS {
. = 0;
.text : {
*(.text)
*(.text.*)
}
.rodata : {
*(.rodata)
*(.rodata.*)
}
.data : {
*(.data)
*(.data.*)
}
.bss : {
PROVIDE(__bss_start = .);
*(.bss)
*(.bss.*)
PROVIDE(__bss_end = .);
}
/DISCARD/ : {
*(.comment)
*(.note)
*(.eh_frame)
*(.eh_frame_hdr)
*(.reloc)
*(.debug*)
}
}
-33
View File
@@ -1,33 +0,0 @@
{
"name": "VPUI64",
"version": "1.0.0",
"source_dir": "./",
"build_dir": "./__vpcbuild__",
"compiler": {
"cmd": "llc",
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=pic", "-O2"]
},
"linker": {
"cmd": "ld.lld.exe",
"flags": [
"-m", "elf_x86_64",
"-T", "linker.ld",
"--oformat", "elf64-x86-64",
"-shared",
"-z", "notext",
"--no-relax",
"--strip-all"
],
"output": "vpui64.so"
},
"includes": ["../..", "../../../../includes"],
"target": {
"triple": "x86_64-none-elf",
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
},
"options": {
"slice_level": 3,
"target": "llvm",
"strict_mode": true
}
}
-80
View File
@@ -1,80 +0,0 @@
import t
import vpsdk.syscall as syscall
UINT32PTR: t.CTypedef = uint32*
def color_rgb(r: uint8, g: uint8, b: uint8) -> uint32:
return uint32(r) | (uint32(g) << 8) | (uint32(b) << 16)
def get_winbuf(win_id: int) -> UINT32PTR:
return syscall._syscall2(uint64(syscall.Syscall.GET_WINBUF), uint64(win_id), 0)
def win_flush(win_id: int):
syscall._syscall2(uint64(syscall.Syscall.WIN_FLUSH), uint64(win_id), 0)
export def draw_pixel(buf: UINT32PTR, bw: int, x: int, y: int, color: uint32):
if x < 0 or y < 0: return
buf[y * bw + x] = color
export def draw_line(buf: UINT32PTR, bw: int, x0: int, y0: int, x1: int, y1: int, color: uint32):
dx: int = x1 - x0
dy: int = y1 - y0
sx: int = 1
sy: int = 1
if dx < 0:
dx = -dx
sx = -1
if dy < 0:
dy = -dy
sy = -1
err: int = dx - dy
while True:
if x0 >= 0 and y0 >= 0:
buf[y0 * bw + x0] = color
if x0 == x1 and y0 == y1:
break
e2: int = 2 * err
if e2 > -dy:
err -= dy
x0 += sx
if e2 < dx:
err += dx
y0 += sy
export def draw_rect(buf: UINT32PTR, bw: int, rx: int, ry: int, rw: int, rh: int, color: uint32):
draw_line(buf, bw, rx, ry, rx + rw - 1, ry, color)
draw_line(buf, bw, rx + rw - 1, ry, rx + rw - 1, ry + rh - 1, color)
draw_line(buf, bw, rx + rw - 1, ry + rh - 1, rx, ry + rh - 1, color)
draw_line(buf, bw, rx, ry + rh - 1, rx, ry, color)
export def fill_rect(buf: UINT32PTR, bw: int, rx: int, ry: int, rw: int, rh: int, color: uint32):
if rx < 0: rw += rx; rx = 0
if ry < 0: rh += ry; ry = 0
if rw <= 0 or rh <= 0: return
py: int = ry
while py < ry + rh:
px: int = rx
while px < rx + rw:
buf[py * bw + px] = color
px += 1
py += 1
export def draw_circle(buf: UINT32PTR, bw: int, cx: int, cy: int, r: int, color: uint32):
x: int = r
y: int = 0
d: int = 1 - r
while x >= y:
if cx + x >= 0: buf[(cy + y) * bw + cx + x] = color
if cx + y >= 0: buf[(cy + x) * bw + cx + y] = color
if cx - y >= 0: buf[(cy + x) * bw + cx - y] = color
if cx - x >= 0: buf[(cy + y) * bw + cx - x] = color
if cx - x >= 0: buf[(cy - y) * bw + cx - x] = color
if cx - y >= 0: buf[(cy - x) * bw + cx - y] = color
if cx + y >= 0: buf[(cy - x) * bw + cx + y] = color
if cx + x >= 0: buf[(cy - y) * bw + cx + x] = color
y += 1
if d <= 0:
d += 2 * y + 1
else:
x -= 1
d += 2 * (y - x) + 1
+6 -8
View File
@@ -21,7 +21,7 @@ A bare-metal 64-bit operating system written in the [Viper](https://git.gvsds.co
- **UEFI 引导器** —— `boot/boot.c`(GNU-EFI 编译为 `disk/EFI/BOOT/bootx64.efi`)
- **FAT32 驱动** —— 自研实现,支持挂载、目录、文件操作
- **4 个用户应用** —— HelloWorld / Terminal / Gargantua / Scene3D
- **2 个动态库** —— SerialLogger / VPUI64
- **1 个动态库** —— SerialLogger
- **ViperPOS SDK** —— 用户态开发库(系统调用、窗口、文件系统、进程)
### 目录结构
@@ -62,8 +62,7 @@ ViperOS/
│ ├── Gargantua/
│ └── Scene3D/
├── Libs/ # 动态库(每个子目录一个 .so)
│ ├── SerialLogger/
│ └── VPUI64/
│ └── SerialLogger/
├── vpsdk/ # ViperPOS SDK(应用开发用)
│ ├── __init__.py
│ ├── stdlib.py
@@ -121,7 +120,7 @@ python build.py
`build.py` 会自动完成:
1. 调用 `Projectrans.py` 编译 VKernel → `VKernel/output/kernel.bin`
2. 编译 2 个动态库(SerialLogger、VPUI64)
2. 编译 1 个动态库(SerialLogger)
3. 编译 4 个应用(HelloWorld、Terminal、Gargantua、Scene3D)
4. 拷贝所有产物到 `disk/apps/`、`disk/libs/`、`disk/sys/kernel/x86_64/`
5. 调用 `Scripts/disk.ps1` 创建 64MB FAT32 镜像 `disk.img`
@@ -187,7 +186,7 @@ Main components:
- **UEFI bootloader** — `boot/boot.c` (compiled by GNU-EFI to `disk/EFI/BOOT/bootx64.efi`)
- **FAT32 driver** — self-implemented, supports mount/dir/file operations
- **4 user applications** — HelloWorld / Terminal / Gargantua / Scene3D
- **2 dynamic libraries** — SerialLogger / VPUI64
- **1 dynamic library** — SerialLogger
- **ViperPOS SDK** — user-space development kit (syscall, window, fs, process)
### Directory layout
@@ -228,8 +227,7 @@ ViperOS/
│ ├── Gargantua/
│ └── Scene3D/
├── Libs/ # shared libraries (each subdir = one .so)
│ ├── SerialLogger/
│ └── VPUI64/
│ └── SerialLogger/
├── vpsdk/ # ViperPOS SDK (for user apps)
│ ├── __init__.py
│ ├── stdlib.py
@@ -287,7 +285,7 @@ python build.py
`build.py` automatically:
1. Calls `Projectrans.py` to build VKernel -> `VKernel/output/kernel.bin`
2. Builds 2 shared libraries (SerialLogger, VPUI64)
2. Builds 1 shared library (SerialLogger)
3. Builds 4 applications (HelloWorld, Terminal, Gargantua, Scene3D)
4. Copies all artifacts into `disk/apps/`, `disk/libs/`, `disk/sys/kernel/x86_64/`
5. Calls `Scripts/disk.ps1` to create a 64MB FAT32 image `disk.img`
+15 -6
View File
@@ -18,6 +18,8 @@ only_app = '--onlyapp' in sys.argv
build_kernel = '--kernel' in sys.argv or kernel_only
# --libs:编译 Libs/ 下的动态库(不带 --app 时默认也会编)
libs = '--libs' in sys.argv
# --nokernel:强制跳过内核编译(显式 --kernel 优先,仍可强制编内核)
nokernel = '--nokernel' in sys.argv
# --app=a,b,c:只编译列出的应用(逗号分隔、可多个)。不传则编译全部应用。
app_filter = None
for _arg in sys.argv:
@@ -27,11 +29,19 @@ for _arg in sys.argv:
# 默认(不带 --app)重编内核;--app=… 视为只迭代应用。
if app_filter is None:
build_kernel = True
# --nokernel 强制跳过内核编译,但显式 --kernel 仍优先(允许用 --kernel 覆盖 --nokernel)。
if nokernel and '--kernel' not in sys.argv:
build_kernel = False
# --kernel-only 与 --nokernel 互斥检查
if kernel_only and nokernel:
print("[build] 错误: --kernel-only 与 --nokernel 互斥")
sys.exit(1)
def BuildKernel():
"""编译内核:链接器一次产出带符号 kernel.elf,再由 objcopy 二次处理成裸镜像 kernel.bin"""
cmd = r'..\..\ViperC\output\viperc.exe --project ./VKernel/project.vpj --clear-cache --rebuild-includes'
cmd = r'..\..\ViperC\__vpcbuild__\output\viperc.exe --project ./VKernel/project.vpj --clear-cache --rebuild-includes'
if clean:
cmd += ' --clean'
os.system(cmd)
@@ -61,7 +71,6 @@ APP_LIST = [
# 动态库表:(工程目录, 产物文件名)
LIB_LIST = [
("Libs/SerialLogger", "slog.so"),
("Libs/VPUI64", "vpui64.so"),
]
@@ -69,7 +78,7 @@ def BuildLibs():
"""编译 Libs/ 下的动态库(应用运行期经 LOAD_SO 加载)。"""
os.makedirs("./disk/libs", exist_ok=True)
for proj, out in LIB_LIST:
cmd = rf'..\..\ViperC\output\viperc.exe --project {proj}/project.vpj --clear-cache'
cmd = rf'..\..\ViperC\__vpcbuild__\output\viperc.exe --project {proj}/project.vpj --clear-cache'
if clean:
cmd += ' --clean'
os.system(cmd)
@@ -114,7 +123,7 @@ def BuildApps():
for name, proj, out, dst in APP_LIST:
if app_filter is not None and name not in app_filter:
continue
cmd = rf'..\..\ViperC\output\viperc.exe --project {proj}/project.vpj --clear-cache'
cmd = rf'..\..\ViperC\__vpcbuild__\output\viperc.exe --project {proj}/project.vpj --clear-cache'
if clean:
cmd += ' --clean'
os.system(cmd)
@@ -215,9 +224,9 @@ else:
if build_kernel:
BuildKernel()
else:
print("[build] 默认不重编内核(需要时加 --kernel)")
print("[build] 跳过内核编译(--app 或 --nokernel)")
BuildApps()
BuildBootloader()
BuildDisk()
RunQemu()
RunQemu()