## 为什么
用户 2026-10-29 报告/要求五件事:
1. 派生信号的「时间轴偏移保留在样式上、其它调整烘值」维持现状(确认无需改动);
2. 信号名右键菜单里很多功能已被下方样式自定义区覆盖 ⇒ 只保留「仅显示该信号」,
并在它**上方**新增「克隆该信号」;
3. 设置菜单新增「主题配色」二级菜单(带 √ 状态),顺序 Light / Solarised Light /
Dark / Solarised Dark,默认主题维持现状;
4. 布局边界:中键平移视界时浮动面板上的边界**闪烁**;光标取值胶囊的**文字**框会**穿透**
到浮动面板上;并请核对网格内固定构件(图例 / Y 轴标尺 / GX 标签 / 回到最上方 /
浮动面板)的层级关系;
5. 单数据点信号在拖动光标时的**吸附**功能消失。
## 根因
### 布局边界层级(两个都很隐蔽)
- **文本层号写死**:文本是在绘制过程中由 `UiTextRectSink` 收集的,而宿主把所有文本都记在
固定层 2;组件几何层却是"组件表下标"(`PlotView` = 0)。面板层 = PlotView 层 + 1 = 1,
**低于**文本层 2 ⇒ 面板的遮挡矩形挖不到文本 ⇒ 胶囊文字画在面板表面。
- **面板像素缓存**:面板"先画进图层、命中缓存就贴图",贴图那一帧不画字 ⇒ 文本框凭空消失
⇒ 面板上的边界闪烁。
- 顺带发现 `PlotView::BuildBoxes` 用 `PushLayer()` 却**从不复位**,会把宿主后续所有组件的
层号整体推高。
### 单点信号吸附
`MinorCellSparse` 在"把判定范围收窄到数据实际时间跨度"的分支里有
`if (!(dataMax > dataMin)) return false;`。单个有效采样点时 `dataMax == dataMin`,
于是被判定成"不稀疏" ⇒ 不吸附。
## 改了什么
### 1. 布局边界层级
- `UiTextRectSink` 新增 `OnTextLayer(int)` / `TextLayer()`;新增 `UiSetTextLayer` /
`UiGetTextLayer`;`UiBoxTable` 实现为改 `m_layer`,并暴露 `Layer()`。
- `Application::Render` 在绘制每个组件前下发 `UiSetTextLayer(ComponentLayer(&component))`,
浮层用 `OverlayLayer(1/2)`;新增 `ComponentLayer()` / `OverlayLayer()` /
`kLayersPerComponent = 3`,与 `PaintLayoutBounds` 的层号**完全同源**。
- `PaintLayoutBounds` 改为**显式** `SetLayer(下标 × 3)`(不再依赖 `PushLayer` 累加)。
- `PlotView`:`BuildBoxes` 用 `baseLayer + 1` 放浮动面板(并登记遮挡)、
`baseLayer + 2` 放绘制在面板之上的滚动条 / 回到最上方 / 输入框,结束**复位**层号;
`paintOverlays` 同步分两次抬高文本层。
- 面板像素图层新增 `PanelSlot::textRects` + 转发型收集器 `PanelTextCollector`:
渲染时存文本框,命中缓存贴图时回放 ⇒ 几何与缓存命中无关(消除闪烁)。
### 2. 信号右键菜单 + 克隆
- 菜单只剩:标题、**克隆该信号**、**仅显示该信号**;删除显示/隐藏、显示全部/隐藏全部、
预设色块行、样式三项,以及对应的 `CMD_SIGNAL_TOGGLE/SHOW_ALL/HIDE_ALL`、
`CMD_COLOR_BASE`、`CMD_MODE_BASE` 及其分支(死代码)。
- 新增 `CMD_SIGNAL_CLONE`(post `WM_APP + 5`)→ `Application::CloneSignal`:
把「调整」(系数 / 绝对值 / 镜像 / Y 偏移)烘进采样值、**时间轴偏移保留在样式上**,
名称前置 `*`,插入到源信号**正下方**,并**保留原外观**(颜色/透明度/线宽/绘制样式)。
- 抽出 `Application::InsertSignalBelowSource(...)` 供派生与克隆共用。
### 3. 主题配色
- `ThemeKind{LIGHT, SOLARIZED_LIGHT, DARK, SOLARIZED_DARK}` + `ThemeFor()` / `ThemeName()`;
Light 取 VS Code 2026 默认浅色、Dark 取 Dark+、Solarized Dark 取 VS Code solarized dark。
**默认仍是 Solarised Light**。
- 新增 `CurrentTheme()` / `SetCurrentTheme()`:宿主交出自己的 `m_theme` 地址,
切换主题只改内容;`UiControls` 里没有 `Theme` 形参的原语改用它(原来硬编码
`SolarizedLight()`,换主题不生效)。
- `Application::ApplyTheme()`:改配色 → `PlotView::OnThemeChanged()`(作废场景/宽基底/
装饰/光晕/面板图层)+ `SignalPanel::OnThemeChanged()`(作废行位图)→ 整窗重绘。
- 菜单用 `SUBMENU` + 4 个 `keepOpen` 子项;新增 `PopupMenu::UpdateSubmenuItemLabel()`
回写勾选,并让子菜单分支尊重 `keepOpen`(原为无条件关闭)。
### 4. 单点信号吸附
`MinorCellSparse` 改为只在 `dataMax < dataMin` 时放弃;相等时按"那一个小格"判定
(`need = 5 > finiteCount = 1` ⇒ 稀疏 ⇒ 吸附恢复)。
### 5. 审计
`Makefile` 的 `LAYOUT_BOUNDS` / `JDI_LAYOUT_BOUNDS` **从未被任何 `#if` 引用**
(`LAYOUT_BOUNDS=0` 产物字节数完全相同),属名实不符的死开关 ⇒ 删除并注明原因。
## 怎么验证
新增两支离屏探针(不占鼠标 / 键盘 / 屏幕):
```
.preflight/round15check 28 passed, 0 failed
单点吸附 7 条(含"远处不吸附")、面板层级 5 条、面板文本框跨帧与中键平移稳定 2 条、
克隆 14 条(烘值逐点比对 / 名称前缀 / 偏移与外观保留 / 调整复位)
.preflight/themecheck 17 passed, 0 failed
4 套主题可读性与可区分、默认 = Solarised Light、逐主题换色且无旧底色残留、
切回默认逐像素还原(diff = 0)、子菜单 4 项 / 顺序 / 唯一勾选 / 命令切换 / 菜单保持打开
```
回归全绿:
```
uicheck 69/69 lbcheck 21/21 lbresid 5/5 lbzorder 4/4
lbcovr 7/7 lbpanel 10/10 derivecheck 16/16
rendercheck: 8 个场景哈希与上一轮逐一相同 + FUNC 7/7, exit=0
A FAED59DF284153DB B E6443BFE4E3955F8 C 96A0AA8C402F1729 D E3D5DBD998E43720
E DA0583CB13C26A6F F FFB822159F604D1D G 19F8DE8FE3A8DF18 H DBBDDE4CB2C97C92
```
`make release` / `make debug` 零 error / 零 warning;产物 **791,552 B**
(单一 exe,未拆 DLL,未改 `-Oz`;离 1MB 预警线约 250 KB)。
316 lines
11 KiB
Makefile
316 lines
11 KiB
Makefile
# 目标文件名称
|
||
TARGET_FILE_NAME = Target
|
||
|
||
# 编译目录
|
||
BUILD_DIR = Build
|
||
|
||
# Release 编译子目录
|
||
SUB_DIR_RELEASE = Release
|
||
|
||
# Debug 编译子目录
|
||
SUB_DIR_DEBUG = Debug
|
||
|
||
# ⚠️ 产物体积**预警阈值**(用户 2026-10-29 更新):**1MB(1,048,576 B)**。
|
||
# 这不是"不许超过":**超过仍可发布**,但到达阈值时必须主动提醒用户,
|
||
# 并说明"超在哪一段(`.text` / `.rdata` / `.xdata`+`.pdata` / `.rsrc`)、由哪个改动贡献"。
|
||
# 旧红线 900KB / 800KB 均已作废。
|
||
# 查段构成的命令(排查超限原因的标准做法):objdump -h Build/Release/Target.exe
|
||
RELEASE_OPT = -Oz
|
||
|
||
# ---- 体积相关编译开关 ------------------------------------------------------
|
||
# ⚠️ 曾经有一个 `LAYOUT_BOUNDS` 开关(声称能剔除"显示布局边界"调试叠加层),
|
||
# 但它从来没有被任何 `#if` 引用过 —— 是个**名实不符**的死开关,已删除(2026-10-29 审计)。
|
||
# 该叠加层现在是**正式功能**(设置菜单里的开关),随产物一起编译;
|
||
# 要真正把它变成可剔除项,需要给每个组件的 `BuildBoxes` 重载都加 `#if`,
|
||
# 代价远大于它占的十几 KB(当前产物 791,552 B,离 1MB 预警线还有 250+ KB)。
|
||
|
||
# NO_EXCEPTIONS:1 = 用 `-fno-exceptions` 构建(省 `.xdata`+`.pdata` 约 28KB)。
|
||
# ⚠️ 代价:所有"按数据规模预留大块内存"的地方必须用 `MemProbe.hpp` 的
|
||
# `MemReserveIfRoom()` **预检验**,不能再靠 try/catch。
|
||
# 兜底:`Application::Initialize` 里安装了 `MemInstallTerminateHandler()`
|
||
# (万一仍有遗漏,OOM 时弹一次带建议的模态提示后干净退出,而不是静默消失)。
|
||
NO_EXCEPTIONS = 1
|
||
|
||
# LTO:1 = 链接时优化(实测 −94KB)。构建时间约翻倍。
|
||
# ⚠️ **切换 LTO 必须 `make clean`**:LTO 与非 LTO 目标文件混链会让
|
||
# GCC 15.2.0 在 `binds_to_current_def_p` 处 ICE(已实测复现)。
|
||
# ⚠️ 开启 LTO 后 `-Wa,...,-ahlms` 的 `.lst` 汇编清单不再生成(lto-wrapper 会丢弃并告警),
|
||
# 因此 `ASM_LISTING` 在 LTO 下为空。
|
||
LTO = 1
|
||
# ---------------------------------------------------------------------------
|
||
|
||
# Debug 优化等级
|
||
DEBUG_OPT = -O0
|
||
|
||
# GUI或CUI编译选项 [0]CUI/Console [1]GUI
|
||
GUI = 1
|
||
|
||
# C编译标准
|
||
C_STD = c17
|
||
|
||
# C++编译标准
|
||
CXX_STD = c++17
|
||
|
||
# 源文件编码定义
|
||
INPUT_CHAR_ENCODING = UTF-8
|
||
|
||
# 编译产物单字节字符(char)编码定义
|
||
OUTPUT_CHAR_ENCODING = GBK
|
||
|
||
# 编译产物宽字符(wchar_t)编码定义
|
||
OUTPUT_WCHAR_ENCODING = UTF-16LE
|
||
|
||
# 编译工具前缀
|
||
COMPLIER_PREFIX = \
|
||
|
||
# C编译工具
|
||
C_COMPLIER = $(strip $(COMPLIER_PREFIX))gcc
|
||
|
||
# C++编译工具
|
||
CXX_COMPLIER = $(strip $(COMPLIER_PREFIX))g++
|
||
|
||
# Windows 资源文件编译工具
|
||
WIN_RES_COMPLIER = windres
|
||
|
||
##################################################################################
|
||
|
||
# 链接库
|
||
LIB_LINK = \
|
||
-lgdi32 \
|
||
-lgdiplus \
|
||
-lmsimg32 \
|
||
-lcomdlg32 \
|
||
-ld3d11 \
|
||
-ldwmapi \
|
||
-ld3dcompiler \
|
||
|
||
# C定义
|
||
C_DEFS = \
|
||
_UNICODE \
|
||
UNICODE \
|
||
|
||
# C头文件目录
|
||
C_INCLUDES_PATHS = \
|
||
|
||
# C源文件目录
|
||
C_SOURCES_PATHS = \
|
||
|
||
# C额外单个源文件
|
||
C_EXTERA_SOURCES = \
|
||
|
||
# C++定义
|
||
CXX_DEFS = \
|
||
_UNICODE \
|
||
UNICODE \
|
||
|
||
# C++ 头文件目录
|
||
# ⚠️ 目录约定:**所有头文件(.hpp)只放在 `Inc`**,`Src` 只放实现(.cpp)。
|
||
# `*Internal.hpp`(组件内部共享的常量/工具,如 `PlotViewInternal.hpp`)同样属于头文件,
|
||
# 历史上曾被放在 `Src` 下(那里也能编译,因为编译器会先找 `#include` 所在目录),
|
||
# 但那是靠“同目录优先”隐式生效的 —— 一旦文件被搬走就会无声失效。现已全部移入 `Inc`。
|
||
CXX_INCLUDES_PATHS = \
|
||
Utilities/Inc \
|
||
Resources/Inc \
|
||
Components/Main/Inc \
|
||
Components/Shared/Inc \
|
||
Components/Application/Inc \
|
||
Components/TabBar/Inc \
|
||
Components/Toolbar/Inc \
|
||
Components/SignalPanel/Inc \
|
||
Components/PlotView/Inc \
|
||
|
||
# C++源文件目录
|
||
CXX_SOURCES_PATHS = \
|
||
Utilities/Src \
|
||
Components/Main/Src \
|
||
Components/Shared/Src \
|
||
Components/Application/Src \
|
||
Components/TabBar/Src \
|
||
Components/Toolbar/Src \
|
||
Components/SignalPanel/Src \
|
||
Components/PlotView/Src \
|
||
|
||
# C++额外单个源文件
|
||
CXX_EXTERA_SOURCES = \
|
||
|
||
# Windows 资源文件脚本头文件路径
|
||
WIN_RESOURCE_INCLUDES_PATHS = \
|
||
Resources \
|
||
Resources/Inc \
|
||
# Windows 资源文件脚本输入代码页(对应 INPUT_CHAR_ENCODING = UTF-8)
|
||
WIN_RESOURCE_CODEPAGE = 65001
|
||
# Windows 资源文件脚本列表
|
||
WIN_RESOURCE_SCRIPTS = \
|
||
Resources/JustDataInspector.rc \
|
||
|
||
##################################################################################
|
||
|
||
# C编译选项
|
||
CFLAGS = $(foreach text,$(C_DEFS),$(addprefix -D,$(text))) \
|
||
$(foreach path,$(C_INCLUDES_PATHS),$(addprefix -I,$(path))) \
|
||
-std=$(strip $(C_STD)) \
|
||
-finput-charset=$(strip $(INPUT_CHAR_ENCODING)) \
|
||
-fexec-charset=$(strip $(OUTPUT_CHAR_ENCODING)) \
|
||
-fwide-exec-charset=$(strip $(OUTPUT_WCHAR_ENCODING)) \
|
||
-static \
|
||
$(FUNC_SECTIONS) \
|
||
-Wall \
|
||
-MMD -MP -MF"$(@:%.o=%.d)" \
|
||
|
||
# C++编译选项
|
||
CXXFLAGS = $(foreach text,$(CXX_DEFS),$(addprefix -D,$(text))) \
|
||
$(foreach path,$(CXX_INCLUDES_PATHS),$(addprefix -I,$(path))) \
|
||
-std=$(strip $(CXX_STD)) \
|
||
-finput-charset=$(strip $(INPUT_CHAR_ENCODING)) \
|
||
-fexec-charset=$(strip $(OUTPUT_CHAR_ENCODING)) \
|
||
-fwide-exec-charset=$(strip $(OUTPUT_WCHAR_ENCODING)) \
|
||
-static \
|
||
$(FUNC_SECTIONS) \
|
||
-Wall \
|
||
-MMD -MP -MF"$(@:%.o=%.d)" \
|
||
-lstdc++ \
|
||
|
||
|
||
# 链接选项
|
||
LDFLAGS = -Wl,-Map,$(basename $@).map \
|
||
$(GC_SECTIONS) \
|
||
|
||
##################################################################################
|
||
|
||
# GUI与CUI选项附加
|
||
ifeq ($(GUI), 1)
|
||
LDFLAGS += -mwindows
|
||
else
|
||
LDFLAGS += -mconsole
|
||
endif
|
||
|
||
# ---- 体积/行为相关开关(必须在 CFLAGS / CXXFLAGS / LDFLAGS 定义之后)--------
|
||
# 说明:这些是 `=` / `+=` 的递归变量,make 在展开 recipe 时才求值,
|
||
# 因此放在 LDFLAGS 定义之后仍然能正确作用到前面的 CFLAGS / LDFLAGS。
|
||
|
||
ifeq ($(strip $(NO_EXCEPTIONS)), 1)
|
||
CXXFLAGS += -fno-exceptions
|
||
endif
|
||
|
||
# 丢弃未被引用的函数/数据(非 LTO 时还需要配合 -ffunction-sections 才有粒度)。
|
||
GC_SECTIONS = -Wl,--gc-sections
|
||
|
||
ifeq ($(strip $(LTO)), 1)
|
||
# LTO 自己就做跨编译单元的内联与去重,不需要再开 function-sections;
|
||
# 实测 `-flto` 与 `-ffunction-sections -fdata-sections` 同时打开会让
|
||
# GCC 15.2.0 在 `binds_to_current_def_p (symtab.cc:2598)` 处 ICE。
|
||
FUNC_SECTIONS =
|
||
CFLAGS += -flto
|
||
CXXFLAGS += -flto
|
||
# ⚠️ `-flto-partition=one` 是绕过上面那个 ICE 的关键:
|
||
# 默认的多分区 LTRANS 在解析 COMDAT 定义时必崩(同一份代码拆成 11 个分区稳定复现,
|
||
# 单分区从未复现)。代价是 LTRANS 只能串行,全量构建比非 LTO 慢约一倍。
|
||
LDFLAGS += -flto -flto-partition=one
|
||
# lto-wrapper 会丢弃 -Wa 的汇编清单并告警,故 LTO 下不生成 .lst。
|
||
ASM_LISTING =
|
||
ASM_LISTING_C =
|
||
else
|
||
FUNC_SECTIONS = -ffunction-sections -fdata-sections
|
||
ASM_LISTING = -Wa,-a,-ad,-ahlms=$(@:%.o=%.lst)
|
||
ASM_LISTING_C = -Wa,-a,-ad,-alms=$(@:%.o=%.lst)
|
||
endif
|
||
# ---------------------------------------------------------------------------
|
||
|
||
# C目标文件及索引目录关联
|
||
OBJECTS = $(notdir $(C_EXTERA_SOURCES:.c=.o))
|
||
OBJECTS += $(subst .c,.o,$(notdir $(foreach path,$(C_SOURCES_PATHS),$(wildcard $(path)/*.c))))
|
||
vpath %.c $(sort $(dir $(C_EXTERA_SOURCES))) $(sort $(C_SOURCES_PATHS))
|
||
|
||
# C++目标文件及索引目录关联
|
||
OBJECTS += $(notdir $(CXX_EXTERA_SOURCES:.cpp=.o))
|
||
OBJECTS += $(subst .cpp,.o,$(notdir $(foreach path,$(CXX_SOURCES_PATHS),$(wildcard $(path)/*.cpp))))
|
||
vpath %.cpp $(sort $(dir $(CXX_EXTERA_SOURCES))) $(sort $(CXX_SOURCES_PATHS))
|
||
|
||
# Windows资源文件及索引目录关联
|
||
OBJECTS += $(notdir $(WIN_RESOURCE_SCRIPTS:.rc=.o))
|
||
vpath %.rc $(sort $(dir $(WIN_RESOURCE_SCRIPTS)))
|
||
|
||
|
||
# Release 目标文件
|
||
RELEASE_OBJECTS = $(addprefix $(BUILD_DIR)/$(SUB_DIR_RELEASE)/,$(OBJECTS))
|
||
|
||
# Debug 目标文件
|
||
DEBUG_OBJECTS = $(addprefix $(BUILD_DIR)/$(SUB_DIR_DEBUG)/,$(OBJECTS))
|
||
|
||
##################################################################################
|
||
|
||
# all任务 目标为 release 和 debug 产物
|
||
all: $(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).exe $(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).exe
|
||
@echo ====== [All] Build Procedure Accomplished ======
|
||
|
||
# release任务 目标为 release 产物
|
||
release: $(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).exe
|
||
@echo ====== [Release] Build Procedure Accomplished ======
|
||
|
||
# debug任务 目标为 debug 产物
|
||
debug: $(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).exe
|
||
@echo ====== [Debug] Build Procedure Accomplished ======
|
||
|
||
# 清理任务
|
||
clean: $(BUILD_DIR)
|
||
powershell rm -r $(BUILD_DIR)
|
||
|
||
# 构建目录生成
|
||
$(BUILD_DIR):
|
||
powershell mkdir $@
|
||
|
||
# Release 工作目录生成
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE): | $(BUILD_DIR)
|
||
powershell mkdir $@
|
||
|
||
# Debug 工作目录生成
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG): | $(BUILD_DIR)
|
||
powershell mkdir $@
|
||
|
||
# Release 最终可执行文件编译任务
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).exe: $(RELEASE_OBJECTS)
|
||
@echo ====== [Release] All File Compiled. Now Linking... ======
|
||
$(CXX_COMPLIER) $(RELEASE_OBJECTS) -static -s -o $@ $(LIB_LINK) $(LDFLAGS)
|
||
@echo ====== [Release] Program Link Finished ======
|
||
|
||
# Debug 最终可执行文件编译任务
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).exe: $(DEBUG_OBJECTS)
|
||
@echo ====== [Debug] All File Compiled. Now Linking... ======
|
||
$(CXX_COMPLIER) $(DEBUG_OBJECTS) -static -o $@ $(LIB_LINK) $(LDFLAGS)
|
||
@echo ====== [Debug] Program Link Finished ======
|
||
|
||
# C Release 目标文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE)/%.o: %.c Makefile | $(BUILD_DIR)/$(SUB_DIR_RELEASE)
|
||
@echo ====== [Release] C Source File "$<" Compiling... ======
|
||
$(C_COMPLIER) -c $(CFLAGS) $(RELEASE_OPT) $(ASM_LISTING_C) $< -o $@
|
||
|
||
# C++ Release 目标文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE)/%.o: %.cpp Makefile | $(BUILD_DIR)/$(SUB_DIR_RELEASE)
|
||
@echo ====== [Release] C++ Source File "$<" Compiling... ======
|
||
$(CXX_COMPLIER) -c $(CXXFLAGS) $(RELEASE_OPT) $(ASM_LISTING) $< -o $@
|
||
|
||
# Release 资源脚本文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE)/%.o: %.rc Makefile | $(BUILD_DIR)/$(SUB_DIR_RELEASE)
|
||
@echo ====== [Release] Windows Resource Script File "$<" Compiling... ======
|
||
$(WIN_RES_COMPLIER) -c $(WIN_RESOURCE_CODEPAGE) $(foreach path,$(WIN_RESOURCE_INCLUDES_PATHS),$(addprefix -I,$(path))) $< -o $@
|
||
|
||
# C Debug 目标文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG)/%.o: %.c Makefile | $(BUILD_DIR)/$(SUB_DIR_DEBUG)
|
||
@echo ====== [Debug] C Source File "$<" Compiling... ======
|
||
$(C_COMPLIER) -c $(CFLAGS) $(RELEASE_OPT) $(ASM_LISTING_C) $< -o $@
|
||
|
||
# C++ Debug 目标文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG)/%.o: %.cpp Makefile | $(BUILD_DIR)/$(SUB_DIR_DEBUG)
|
||
@echo ====== [Debug] C++ Source File "$<" Compiling... ======
|
||
$(CXX_COMPLIER) -c $(CXXFLAGS) $(RELEASE_OPT) $(ASM_LISTING) $< -o $@
|
||
|
||
# Debug 资源脚本文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG)/%.o: %.rc Makefile | $(BUILD_DIR)/$(SUB_DIR_DEBUG)
|
||
@echo ====== [Debug] Windows Resource Script File "$<" Compiling... ======
|
||
$(WIN_RES_COMPLIER) -c $(WIN_RESOURCE_CODEPAGE) $(foreach path,$(WIN_RESOURCE_INCLUDES_PATHS),$(addprefix -I,$(path))) $< -o $@
|
||
|
||
|
||
# 依赖关系
|
||
-include $(RELEASE_OBJECTS:.o=.d)
|
||
-include $(DEBUG_OBJECTS:.o=.d)
|