From 1e161ecfffee373d45eab209d8b66203b155146c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com> Date: Fri, 5 Jun 2026 21:51:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20NSIS=20=E5=AE=89=E8=A3=85=E5=8C=85?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=20(62MB,=20=E5=90=AB=20LLVM+clang+lld)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++- scripts/build_installer.bat | 34 +++++++++ scripts/installer.nsi | 139 ++++++++++++++++++++++++++++++++++++ 3 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 scripts/build_installer.bat create mode 100644 scripts/installer.nsi diff --git a/README.md b/README.md index 6e4071d..61b3a54 100644 --- a/README.md +++ b/README.md @@ -140,8 +140,8 @@ graph TB ### 从源码构建 ```bash -git clone -cd "L Language" +git clone git@lhy-git.liuhangyv.top:Serendipity/l-language.git +cd l-language mkdir build && cd build cmake .. -G "MinGW Makefiles" -DCMAKE_PREFIX_PATH="D:/settings/Language/LLVM" mingw32-make -j4 @@ -149,6 +149,16 @@ mingw32-make -j4 生成 `l_lang.exe`。 +### 安装包(Windows) + +下载 [L-Language-x.x.x-setup.exe](https://github.com/LHY0125/l-language/releases),双击安装。包含编译器、LLVM 运行时和 8 个示例程序,无需额外安装 GCC 或 LLVM。 + +安装包构建: +```bash +cd scripts && build_installer.bat +``` +需要 NSIS 3.x。 + ## 使用 ```bash diff --git a/scripts/build_installer.bat b/scripts/build_installer.bat new file mode 100644 index 0000000..e57b11f --- /dev/null +++ b/scripts/build_installer.bat @@ -0,0 +1,34 @@ +@echo off +REM L Language 安装包构建脚本 +REM 前置条件: 已编译 l_lang.exe (cd build && mingw32-make -j4) + +set VERSION=0.6.0 +set NSIS=D:\Program Files (x86)\NSIS\Bin\makensis.exe + +echo === 构建 L Language %VERSION% 安装包 === +echo. + +REM 1. 确保编译器已编译 +if not exist "build\l_lang.exe" ( + echo 错误: build\l_lang.exe 不存在,请先编译 + exit /b 1 +) + +REM 2. 复制 LICENSE 到 scripts 目录 +copy LICENSE scripts\LICENSE.txt >nul 2>&1 + +REM 3. 添加 BOM 并构建 +cd scripts +( + echo // BOM marker +) > _bom.tmp +copy /b _bom.tmp + installer.nsi installer_bom.nsi >nul +del _bom.tmp + +"%NSIS%" -DVERSION=%VERSION% installer_bom.nsi +del installer_bom.nsi +cd .. + +echo. +echo === 完成 === +echo 安装包: build\L-Language-%VERSION%-setup.exe diff --git a/scripts/installer.nsi b/scripts/installer.nsi new file mode 100644 index 0000000..184ed73 --- /dev/null +++ b/scripts/installer.nsi @@ -0,0 +1,139 @@ +; L Language 编译器 Windows 安装包 +; 构建: makensis -DVERSION=x.y.z installer.nsi + +Unicode true + +!ifndef VERSION + !define VERSION "0.6.0" +!endif + +!define PRODUCT "L Language" +!define PUBLISHER "Liu Hangyu (LHY0125)" +!define EXE "l_lang.exe" + +Name "${PRODUCT} ${VERSION}" +OutFile "..\build\L-Language-${VERSION}-setup.exe" +InstallDir "$PROGRAMFILES\L Language" +RequestExecutionLevel admin +SetCompressor /SOLID lzma +SetCompressorDictSize 32 + +!include "MUI2.nsh" + +!define MUI_ABORTWARNING +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE "..\LICENSE" +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_LANGUAGE "SimpChinese" + +; ── 核心文件 ── +Section "Install" + SetOutPath "$INSTDIR" + + ; 编译器 + File "..\build\${EXE}" + ; LLVM 运行时 (编译必须) + File "D:\settings\Language\LLVM\bin\LLVM-C.dll" + ; 链接器 (.o -> .exe) + File "D:\settings\Language\LLVM\bin\clang.exe" + File "D:\settings\Language\LLVM\bin\ld.lld.exe" + ; MinGW 线程运行时 + File "D:\settings\Language\C\mingw64\bin\libmcfgthread-2.dll" + + ; 示例程序 + SetOutPath "$INSTDIR\examples" + File "..\test\programs\01_arithmetic.l" + File "..\test\programs\02_if_else.l" + File "..\test\programs\04_fib_recursive.l" + File "..\test\programs\12_struct.l" + File "..\test\programs\17_enum.l" + File "..\test\programs\27_named_args.l" + File "..\test\programs\28_pipe.l" + File "..\test\programs\29_interp.l" + + ; 示例说明 + FileOpen $0 "$INSTDIR\examples\README.txt" w + FileWrite $0 "L Language 示例程序$\r$\n" + FileWrite $0 "==================$\r$\n$\r$\n" + FileWrite $0 "01_arithmetic.l - 基本算术运算$\r$\n" + FileWrite $0 "02_if_else.l - if/else 分支$\r$\n" + FileWrite $0 "04_fib_recursive.l - 递归斐波那契$\r$\n" + FileWrite $0 "12_struct.l - 结构体定义和使用$\r$\n" + FileWrite $0 "17_enum.l - 枚举类型$\r$\n" + FileWrite $0 "27_named_args.l - 命名参数$\r$\n" + FileWrite $0 "28_pipe.l - 管道运算符 |>$\r$\n" + FileWrite $0 "29_interp.l - 字符串插值$\r$\n$\r$\n" + FileWrite $0 "编译运行:$\r$\n" + FileWrite $0 ' "$INSTDIR\${EXE}" 文件名.l -o 程序.exe$\r$\n' + FileWrite $0 " 程序.exe$\r$\n" + FileClose $0 + + ; 快速入门 bat + FileOpen $0 "$INSTDIR\快速入门.bat" w + FileWrite $0 '@echo off$\r$\n' + FileWrite $0 'title L Language - 快速入门$\r$\n' + FileWrite $0 'echo.$\r$\n' + FileWrite $0 'echo ===================================$\r$\n' + FileWrite $0 'echo L Language ${VERSION} 快速入门$\r$\n' + FileWrite $0 'echo ===================================$\r$\n' + FileWrite $0 'echo.$\r$\n' + FileWrite $0 'echo 编译并运行字符串插值示例:$\r$\n' + FileWrite $0 'echo.$\r$\n' + FileWrite $0 '"$INSTDIR\${EXE}" "$INSTDIR\examples\29_interp.l" -o "$INSTDIR\hello.exe"$\r$\n' + FileWrite $0 'if %errorlevel% equ 0 ($\r$\n' + FileWrite $0 ' echo.$\r$\n' + FileWrite $0 ' echo --- 程序输出 ---$\r$\n' + FileWrite $0 ' "$INSTDIR\hello.exe"$\r$\n' + FileWrite $0 ' echo.$\r$\n' + FileWrite $0 ' echo 编译运行成功!$\r$\n' + FileWrite $0 ') else ($\r$\n' + FileWrite $0 ' echo 编译失败,请检查环境。$\r$\n' + FileWrite $0 ')$\r$\n' + FileWrite $0 'echo.$\r$\n' + FileWrite $0 'pause$\r$\n' + FileClose $0 + + ; 开始菜单 + CreateDirectory "$SMPROGRAMS\${PRODUCT}" + CreateShortCut "$SMPROGRAMS\${PRODUCT}\快速入门.lnk" \ + "$INSTDIR\快速入门.bat" "" "$INSTDIR\快速入门.bat" 0 + CreateShortCut "$SMPROGRAMS\${PRODUCT}\示例目录.lnk" \ + "$INSTDIR\examples" "" "$INSTDIR\examples" 0 + CreateShortCut "$SMPROGRAMS\${PRODUCT}\卸载.lnk" \ + "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0 + + ; 控制面板注册 + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\L Language" \ + "DisplayName" "${PRODUCT} ${VERSION}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\L Language" \ + "UninstallString" "$INSTDIR\uninstall.exe" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\L Language" \ + "DisplayVersion" "${VERSION}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\L Language" \ + "Publisher" "${PUBLISHER}" + + WriteUninstaller "$INSTDIR\uninstall.exe" +SectionEnd + +; ── 卸载 ── +Section "Uninstall" + Delete "$INSTDIR\${EXE}" + Delete "$INSTDIR\LLVM-C.dll" + Delete "$INSTDIR\clang.exe" + Delete "$INSTDIR\ld.lld.exe" + Delete "$INSTDIR\libmcfgthread-2.dll" + Delete "$INSTDIR\快速入门.bat" + Delete "$INSTDIR\uninstall.exe" + RMDir /r "$INSTDIR\examples" + RMDir "$INSTDIR" + + Delete "$SMPROGRAMS\${PRODUCT}\*" + RMDir "$SMPROGRAMS\${PRODUCT}" + + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\L Language" +SectionEnd