-- MinGW 编译配置 set_toolchains("mingw") add_requires("libsdl2", {configs = {shared = true}}) add_requires("glm") -- 创建自定义规则来编译 .rc 文件 rule("windres_compile") set_extensions(".rc") on_build(function (target) local windres = "windres" local rc_file = target:sourcefiles()[1] local obj_file = target:targetfile() local arch = is_arch("x86_64") and "pe-x86-64" or "pe-i386" os.execv(windres, {"-i", rc_file, "-o", obj_file, "-O", "coff", "-F", arch}) end) rule_end() target("Frostbite2D") set_kind("binary") add_files(path.join(os.projectdir(), "Frostbite2D/src/**.cpp")) add_files(path.join(os.projectdir(), "Frostbite2D/src/**.c")) add_includedirs(path.join(os.projectdir(), "Frostbite2D/include")) -- 添加资源文件(如果存在) local rc_file = path.join(os.projectdir(), "resources/app.rc") local ico_file = path.join(os.projectdir(), "assets/icons/app.ico") if os.isfile(rc_file) and os.isfile(ico_file) then -- 添加 .rc 文件并应用自定义规则 add_files(rc_file, {rule = "windres_compile"}) end add_packages("libsdl2") add_packages("glm") -- 复制着色器文件到输出目录 after_build(function (target) -- 复制 shaders 目录 local shaders_dir = path.join(os.projectdir(), "shaders") local output_dir = target:targetdir() local target_shaders_dir = path.join(output_dir, "shaders") if os.isdir(shaders_dir) then -- 确保目标目录存在 if not os.isdir(target_shaders_dir) then os.mkdir(target_shaders_dir) end -- 复制所有着色器文件 for _, file in ipairs(os.files(path.join(shaders_dir, "*.*"))) do local filename = path.filename(file) local target_file = path.join(target_shaders_dir, filename) os.cp(file, target_file) end end -- 复制图标文件到输出目录 local icons_dir = path.join(os.projectdir(), "assets/icons") local target_icons_dir = path.join(output_dir, "assets/icons") if os.isdir(icons_dir) then if not os.isdir(target_icons_dir) then os.mkdir(target_icons_dir) end for _, file in ipairs(os.files(path.join(icons_dir, "*.*"))) do local filename = path.filename(file) local target_file = path.join(target_icons_dir, filename) os.cp(file, target_file) print("Copy icon: " .. filename) end end -- 复制 SDL2 DLL local sdl2_lib = target:pkg("libsdl2") if sdl2_lib then local libfiles = sdl2_lib:get("libfiles") if libfiles then for _, libfile in ipairs(libfiles) do -- 查找 DLL 文件 if libfile:endswith(".dll") then local target_dll = path.join(output_dir, path.filename(libfile)) os.cp(libfile, target_dll) print("Copy DLL: " .. path.filename(libfile)) end end end end -- 尝试从 xmake 包目录复制 SDL2.dll local sdl2_dll_paths = { path.join(os.getenv("USERPROFILE") or "", ".xmake/packages/l/libsdl2/**/bin/SDL2.dll"), path.join(os.getenv("USERPROFILE") or "", ".xmake/packages/l/libsdl2/**/lib/SDL2.dll"), } for _, dll_pattern in ipairs(sdl2_dll_paths) do local dll_files = os.files(dll_pattern) for _, dll_file in ipairs(dll_files) do local target_dll = path.join(output_dir, "SDL2.dll") if not os.isfile(target_dll) then os.cp(dll_file, target_dll) print("Copy SDL2.dll from: " .. dll_file) end end end end) target_end()