2026-02-10 03:06:30 +08:00
|
|
|
|
-- ==============================================
|
|
|
|
|
|
-- Extra2D 示例程序构建目标
|
2026-02-10 05:15:18 +08:00
|
|
|
|
-- 支持平台: Nintendo Switch, Windows, Linux, macOS
|
2026-02-10 03:06:30 +08:00
|
|
|
|
-- ==============================================
|
|
|
|
|
|
|
|
|
|
|
|
-- 获取 devkitPro 路径
|
|
|
|
|
|
local function get_devkitpro_path()
|
|
|
|
|
|
return "C:/devkitPro"
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
-- 生成 Switch NRO 文件的通用后构建函数
|
|
|
|
|
|
-- @param target_name 目标名称
|
|
|
|
|
|
-- @param app_title 应用标题
|
|
|
|
|
|
-- @param app_author 应用作者
|
|
|
|
|
|
-- @param app_version 应用版本
|
|
|
|
|
|
-- @param romfs_dir RomFS 目录路径(相对于项目根目录)
|
|
|
|
|
|
local function generate_nro_after_build(target_name, app_title, app_author, app_version, romfs_dir)
|
|
|
|
|
|
after_build(function (target)
|
|
|
|
|
|
local devkitPro = get_devkitpro_path()
|
|
|
|
|
|
local elf_file = target:targetfile()
|
|
|
|
|
|
local output_dir = path.directory(elf_file)
|
|
|
|
|
|
local nacp_file = path.join(output_dir, target_name .. ".nacp")
|
|
|
|
|
|
local nro_file = path.join(output_dir, target_name .. ".nro")
|
|
|
|
|
|
local nacptool = path.join(devkitPro, "tools/bin/nacptool.exe")
|
|
|
|
|
|
local elf2nro = path.join(devkitPro, "tools/bin/elf2nro.exe")
|
|
|
|
|
|
|
|
|
|
|
|
if not os.isfile(nacptool) then
|
|
|
|
|
|
print("Warning: nacptool not found at " .. nacptool)
|
|
|
|
|
|
return
|
|
|
|
|
|
end
|
|
|
|
|
|
if not os.isfile(elf2nro) then
|
|
|
|
|
|
print("Warning: elf2nro not found at " .. elf2nro)
|
|
|
|
|
|
return
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
-- 生成 .nacp 文件
|
|
|
|
|
|
os.vrunv(nacptool, {"--create", app_title, app_author, app_version, nacp_file})
|
|
|
|
|
|
print("Built " .. path.filename(nacp_file))
|
|
|
|
|
|
|
|
|
|
|
|
-- 生成 .nro 文件(包含 RomFS)
|
|
|
|
|
|
local romfs_absolute = path.absolute(romfs_dir)
|
|
|
|
|
|
if os.isdir(romfs_absolute) then
|
|
|
|
|
|
print("Packing RomFS from: " .. romfs_absolute)
|
|
|
|
|
|
os.vrunv(elf2nro, {elf_file, nro_file, "--nacp=" .. nacp_file, "--romfsdir=" .. romfs_absolute})
|
|
|
|
|
|
print("Built " .. path.filename(nro_file) .. " (with RomFS)")
|
|
|
|
|
|
else
|
|
|
|
|
|
os.vrunv(elf2nro, {elf_file, nro_file, "--nacp=" .. nacp_file})
|
|
|
|
|
|
print("Built " .. path.filename(nro_file))
|
|
|
|
|
|
end
|
|
|
|
|
|
end)
|
|
|
|
|
|
end
|
|
|
|
|
|
|
2026-02-10 05:15:18 +08:00
|
|
|
|
-- 定义 Switch 示例程序的通用配置
|
2026-02-10 03:06:30 +08:00
|
|
|
|
-- @param name 目标名称
|
|
|
|
|
|
-- @param options 配置选项表
|
2026-02-10 05:15:18 +08:00
|
|
|
|
local function define_switch_example_target(name, options)
|
2026-02-10 03:06:30 +08:00
|
|
|
|
target(name)
|
|
|
|
|
|
set_kind("binary")
|
|
|
|
|
|
set_plat("switch")
|
|
|
|
|
|
set_arch("arm64")
|
|
|
|
|
|
set_toolchains("switch")
|
|
|
|
|
|
set_targetdir("build/switch")
|
|
|
|
|
|
|
|
|
|
|
|
-- 添加源文件
|
|
|
|
|
|
add_files(options.source_file or ("Extra2D/examples/" .. name .. "/main.cpp"))
|
|
|
|
|
|
|
|
|
|
|
|
-- 添加头文件路径
|
|
|
|
|
|
add_includedirs("Extra2D/include")
|
|
|
|
|
|
|
|
|
|
|
|
-- 链接 extra2d 库
|
|
|
|
|
|
add_deps("extra2d")
|
|
|
|
|
|
|
2026-02-10 05:15:18 +08:00
|
|
|
|
-- Windows 控制台应用程序(仅 PC 平台)
|
|
|
|
|
|
if is_plat("windows") then
|
|
|
|
|
|
add_ldflags("-mconsole", {force = true})
|
|
|
|
|
|
end
|
|
|
|
|
|
|
2026-02-10 03:06:30 +08:00
|
|
|
|
-- 可选:添加链接器标志
|
|
|
|
|
|
if options.ldflags then
|
|
|
|
|
|
add_ldflags(options.ldflags, {force = true})
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
-- 构建后生成 .nro 文件
|
|
|
|
|
|
generate_nro_after_build(
|
|
|
|
|
|
name,
|
|
|
|
|
|
options.app_title or ("Extra2D " .. name),
|
|
|
|
|
|
options.app_author or "Extra2D Team",
|
|
|
|
|
|
options.app_version or "1.0.0",
|
|
|
|
|
|
options.romfs_dir or ("Extra2D/examples/" .. name .. "/romfs")
|
|
|
|
|
|
)
|
|
|
|
|
|
target_end()
|
|
|
|
|
|
end
|
|
|
|
|
|
|
2026-02-10 05:15:18 +08:00
|
|
|
|
-- 定义 PC 示例程序的通用配置
|
|
|
|
|
|
-- @param name 目标名称
|
|
|
|
|
|
-- @param options 配置选项表
|
|
|
|
|
|
local function define_pc_example_target(name, options)
|
|
|
|
|
|
target(name)
|
|
|
|
|
|
set_kind("binary")
|
|
|
|
|
|
set_toolchains("pc")
|
|
|
|
|
|
|
|
|
|
|
|
-- 设置输出目录
|
|
|
|
|
|
if is_host("windows") then
|
|
|
|
|
|
set_targetdir("build/windows")
|
|
|
|
|
|
elseif is_host("linux") then
|
|
|
|
|
|
set_targetdir("build/linux")
|
|
|
|
|
|
elseif is_host("macosx") then
|
|
|
|
|
|
set_targetdir("build/macos")
|
|
|
|
|
|
else
|
|
|
|
|
|
set_targetdir("build/pc")
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
-- 添加源文件
|
|
|
|
|
|
add_files(options.source_file or ("Extra2D/examples/" .. name .. "/main.cpp"))
|
|
|
|
|
|
|
|
|
|
|
|
-- 添加头文件路径
|
|
|
|
|
|
add_includedirs("Extra2D/include")
|
|
|
|
|
|
|
|
|
|
|
|
-- 链接 extra2d 库
|
|
|
|
|
|
add_deps("extra2d")
|
|
|
|
|
|
|
|
|
|
|
|
-- 可选:添加链接器标志
|
|
|
|
|
|
if options.ldflags then
|
|
|
|
|
|
add_ldflags(options.ldflags, {force = true})
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
-- PC 端构建后复制资源文件和 DLL
|
|
|
|
|
|
after_build(function (target)
|
|
|
|
|
|
local target_file = target:targetfile()
|
|
|
|
|
|
local output_dir = path.directory(target_file)
|
|
|
|
|
|
local romfs_dir = options.romfs_dir or ("Extra2D/examples/" .. name .. "/romfs")
|
|
|
|
|
|
local romfs_absolute = path.absolute(romfs_dir)
|
|
|
|
|
|
|
|
|
|
|
|
-- 复制 vcpkg DLL 到输出目录
|
|
|
|
|
|
local vcpkg_root = os.getenv("VCPKG_ROOT")
|
|
|
|
|
|
if vcpkg_root then
|
|
|
|
|
|
local triplet = is_arch("x64") and "x64-windows" or "x86-windows"
|
|
|
|
|
|
local vcpkg_bin = path.join(vcpkg_root, "installed", triplet, "bin")
|
|
|
|
|
|
if os.isdir(vcpkg_bin) then
|
|
|
|
|
|
-- 复制 SDL2 相关 DLL
|
|
|
|
|
|
local dlls = {"SDL2.dll", "SDL2_mixer.dll", "ogg.dll", "vorbis.dll", "vorbisfile.dll", "wavpackdll.dll"}
|
|
|
|
|
|
for _, dll in ipairs(dlls) do
|
|
|
|
|
|
local dll_path = path.join(vcpkg_bin, dll)
|
|
|
|
|
|
if os.isfile(dll_path) then
|
|
|
|
|
|
os.cp(dll_path, output_dir)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
print("Copied DLLs from: " .. vcpkg_bin)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
-- 复制资源文件到输出目录
|
|
|
|
|
|
if os.isdir(romfs_absolute) then
|
|
|
|
|
|
local assets_dir = path.join(output_dir, "assets")
|
|
|
|
|
|
os.mkdir(assets_dir)
|
|
|
|
|
|
|
|
|
|
|
|
-- 复制 romfs 内容到 assets 目录
|
|
|
|
|
|
local romfs_assets = path.join(romfs_absolute, "assets")
|
|
|
|
|
|
if os.isdir(romfs_assets) then
|
|
|
|
|
|
print("Copying assets from: " .. romfs_assets .. " to " .. assets_dir)
|
|
|
|
|
|
os.cp(romfs_assets .. "/*", assets_dir)
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
print("Built " .. path.filename(target_file) .. " (with assets)")
|
|
|
|
|
|
else
|
|
|
|
|
|
print("Built " .. path.filename(target_file))
|
|
|
|
|
|
end
|
|
|
|
|
|
end)
|
|
|
|
|
|
target_end()
|
|
|
|
|
|
end
|
|
|
|
|
|
|
2026-02-10 03:06:30 +08:00
|
|
|
|
-- 定义所有示例程序目标
|
|
|
|
|
|
function define_example_targets()
|
2026-02-10 05:15:18 +08:00
|
|
|
|
-- 根据平台选择示例程序定义方式
|
|
|
|
|
|
if is_plat("switch") then
|
|
|
|
|
|
-- ============================================
|
|
|
|
|
|
-- Switch 示例程序
|
|
|
|
|
|
-- ============================================
|
|
|
|
|
|
define_switch_example_target("hello_world", {
|
|
|
|
|
|
app_title = "Extra2D hello_world",
|
|
|
|
|
|
app_author = "Extra2D hello_world",
|
|
|
|
|
|
app_version = "1.0.0"
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
define_switch_example_target("spatial_index_demo", {
|
|
|
|
|
|
app_title = "Extra2D Spatial Index Demo",
|
|
|
|
|
|
app_version = "1.0.0",
|
|
|
|
|
|
ldflags = "-Wl,-Map=build/switch/spatial_index_demo.map"
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
define_switch_example_target("collision_demo", {
|
|
|
|
|
|
app_title = "Extra2D Collision Demo",
|
|
|
|
|
|
app_version = "1.0.0"
|
|
|
|
|
|
})
|
|
|
|
|
|
else
|
|
|
|
|
|
-- ============================================
|
|
|
|
|
|
-- PC 示例程序 (Windows/Linux/macOS)
|
|
|
|
|
|
-- ============================================
|
|
|
|
|
|
define_pc_example_target("hello_world", {
|
|
|
|
|
|
romfs_dir = "Extra2D/examples/hello_world/romfs"
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
define_pc_example_target("spatial_index_demo", {
|
|
|
|
|
|
romfs_dir = "Extra2D/examples/spatial_index_demo/romfs"
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
define_pc_example_target("collision_demo", {
|
|
|
|
|
|
romfs_dir = "Extra2D/examples/collision_demo/romfs"
|
|
|
|
|
|
})
|
|
|
|
|
|
end
|
2026-02-10 03:06:30 +08:00
|
|
|
|
end
|