summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/genie/src/actions/xcode/xcode6_project.lua
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/genie/src/actions/xcode/xcode6_project.lua')
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode6_project.lua247
1 files changed, 247 insertions, 0 deletions
diff --git a/3rdparty/genie/src/actions/xcode/xcode6_project.lua b/3rdparty/genie/src/actions/xcode/xcode6_project.lua
new file mode 100644
index 00000000000..3ee73127e2a
--- /dev/null
+++ b/3rdparty/genie/src/actions/xcode/xcode6_project.lua
@@ -0,0 +1,247 @@
+--
+-- xcode4_project.lua
+-- Generate an Xcode4 C/C++ project.
+-- Copyright (c) 2009 Jason Perkins and the Premake project
+--
+
+local xcode = premake.xcode
+local xcode6 = xcode.xcode6
+local tree = premake.tree
+
+--
+-- Create a tree corresponding to what is shown in the Xcode project browser
+-- pane, with nodes for files and folders, resources, frameworks, and products.
+--
+-- @param prj
+-- The project being generated.
+-- @returns
+-- A tree, loaded with metadata, which mirrors Xcode's view of the project.
+--
+
+function xcode6.buildprjtree(prj)
+ local tr = premake.project.buildsourcetree(prj)
+
+ -- create a list of build configurations and assign IDs
+ tr.configs = {}
+ for _, cfgname in ipairs(prj.solution.configurations) do
+ for _, platform in ipairs(prj.solution.xcode.platforms) do
+ local cfg = premake.getconfig(prj, cfgname, platform)
+ cfg.xcode = {}
+ cfg.xcode.targetid = xcode.newid(prj.xcode.projectnode, cfgname)
+ cfg.xcode.projectid = xcode.newid(tr, cfgname)
+ table.insert(tr.configs, cfg)
+ end
+ end
+
+ -- convert localized resources from their filesystem layout (English.lproj/MainMenu.xib)
+ -- to Xcode's display layout (MainMenu.xib/English).
+ tree.traverse(tr, {
+ onbranch = function(node)
+ if path.getextension(node.name) == ".lproj" then
+ local lang = path.getbasename(node.name) -- "English", "French", etc.
+
+ -- create a new language group for each file it contains
+ for _, filenode in ipairs(node.children) do
+ local grpnode = node.parent.children[filenode.name]
+ if not grpnode then
+ grpnode = tree.insert(node.parent, tree.new(filenode.name))
+ grpnode.kind = "vgroup"
+ end
+
+ -- convert the file node to a language node and add to the group
+ filenode.name = path.getbasename(lang)
+ tree.insert(grpnode, filenode)
+ end
+
+ -- remove this directory from the tree
+ tree.remove(node)
+ end
+ end
+ })
+
+ -- fix .xcassets files, they should be treated as a file, not a folder
+ tree.traverse(tr, {
+ onbranch = function(node)
+ if path.getextension(node.name) == ".xcassets" then
+ node.children = {}
+ end
+ end
+ })
+
+ -- the special folder "Frameworks" lists all linked frameworks
+ tr.frameworks = tree.new("Frameworks")
+ for cfg in premake.eachconfig(prj) do
+ for _, link in ipairs(premake.getlinks(cfg, "system", "fullpath")) do
+ local name = path.getname(link)
+ if xcode.isframework(name) and not tr.frameworks.children[name] then
+ node = tree.insert(tr.frameworks, tree.new(name))
+ node.path = link
+ end
+ end
+ end
+
+ -- only add it to the tree if there are frameworks to link
+ if #tr.frameworks.children > 0 then
+ tree.insert(tr, tr.frameworks)
+ end
+
+ -- the special folder "Products" holds the target produced by the project; this
+ -- is populated below
+ tr.products = tree.insert(tr, tree.new("Products"))
+
+ -- the special folder "Projects" lists sibling project dependencies
+ tr.projects = tree.new("Projects")
+ for _, dep in ipairs(premake.getdependencies(prj, "sibling", "object")) do
+ -- create a child node for the dependency's xcodeproj
+ local xcpath = xcode.getxcodeprojname(dep)
+ local xcnode = tree.insert(tr.projects, tree.new(path.getname(xcpath)))
+ xcnode.path = xcpath
+ xcnode.project = dep
+ xcnode.productgroupid = xcode.newid(xcnode, "prodgrp")
+ xcnode.productproxyid = xcode.newid(xcnode, "prodprox")
+ xcnode.targetproxyid = xcode.newid(xcnode, "targprox")
+ xcnode.targetdependid = xcode.newid(xcnode, "targdep")
+
+ -- create a grandchild node for the dependency's link target
+ local cfg = premake.getconfig(dep, prj.configurations[1])
+ node = tree.insert(xcnode, tree.new(cfg.linktarget.name))
+ node.path = cfg.linktarget.fullpath
+ node.cfg = cfg
+ end
+
+ if #tr.projects.children > 0 then
+ tree.insert(tr, tr.projects)
+ end
+
+ -- Final setup
+ tree.traverse(tr, {
+ onnode = function(node)
+ -- assign IDs to every node in the tree
+ node.id = xcode.newid(node)
+
+ -- assign build IDs to buildable files
+ if xcode.getbuildcategory(node) then
+ node.buildid = xcode.newid(node, "build")
+ end
+
+ -- remember key files that are needed elsewhere
+ if string.endswith(node.name, "Info.plist") then
+ tr.infoplist = node
+ end
+ if string.endswith(node.name, ".entitlements") then
+ tr.entitlements = node
+ end
+ end
+ }, true)
+
+ -- Plug in the product node into the Products folder in the tree. The node
+ -- was built in xcode.preparesolution() in xcode_common.lua; it contains IDs
+ -- that are necessary for inter-project dependencies
+ node = tree.insert(tr.products, prj.xcode.projectnode)
+ node.kind = "product"
+ node.path = node.cfg.buildtarget.fullpath
+ node.cfgsection = xcode.newid(node, "cfg")
+ node.resstageid = xcode.newid(node, "rez")
+ node.sourcesid = xcode.newid(node, "src")
+ node.fxstageid = xcode.newid(node, "fxs")
+
+ return tr
+end
+
+
+--
+-- Generate an Xcode4 .xcodeproj for a Premake project.
+--
+-- @param prj
+-- The Premake project to generate.
+--
+
+function xcode6.project(prj)
+ local tr = xcode6.buildprjtree(prj)
+
+ xcode6.Header(tr)
+ xcode6.PBXProject(tr)
+
+ xcode.PBXBuildFile(tr)
+ xcode.PBXContainerItemProxy(tr)
+ xcode.PBXFileReference(tr,prj)
+ xcode.PBXFrameworksBuildPhase(tr)
+ xcode.PBXGroup(tr)
+ xcode.PBXNativeTarget(tr)
+ xcode.PBXReferenceProxy(tr)
+ xcode.PBXResourcesBuildPhase(tr)
+ xcode.PBXShellScriptBuildPhase(tr)
+ xcode.PBXSourcesBuildPhase(tr,prj)
+ xcode.PBXVariantGroup(tr)
+ xcode.PBXTargetDependency(tr)
+ xcode.XCBuildConfiguration(tr)
+ xcode.XCBuildConfigurationList(tr)
+
+ xcode6.PBXConfigsGroup()
+ xcode6.Footer(tr)
+end
+
+---------------------------------------------------------------------------
+-- Section generator functions, in the same order in which they appear
+-- in the .pbxproj file
+---------------------------------------------------------------------------
+
+function xcode6.Header()
+ _p('// !$*UTF8*$!')
+ _p('{')
+ _p(1,'archiveVersion = 1;')
+ _p(1,'classes = {}')
+ _p(1,'objectVersion = 46;')
+ _p(1,'rootObject = __RootObject_;')
+ _p(1,'objects = {')
+end
+
+function xcode6.PBXProject(tr)
+ _p(2,'__RootObject_ = {')
+ _p(3,'isa = PBXProject;')
+ _p(3,'attributes = {LastUpgradeCheck = 9999;};')
+ _p(3,'buildConfigurationList = ___RootConfs_;', tr.name)
+ _p(3,'compatibilityVersion = "Xcode 3.2";')
+ _p(3,'developmentRegion = English;')
+ _p(3,'hasScannedForEncodings = 0;')
+ _p(3,'knownRegions = (en);')
+ _p(3,'mainGroup = ___RootGroup_;')
+ _p(3,'projectDirPath = "";')
+ _p(3,'projectRoot = "";')
+
+ _p(3,'targets = (')
+ for _, node in ipairs(tr.products.children) do
+ _p(4,'%s /* %s */,', node.targetid, node.name)
+ end
+ _p(3,');')
+
+ if #tr.projects.children > 0 then
+ _p(3,'projectReferences = (')
+ for _, node in ipairs(tr.projects.children) do
+ _p(4,'{')
+ _p(5,'ProductGroup = %s /* Products */;', node.productgroupid)
+ _p(5,'ProjectRef = %s /* %s */;', node.id, path.getname(node.path))
+ _p(4,'},')
+ end
+ _p(3,');')
+ end
+
+ _p(2,'};')
+ _p('')
+end
+
+function xcode6.PBXConfigsGroup()
+ _p(2, "_____Configs_ = {")
+ _p(3, "isa = PBXGroup;")
+ _p(3, "children = (")
+ -- '__PBXFileRef_SGLMath.xcodeproj/Configs/Project.xcconfig'
+ _p(3, ");")
+ _p(3, "name = Configs;")
+ _p(3, "sourceTree = '<group>';")
+ _p(2, "};")
+end
+
+function xcode6.Footer()
+ _p(1,'};')
+ _p('}')
+end