summaryrefslogtreecommitdiff
path: root/xmake/plugins/project/xcode/pbxproj.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2025-07-02 22:47:13 +0800
committerruki <[email protected]>2025-07-02 22:47:13 +0800
commitcc50f4503c1b7159fdabe89429844ec6ca8eea1f (patch)
tree367da67b893f601348bd63531df4ef3aeb17c01e /xmake/plugins/project/xcode/pbxproj.lua
parentb1d2fc1295e85eb6773aa209ed19f6e6d2f21141 (diff)
rename xcode2 to xcode
Diffstat (limited to 'xmake/plugins/project/xcode/pbxproj.lua')
-rw-r--r--xmake/plugins/project/xcode/pbxproj.lua271
1 files changed, 271 insertions, 0 deletions
diff --git a/xmake/plugins/project/xcode/pbxproj.lua b/xmake/plugins/project/xcode/pbxproj.lua
new file mode 100644
index 000000000..ef2d73abf
--- /dev/null
+++ b/xmake/plugins/project/xcode/pbxproj.lua
@@ -0,0 +1,271 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-present, TBOOX Open Source Group.
+--
+-- @author JXMaster
+-- @file pbxproj.lua
+--
+
+-- imports
+import("core.project.config")
+import("core.project.project")
+
+function _write_file_if_needed(file, content)
+ if os.isfile(file) and io.readfile(file) == content then
+ dprint("skipped file %s since the file has the same content", path.relative(file))
+ return
+ end
+ -- we need utf8 with bom encoding for unicode
+ -- @see https://github.com/xmake-io/xmake/issues/1689
+ io.writefile(file, content, {encoding = "utf8"})
+end
+
+function _write_section_PBXFileReference(info, lines)
+ table.insert(lines, "/* Begin PBXFileReference section */")
+ for uuid, obj in table.orderpairs(info.sections.PBXFileReference) do
+ table.insert(lines, "\t\t" .. uuid .. " = {")
+ table.insert(lines, "\t\t\tisa = PBXFileReference;")
+ if obj.explicitFileType then
+ table.insert(lines, "\t\t\texplicitFileType = \"" .. obj.explicitFileType .. "\";")
+ end
+ if obj.lastKnownFileType then
+ table.insert(lines, "\t\t\tlastKnownFileType = \"" .. obj.lastKnownFileType .. "\";")
+ end
+ if obj.includeInIndex then
+ table.insert(lines, "\t\t\tincludeInIndex = " .. obj.includeInIndex .. ";")
+ end
+ if obj.name then
+ table.insert(lines, "\t\t\tname = \"" .. obj.name .. "\";")
+ end
+ if obj.path then
+ table.insert(lines, "\t\t\tpath = \"" .. obj.path .. "\";")
+ end
+ if obj.sourceTree then
+ table.insert(lines, "\t\t\tsourceTree = " .. obj.sourceTree .. ";")
+ end
+ table.insert(lines, "\t\t};")
+ end
+ table.insert(lines, "/* End PBXFileReference section */")
+end
+
+function _write_section_PBXGroup(info, lines)
+ table.insert(lines, "/* Begin PBXGroup section */")
+ for uuid, obj in table.orderpairs(info.sections.PBXGroup) do
+ table.insert(lines, "\t\t" .. uuid .. " = {")
+ table.insert(lines, "\t\t\tisa = PBXGroup;")
+ if obj.name then
+ table.insert(lines, "\t\t\tname = \"" .. obj.name .. "\";")
+ end
+ table.insert(lines, "\t\t\tchildren = (")
+ for _, child in ipairs(obj.children) do
+ local child_obj = info.sections.PBXFileReference[child]
+ if child_obj == nil then
+ child_obj = info.sections.PBXGroup[child]
+ end
+ local child_name
+ if child_obj then
+ child_name = child_obj.name
+ end
+ if child_name == nil then
+ child_name = ""
+ end
+ table.insert(lines, "\t\t\t\t" .. child .. " /* " .. child_name .. " */,")
+ end
+ table.insert(lines, "\t\t\t);")
+ table.insert(lines, "\t\t\tsourceTree = \"" .. obj.sourceTree .. "\";")
+ table.insert(lines, "\t\t};")
+ end
+ table.insert(lines, "/* End PBXGroup section */")
+end
+
+function _write_section_PBXNativeTarget(info, lines)
+ table.insert(lines, "/* Begin PBXNativeTarget section */")
+ for uuid, obj in table.orderpairs(info.sections.PBXNativeTarget) do
+ table.insert(lines, "\t\t" .. uuid .. " /* " .. obj.name .. " */ = {")
+ table.insert(lines, "\t\t\tisa = PBXNativeTarget;")
+ table.insert(lines, "\t\t\tbuildConfigurationList = " .. obj.buildConfigurationList .. " /* Build configuration list for PBXNativeTarget \"" .. obj.name .. "\" */;")
+ table.insert(lines, "\t\t\tbuildPhases = (")
+ for _, build_phase_uuid in ipairs(obj.buildPhases) do
+ table.insert(lines, "\t\t\t\t" .. build_phase_uuid .. ",")
+ end
+ table.insert(lines, "\t\t\t);")
+ table.insert(lines, "\t\t\tbuildRules = (")
+ table.insert(lines, "\t\t\t);")
+ table.insert(lines, "\t\t\tdependencies = (")
+ table.insert(lines, "\t\t\t);")
+ table.insert(lines, "\t\t\tname = " .. obj.name .. ";")
+ table.insert(lines, "\t\t\tpackageProductDependencies = (")
+ table.insert(lines, "\t\t\t);")
+ table.insert(lines, "\t\t\tproductName = " .. obj.productName .. ";")
+ local product_reference_name
+ local product_reference_obj = info.sections.PBXFileReference[obj.productReference]
+ if product_reference_obj then
+ product_reference_name = product_reference_obj.name
+ end
+ if product_reference_name == nil then
+ product_reference_name = ""
+ end
+ table.insert(lines, "\t\t\tproductReference = " .. obj.productReference .. " /* " .. product_reference_name .. " */;")
+ table.insert(lines, "\t\t\tproductType = " .. obj.productType .. ";")
+ table.insert(lines, "\t\t};")
+ end
+ table.insert(lines, "/* End PBXNativeTarget section */")
+end
+
+function _write_section_PBXProject(info, lines)
+ table.insert(lines, "/* Begin PBXProject section */")
+ for uuid, obj in table.orderpairs(info.sections.PBXProject) do
+ table.insert(lines, "\t\t" .. uuid .. " /* Project object */ = {")
+ table.insert(lines, "\t\t\tisa = PBXProject;")
+ table.insert(lines, [[
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ };]])
+ table.insert(lines, "\t\t\tbuildConfigurationList = " .. obj.buildConfigurationList .. " /* Build configuration list for PBXProject */;")
+ table.insert(lines, [[
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );]])
+ table.insert(lines, "mainGroup = " .. obj.mainGroup .. ";")
+ table.insert(lines, [[
+ minimizedProjectReferenceProxies = 1;
+ preferredProjectObjectVersion = 77;]])
+ table.insert(lines, "productRefGroup = " .. obj.productRefGroup .. ";")
+ table.insert(lines, [[
+ projectDirPath = "";
+ projectRoot = "";]])
+ table.insert(lines, "\t\t\ttargets = (")
+ for _, target_uuid in ipairs(obj.targets) do
+ table.insert(lines, "\t\t\t\t" .. target_uuid .. " /* " .. info.sections.PBXNativeTarget[target_uuid].name .. " */,")
+ end
+ table.insert(lines, "\t\t\t);")
+ table.insert(lines, "\t\t};")
+ end
+ table.insert(lines, "/* End PBXProject section */")
+end
+
+function _write_section_PBXShellScriptBuildPhase(info, lines)
+ table.insert(lines, "/* Begin PBXShellScriptBuildPhase section */")
+ for uuid, obj in table.orderpairs(info.sections.PBXShellScriptBuildPhase) do
+ table.insert(lines, "\t\t" .. uuid .. " /* Run Xmake Build Command */ = {")
+ table.insert(lines, [[
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ );
+ name = "Xmake Build";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "]] .. obj.shellScript .. "\";")
+ table.insert(lines, "\t\t};")
+ end
+ table.insert(lines, "/* End PBXShellScriptBuildPhase section */")
+end
+
+function _write_section_XCBuildConfiguration(info, lines)
+ table.insert(lines, "/* Begin XCBuildConfiguration section */")
+ for uuid, obj in table.orderpairs(info.sections.XCBuildConfiguration) do
+ table.insert(lines, "\t\t" .. uuid .. " /* " .. obj.name .. " */ = {")
+ table.insert(lines, [[
+ isa = XCBuildConfiguration;
+ buildSettings = {]])
+ for k, v in pairs(obj.buildSettings) do
+ local string_value = ""
+ if v == true then
+ string_value = "YES"
+ elseif v == false then
+ string_value = "NO"
+ elseif type(v) == "string" then
+ string_value = v
+ elseif type(v) == "number" then
+ string_value = tostring(v)
+ end
+ table.insert(lines, "\t\t\t\t" .. k .. " = " .. string_value .. ";")
+ end
+ table.insert(lines, [[
+ };
+ name = ]] .. obj.name .. ";")
+ table.insert(lines, "\t\t};")
+ end
+ table.insert(lines, "/* End XCBuildConfiguration section */")
+end
+
+function _write_section_XCConfigurationList(info, lines)
+ table.insert(lines, "/* Begin XCConfigurationList section */")
+ for uuid, obj in table.orderpairs(info.sections.XCConfigurationList) do
+ table.insert(lines, "\t\t" .. uuid .. " = {")
+ table.insert(lines, [[
+ isa = XCConfigurationList;
+ buildConfigurations = (]])
+ for _, build_config in ipairs(obj.buildConfigurations) do
+ table.insert(lines, "\t\t\t\t" .. build_config .. " /* " .. info.sections.XCBuildConfiguration[build_config].name .. " */,")
+ end
+ table.insert(lines, [[
+ );
+ defaultConfigurationIsVisible = 0;]])
+ table.insert(lines, "\t\t};")
+ end
+ table.insert(lines, "/* End XCConfigurationList section */")
+end
+
+local write_section_funcs = {
+ _write_section_PBXFileReference,
+ _write_section_PBXGroup,
+ _write_section_PBXNativeTarget,
+ _write_section_PBXProject,
+ _write_section_PBXShellScriptBuildPhase,
+ _write_section_XCBuildConfiguration,
+ _write_section_XCConfigurationList
+}
+
+function _write_pbxproj(info)
+ local lines = {}
+ table.insert(lines, [[// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 77;
+ objects = {
+]])
+ -- write sections.
+ for _, write_section in ipairs(write_section_funcs) do
+ write_section(info, lines)
+ end
+
+ table.insert(lines,
+[[ };
+ rootObject = ]] .. info.root_object .. [[ /* Project object */;
+}]])
+ return table.concat(lines, "\n") .. "\n"
+end
+
+function main(info)
+ local content = _write_pbxproj(info)
+ local file_name = path.join(info.project_dir, info.project_bundle, "project.pbxproj")
+ _write_file_if_needed(file_name, content)
+end