From eef1a97501ae4a4aeb157f17449e279a9fa47037 Mon Sep 17 00:00:00 2001 From: starkos Date: Mon, 9 Nov 2009 21:34:46 +0000 Subject: [PATCH] Finished porting --- src/_manifest.lua | 1 - src/actions/xcode/xcode_common.lua | 45 +++- src/actions/xcode/xcode_pbxproj.lua | 229 --------------------- src/actions/xcode/xcode_project.lua | 2 +- tests/actions/test_xcode.lua | 32 --- tests/actions/xcode/test_xcode_project.lua | 4 +- tests/premake4.lua | 2 - 7 files changed, 46 insertions(+), 269 deletions(-) delete mode 100644 src/actions/xcode/xcode_pbxproj.lua delete mode 100644 tests/actions/test_xcode.lua diff --git a/src/_manifest.lua b/src/_manifest.lua index 00e7e853..47b0f4a3 100644 --- a/src/_manifest.lua +++ b/src/_manifest.lua @@ -64,7 +64,6 @@ "actions/xcode/xcode_common.lua", "actions/xcode/xcode_solution.lua", "actions/xcode/xcode_project.lua", - "actions/xcode/xcode_pbxproj.lua", -- Clean action "actions/clean/_clean.lua", diff --git a/src/actions/xcode/xcode_common.lua b/src/actions/xcode/xcode_common.lua index b582cd51..07d2ffd4 100644 --- a/src/actions/xcode/xcode_common.lua +++ b/src/actions/xcode/xcode_common.lua @@ -65,6 +65,23 @@ end +-- +-- Return the default installation path, based target kind. +-- +-- @param cfg +-- The configuration to query. +-- @returns +-- The install path, string. +-- + + function xcode.getinstallpath(cfg) + local paths = { + WindowedApp = "$(HOME)/Applications", + } + return paths[cfg.kind] + end + + -- -- Return the Xcode product type, based target kind. -- @@ -85,6 +102,26 @@ end +-- +-- Return the Xcode target type, based on the target file extension. +-- +-- @param node +-- The product node to identify. +-- @returns +-- An Xcode target type, string. +-- + + function xcode.gettargettype(node) + local types = { + ConsoleApp = "\"compiled.mach-o.executable\"", + WindowedApp = "wrapper.application", + StaticLib = "archive.ar", + SharedLib = "\"compiled.mach-o.dylib\"", + } + return types[node.cfg.kind] + end + + -- -- Returns true if the file name represents a framework. -- @@ -252,7 +289,7 @@ _p(3,');') _p(3,'name = %s;', name) if node.cfg.kind == "WindowedApp" then - _p(3,'productInstallPath = "$(HOME)/Applications";') + _p(3,'productInstallPath = "%s";', xcode.getinstallpath(node.cfg)) end _p(3,'productName = %s;', name) _p(3,'productReference = %s /* %s */;', node.id, node.name) @@ -384,11 +421,15 @@ end if tr.infoplist then - _p(4,'INFOPLIST_FILE = %s;', tr.infoplist.path) + _p(4,'INFOPLIST_FILE = "%s";', tr.infoplist.path) end _p(4,'PRODUCT_NAME = %s;', cfg.buildtarget.basename) + if cfg.kind == "WindowedApp" then + _p(4,'INSTALL_PATH = "%s";', xcode.getinstallpath(cfg)) + end + _p(4,'SYMROOT = %s;', cfg.objectsdir) _p(3,'};') _p(3,'name = %s;', cfg.name) diff --git a/src/actions/xcode/xcode_pbxproj.lua b/src/actions/xcode/xcode_pbxproj.lua deleted file mode 100644 index a335c72c..00000000 --- a/src/actions/xcode/xcode_pbxproj.lua +++ /dev/null @@ -1,229 +0,0 @@ --- --- xcode_pbxproj.lua --- Generate an Xcode project, which incorporates the entire Premake structure. --- Copyright (c) 2009 Jason Perkins and the Premake project --- - - local xcode = premake.xcode - local tree = premake.tree - - --- --- Create a solution tree corresponding to what is shown in the Xcode project --- browser pane, with nodes for files and folders, resources, frameworks, and --- products. --- --- @param sln --- The solution being generated. --- @returns --- A tree, loaded with metadata, which mirrors Xcode's view of the solution. --- - - function xcode.buildtree(sln) - local node - - -- create a solution level node and add each project to it; remember which - -- node goes with which project for later reference - local tr = tree.new(sln.name) - local prjnodes = {} - for prj in premake.solution.eachproject(sln) do - prjnodes[prj] = tree.insert(tr, premake.project.buildsourcetree(prj)) - end - - -- if there is only one project, use that as the tree root instead of the - -- solution. This avoids an otherwise empty level in the tree - if #tr.children == 1 then - tr = tr.children[1] - tr.parent = nil - end - tr.solution = sln - - -- 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 - }) - - -- the special folder "Frameworks" lists all of the frameworks used in the solution. - -- Only add it to the tree if there are frameworks in use. - tr.frameworks = tree.new("Frameworks") - frameworks = { } -- remember which frameworks have already been added - for prj in premake.solution.eachproject(sln) do - for cfg in premake.eachconfig(prj) do - for _, link in ipairs(cfg.links) do - local name = path.getname(link) - if xcode.isframework(name) and not frameworks[name] then - frameworks[name] = name - node = tree.insert(tr.frameworks, tree.new(name)) - node.path = link - end - end - end - end - - if #tr.frameworks.children > 0 then - tree.insert(tr, tr.frameworks) - end - - -- the special folder "Products" lists all of the generated targets, one target - -- for each target kind (ConsoleApp, SharedLibrary, etc.) produced by a project. - tr.products = tree.insert(tr, tree.new("Products")) - for prj in premake.solution.eachproject(sln) do - local kinds = {} -- remember which kinds have already been added - for cfg in premake.eachconfig(prj) do - if not kinds[cfg.kind] then - kinds[cfg.kind] = true - node = tree.insert(tr.products, tree.new(path.getname(cfg.buildtarget.bundlepath))) - node.kind = "product" - node.prjnode = prjnodes[prj] - node.cfg = cfg - node.path = cfg.buildtarget.fullpath - node.targetid = xcode.newid(node, "target") - node.cfgsection = xcode.newid(node, "cfg") - node.resstageid = xcode.newid(node, "rez") - node.sourcesid = xcode.newid(node, "src") - node.fxstageid = xcode.newid(node, "fxs") - - -- assign IDs for each configuration - node.configids = {} - for _, cfgname in ipairs(sln.configurations) do - node.configids[cfgname] = xcode.newid(node, cfgname) - end - end - end - end - - -- also assign solution-level configuration IDs - tr.configids = {} - for _, cfgname in ipairs(sln.configurations) do - tr.configids[cfgname] = xcode.newid(node, cfgname) - end - - -- Final setup - local prjnode - tree.traverse(tr, { - onnode = function(node) - if node.project then - prjnode = node - end - - -- 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 - - -- Premake is setup for the idea of a solution file referencing multiple project files, - -- but Xcode uses a single file for everything. Convert the file paths from project - -- location relative to solution (the one Xcode file) location relative to compensate. - if node.path then - node.path = xcode.rebase(prjnode.project, node.path) - end - - -- remember key files that are needed elsewhere - if node.name == "Info.plist" then - prjnode.infoplist = node - end - end - }, true) - - return tr - end - - - --- --- Return the Xcode target type, based on the target file extension. --- --- @param node --- The product node to identify. --- @returns --- An Xcode target type, string. --- - - function xcode.gettargettype(node) - local types = { - ConsoleApp = "\"compiled.mach-o.executable\"", - WindowedApp = "wrapper.application", - StaticLib = "archive.ar", - SharedLib = "\"compiled.mach-o.dylib\"", - } - return types[node.cfg.kind] - end - - --- --- Converts a path or list of paths from project-relative to solution-relative. --- --- @param prj --- The project containing the path. --- @param p --- A path or list of paths. --- @returns --- The rebased path or paths. --- - - function xcode.rebase(prj, p) - if type(p) == "string" then - return path.getrelative(prj.solution.location, path.join(prj.location, p)) - else - local result = { } - for i, v in ipairs(p) do - result[i] = xcode.rebase(p[i]) - end - return result - end - end - - - ---------------------------------------------------------------------------- --- Section generator functions, in the same order in which they appear --- in the .pbxproj file ---------------------------------------------------------------------------- - - - - ---------------------------------------------------------------------------- --- Xcode project generator function ---------------------------------------------------------------------------- - - function premake.xcode.pbxproj(sln) - tr = xcode.buildtree(sln) - xcode.Header(tr) -- done - xcode.PBXBuildFile(tr) -- done - xcode.PBXFileReference(tr) -- done - xcode.PBXFrameworksBuildPhase(tr) -- done - xcode.PBXGroup(tr) -- done - xcode.PBXNativeTarget(tr) -- done - xcode.PBXProject(tr) -- done - xcode.PBXResourcesBuildPhase(tr) - xcode.PBXSourcesBuildPhase(tr) - xcode.PBXVariantGroup(tr) - xcode.XCBuildConfiguration(tr) - xcode.XCBuildConfigurationList(tr) - xcode.Footer(tr) -- done - end diff --git a/src/actions/xcode/xcode_project.lua b/src/actions/xcode/xcode_project.lua index f3dfc257..ac755ef6 100644 --- a/src/actions/xcode/xcode_project.lua +++ b/src/actions/xcode/xcode_project.lua @@ -107,7 +107,7 @@ end -- remember key files that are needed elsewhere - if node.name == "Info.plist" then + if string.endswith(node.name, "Info.plist") then tr.infoplist = node end end diff --git a/tests/actions/test_xcode.lua b/tests/actions/test_xcode.lua deleted file mode 100644 index f6e6cd14..00000000 --- a/tests/actions/test_xcode.lua +++ /dev/null @@ -1,32 +0,0 @@ --- --- tests/actions/test_xcode.lua --- Automated test suite for the "clean" action. --- Copyright (c) 2009 Jason Perkins and the Premake project --- - - T.xcode3 = { } - local xcode = premake.xcode - - --- --- Setup --- - - local sln, tr - function T.xcode3.setup() - premake.action.set("xcode3") - -- reset the list of generated IDs - xcode.used_ids = { } - sln = test.createsolution() - end - - local function prepare() - io.capture() - premake.buildconfigs() - tr = xcode.buildtree(sln) - end - - - - - diff --git a/tests/actions/xcode/test_xcode_project.lua b/tests/actions/xcode/test_xcode_project.lua index 1ea3175c..34e1edc0 100644 --- a/tests/actions/xcode/test_xcode_project.lua +++ b/tests/actions/xcode/test_xcode_project.lua @@ -623,7 +623,7 @@ function suite.XCBuildConfigurationBlock_OnInfoPlist() - files { "Info.plist" } + files { "MyProject-Info.plist" } prepare() xcode.XCBuildConfigurationBlock(tr, tr.products.children[1], premake.getconfig(tr.project, "Debug")) test.capture [[ @@ -633,7 +633,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; - INFOPLIST_FILE = Info.plist; + INFOPLIST_FILE = "MyProject-Info.plist"; PRODUCT_NAME = MyProject; SYMROOT = obj/Debug; }; diff --git a/tests/premake4.lua b/tests/premake4.lua index 9119d2a2..5a52f874 100644 --- a/tests/premake4.lua +++ b/tests/premake4.lua @@ -64,8 +64,6 @@ -- Xcode tests dofile("actions/xcode/test_xcode_common.lua") dofile("actions/xcode/test_xcode_project.lua") - - dofile("actions/test_xcode.lua") --