如何在Premake中为每个目录自动生成项目及总构建目标?
使用Premake通过Lua循环批量生成插件项目
核心逻辑
Premake基于Lua开发,完全支持用Lua的文件遍历和循环语法批量定义项目,彻底替代硬编码方式。
具体实现步骤
1. 遍历插件目录
用Premake内置的os.matchdirs函数快速获取所有插件文件夹:
-- 获取所有以"Plugin"开头的子目录,可根据实际修改匹配规则 local pluginDirs = os.matchdirs("Plugin*")
2. 循环生成单个插件项目
遍历每个插件目录,为其创建独立构建目标:
-- 存储所有插件项目名,用于后续总构建目标 local allPluginProjects = {} for _, dir in ipairs(pluginDirs) do local pluginName = path.getname(dir) -- 定义当前插件项目 project(pluginName) kind "SharedLib" -- 根据需求调整为StaticLib等类型 language "C++" targetdir "bin/%{cfg.buildcfg}" objdir "obj/%{cfg.buildcfg}/%{prj.name}" -- 导入当前插件目录下的所有源文件 files { path.join(dir, "**.h"), path.join(dir, "**.cpp") } -- 添加通用编译配置,可根据项目需求修改 warnings "Extra" defines { "PLUGIN_EXPORTS" } -- 将项目名加入总目标依赖列表 table.insert(allPluginProjects, pluginName) end
3. 创建一键构建总目标
用Utility类型项目打包所有插件,实现一键构建所有内容:
project("BuildAllPlugins") kind "Utility" -- 仅作为依赖容器,不生成二进制文件 dependson(allPluginProjects) -- 依赖所有插件项目
扩展提示
- 若部分插件需要自定义配置,可在对应插件目录下单独创建
premake5.lua,然后在循环中通过dofile(path.join(dir, "premake5.lua"))加载,实现差异化配置。 os.matchdirs支持更灵活的匹配规则,比如"Plugins/*"匹配Plugins目录下的所有子文件夹,可根据实际项目结构调整。
内容的提问来源于stack exchange,提问作者mr.b
相关产品推荐
相关产品推荐

