Premake生成的Xcode项目文件平铺,如何实现文件夹嵌套展示?
问题:Premake5生成Xcode工作区后文件平铺显示,无法展示真实文件夹层级
当前文件夹结构
. ├── premake5.lua ├── DKEngine.xcworkspace ├── bin/ ├── obj/ ├── DKEngine/ │ ├── DKEngine.xcodeproj │ ├── ext/ │ └── src/ │ ├── DKEngine.h │ ├── DKEngine.cpp ├── Sandbox/ │ ├── Sandbox.xcodeproj │ ├── ext/ │ └── src/ │ └── main.cpp
现有Premake脚本
workspace "DKEngine" architecture "arm64" configurations { "Debug", "Release", "Dist" } outputdir = "%{cfg.buildcfg}-%{cfg.system}-%{cfg.architecture}" project "DKEngine" location "DKEngine" kind "SharedLib" language "C++" targetdir("bin/" .. outputdir .. "/%{prj.name}") objdir("obj/" .. outputdir .. "/%{prj.name}") files { "%{prj.name}/src/**.h", "%{prj.name}/src/**.mm", "%{prj.name}/src/**.cpp" } includedirs { "%{prj.name}/ext" } cppdialect "C++20" staticruntime "On" systemversion "latest" postbuildcommands { ("{COPY} %{cfg.buildtarget.relpath} ../bin/" .. outputdir .. "/Sandbox") } filter "configurations:Debug" defines "DK_DEBUG" symbols "On" project "Sandbox" location "Sandbox" kind "ConsoleApp" language "C++" targetdir("bin/" .. outputdir .. "/%{prj.name}") objdir("obj/" .. outputdir .. "/%{prj.name}") files { "%{prj.name}/src/**h", -- 存在笔误,缺少点号 "%{prj.name}/src/**.cpp" } includedirs { "%{prj.name}/ext", "DKEngine/src" } links { "DKEngine" } cppdialect "C++20" staticruntime "On" systemversion "latest" filter "configurations:Debug" defines "DK_DEBUG" symbols "On"
问题描述
打开生成的Xcode工作区后,所有源文件在项目导航器中以带引用箭头的形式平铺显示,未按实际的文件夹层级(如src)分组。
解决方案
核心原因
不是workspace或project的location设置导致的问题,而是你在files配置中使用了相对于工作区根目录的路径(比如%{prj.name}/src/**.h),Premake会把这些文件当成工作区根目录下的文件处理,因此Xcode会平铺显示。要让Xcode展示真实文件夹层级,需要让Premake识别文件的相对目录结构。
具体修改方案
1. 修正files路径为相对于Project Location的路径
每个Project的location已经指向了对应的子文件夹(比如DKEngine项目的location是DKEngine/),所以files里的路径可以直接写相对于该文件夹的路径,这样Premake会自动保留目录结构,Xcode就会生成对应的文件夹分组。同时要同步调整targetdir、objdir、includedirs的路径,适配相对位置的变化。
2. 修复Sandbox项目的笔误
Sandbox项目的files里"%{prj.name}/src/**h"缺少点号,改为"%{prj.name}/src/**.h"(或按方案1改成src/**.h)。
修改后的完整Premake脚本
workspace "DKEngine" architecture "arm64" configurations { "Debug", "Release", "Dist" } outputdir = "%{cfg.buildcfg}-%{cfg.system}-%{cfg.architecture}" project "DKEngine" location "DKEngine" kind "SharedLib" language "C++" -- 回退到根目录再指定输出路径 targetdir("../bin/" .. outputdir .. "/%{prj.name}") objdir("../obj/" .. outputdir .. "/%{prj.name}") -- 使用相对于project location的路径,保留物理目录结构 files { "src/**.h", "src/**.mm", "src/**.cpp" } includedirs { "ext" -- 改为相对路径 } cppdialect "C++20" staticruntime "On" systemversion "latest" postbuildcommands { ("{COPY} %{cfg.buildtarget.relpath} ../bin/" .. outputdir .. "/Sandbox") } filter "configurations:Debug" defines "DK_DEBUG" symbols "On" project "Sandbox" location "Sandbox" kind "ConsoleApp" language "C++" targetdir("../bin/" .. outputdir .. "/%{prj.name}") objdir("../obj/" .. outputdir .. "/%{prj.name}") -- 修正笔误+使用相对路径 files { "src/**.h", "src/**.cpp" } includedirs { "ext", -- 相对路径 "../DKEngine/src" -- 回退到根目录再指向DKEngine的src } links { "DKEngine" } cppdialect "C++20" staticruntime "On" systemversion "latest" filter "configurations:Debug" defines "DK_DEBUG" symbols "On"
额外优化:用vpaths自定义文件夹分组(可选)
如果需要更灵活的分组(比如把所有头文件放到统一的"Headers"组,源文件放到"Sources"组),可以在每个Project里添加vpaths配置:
-- 在DKEngine项目中添加 vpaths { ["Headers/*"] = "src/**.h", ["Sources/*"] = "src/**.cpp", ["Sources/ObjC++/*"] = "src/**.mm" } -- 在Sandbox项目中添加 vpaths { ["Headers/*"] = "src/**.h", ["Sources/*"] = "src/**.cpp" }
这样Xcode里会按照你定义的分组展示文件,而非完全照搬物理目录结构。
内容的提问来源于stack exchange,提问作者CodingNoob
相关产品推荐
相关产品推荐

