如何编写支持多输入多输出的Premake自定义构建命令?
在Premake中配置多输入多输出的自定义构建命令(以Protobuf为例)
针对你遇到的问题,这里提供一套符合protoc批量处理逻辑、同时能让生成文件被构建系统正确识别的Premake配置方案:
1. 收集输入与定义输出文件
首先批量收集项目中的所有.proto文件,并对应生成输出文件路径:
-- 收集指定目录下的所有proto文件 local proto_dir = "proto" local proto_files = os.matchfiles(path.join(proto_dir, "*.proto")) -- 定义每个proto对应的输出文件(.pb.h 和 .pb.cc) local proto_outputs = {} local generated_dir = "generated" for _, proto_file in ipairs(proto_files) do local base_name = path.getbasename(proto_file) table.insert(proto_outputs, path.join(generated_dir, base_name .. ".pb.h")) table.insert(proto_outputs, path.join(generated_dir, base_name .. ".pb.cc")) end
2. 配置自定义构建规则
通过filter匹配proto文件,设置一次性批量处理的构建命令,并明确所有输出文件:
filter "files:**.proto" -- 构建时显示的提示信息 buildmessage "Compiling Protobuf files: %{table.concat(proto_files, ' ')}" -- 构建命令:先确保输出目录存在,再调用protoc批量处理所有proto -- Windows平台可替换为 `if not exist %{generated_dir} mkdir %{generated_dir} && ...` buildcommand "mkdir -p %{generated_dir} && protoc --proto_path=%{proto_dir} --cpp_out=%{generated_dir} %{table.concat(proto_files, ' ')}" -- 指定所有输出文件,让Premake跟踪文件变化,避免重复构建 buildoutputs "%{proto_outputs}" -- 如果protoc是项目内编译的目标,可添加依赖确保它先被构建 -- dependson "protoc"
3. 将生成的代码纳入构建系统
把生成的.pb.cc文件添加到项目编译列表,并将输出目录加入头文件搜索路径:
-- 添加生成的C++代码到项目,让构建系统编译它们 files(path.join(generated_dir, "*.pb.cc")) -- 将生成目录加入包含路径,确保项目代码能找到对应的.pb.h头文件 includedirs(generated_dir)
关键说明
- 批量处理逻辑:通过
table.concat(proto_files, ' ')把所有proto文件一次性传入protoc,符合官方推荐用法,同时避免重复启动编译器的开销。 - 输出文件跟踪:
buildoutputs明确列出所有生成文件,Premake会根据输入输出文件的修改时间判断是否需要重新构建。 - 生成文件识别:通过
files指令把.pb.cc加入项目,构建系统会自动将其纳入编译流程,解决之前未被识别的问题。
内容的提问来源于stack exchange,提问作者Travis Gockel
相关产品推荐
相关产品推荐

