local premake = premake local xcode = premake.xcode xcode.allscheme = false function xcode.workspace_head() _p('') _p('') end function xcode.workspace_tail() _p('') end function xcode.workspace_file_ref(prj, indent) local projpath = path.getrelative(prj.solution.location, prj.location) if projpath == '.' then projpath = '' else projpath = projpath ..'/' end _p(indent, '', projpath .. prj.name .. '.xcodeproj') _p(indent, '') end function xcode.workspace_group(grp, indent) _p(indent, '', grp.name) local function comparenames(a, b) return a.name < b.name end local groups = table.join(grp.groups) local projects = table.join(grp.projects) table.sort(groups, comparenames) table.sort(projects, comparenames) for _, child in ipairs(groups) do xcode.workspace_group(child, indent + 1) end for _, prj in ipairs(projects) do xcode.workspace_file_ref(prj, indent + 1) end _p(indent, '') end function xcode.workspace_generate(sln) xcode.preparesolution(sln) xcode.workspace_head() xcode.reorderProjects(sln) for grp in premake.solution.eachgroup(sln) do if grp.parent == nil then xcode.workspace_group(grp, 1) end end for prj in premake.solution.eachproject(sln) do if prj.group == nil then xcode.workspace_file_ref(prj, 1) end end xcode.workspace_tail() end -- -- Generate the `-ALL` scheme, building all targets. -- function xcode.workspace_scheme(sln) if not xcode.allscheme then return false end local projects = {} local primary = nil for prj in premake.solution.eachproject(sln) do if not primary or (sln.startproject == prj.name) then primary = prj end table.insert(projects, prj) end xcode.scheme(projects, primary) end -- -- Generate the workspace settings file, preventing xcode from auto-generating -- schemes we have manually provided. -- function xcode.workspace_settings(sln) _p('') _p('') _p('') _p('') _p(1, 'IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded') _p(1, '') _p('') _p('') end -- -- If a startup project is specified, move it to the front of the project list. -- This will make Visual Studio treat it like a startup project. -- function xcode.reorderProjects(sln) if sln.startproject then for i, prj in ipairs(sln.projects) do if sln.startproject == prj.name then -- Move group tree containing the project to start of group list local cur = prj.group while cur ~= nil do -- Remove group from array for j, group in ipairs(sln.groups) do if group == cur then table.remove(sln.groups, j) break end end -- Add back at start table.insert(sln.groups, 1, cur) cur = cur.parent end -- Move the project itself to start table.remove(sln.projects, i) table.insert(sln.projects, 1, prj) break end end end end