创建Xcode项目文件的乐趣

2021-04-26 10:46:13

Meson' S Xcode后端最初是在2014年写的,因此永远不会完全甚至足够适合日常使用。这对此的主要原因是当时我对Xcode&#39的文件格式感到非常沮丧,并且必须停止,因为继续将导致倦怠。它'只是那个令人不快。事实上,当我最初正在努力时,我自发地说过大声说出以下句子:

我没有认为这些话可以用直脸讲话。但他们是。

Xcode项目文件甚至不是A"构建文件格式"从某种意义此,它将是人类可以读取,理解和修改的构建设置的高级描述。相反,Xcode似乎具有内部企业质量对象模型,并且项目文件只是此数据结构以惯用json设计的-990语法序列化到磁盘。此格式称为Plist或属性列表。显然,甚至存在格式的XML版本,但幸运的是,我从未见过其中一个。 Plists至少是纯文本,所以你可以读写它们,但是充分地就像你可以' t有意义地差异,它必须使他们必须进行修改控制冲突的二进制文件。

未记录Xcode项目文件的语义。真正使用它们的唯一方法是使用Xcode本身或CMake来定义简单的项目,阅读生成的项目文件,然后尝试从其内容反转其内容。如果您发现错误,Xcode打印无用的错误消息。您可以获得最好的是它打印出错误发生的行号。通常它没有。

Xcode项目文件基本上是包装器字典中的单个对象字典。键是唯一ID,值是字典,含义整件是字符串变体包装词典,包含字符串变体词典字符串字典。没有静态键入,每个对象都包含一个isa键,它有一个字符串,讲述它是什么样的对象。 Xcode中的所有内容都是通过构建这些对象来定义的,然后通过其唯一的ID引用其他对象(除非ISN' t,稍后更多)来定义。

由于一切都有一个唯一的ID,因此合理的期望将是a)它将是唯一的,b)您将使用该ID来引用目标。这些都不是真的。例如,Let' s定义单个构建目标,其中在Xcode / Cmake Parlance中是一个PBXNATIVETARGET。由于Plist具有本机阵列类型,因此目标' s源可以列在文件的唯一ID数组中。相反,阵列包含对具有少量键的PBXSourcesBuildPhase对象的引用,该对象是无用的,始终相同的键和唯一ID数组。那些不指向文件对象,就像您期望的那样,但是对于pbxbuildfile对象,其内容如下所示:

此对象中没有其他数据。据我所知,它唯一的现有原因是指向包含文件系统路径的实际PBXFileReference对象。因此,每个文件实际上都获得了两个唯一ID,可以互换地使用' t。但为什么要停止两个?

为了使文件出现在Xcode'它需要更唯的ID。一个用于树窗口小部件,另一个它指向。虽然这是不够的,因为如果文件在两个不同的目标中使用,则无法重用相同的唯一ID(您可以在构建定义中,但不是在GUI定义中以使事情更加令人困惑。最终结果是,如果您有一个在两个不同的构建目标中使用的一个源文件,那么它至少可以获得四个不同的唯一ID号。

在某些情况下,Xcode不使用UID但文件名。除了构建目标外,Xcode还提供PBXAggregateTarget S,用于运行像代码生成的自定义构建步骤。这些步骤在PBXSheLScriptBuildPhase对象中定义,其输出阵列定义如下所示:

是的,那些是良好的旧文件系统路径。更好,它们被定义为$ DICE阵列而不是空间分隔的字符串的实际诚实。这太棒了!肯定意味着Xcode将在调用外部命令时正确地引用所有这些文件名。

如果您的文件名在其中有特殊字符(如,例如,Meson' Seets Suite通过设计,则可以手动引用它们。简单地添加双引号是不够的,因为它们被Plist解析器吞下。相反,您需要添加这样的引用引用字符:" \" foo bar \""看起来很简单,但如果你需要通过系统通过反斜杠,那就像你想将一些字符串定义为" foo \ bar&#34 ;?常见的智慧是" don' t做那个"但这是我们不具有的奢侈品,因为人们会期望它会在工作中,无论如何都在工作,并在失败时报告错误。

为了减少长期令人沮丧的调试会话短,解决方案是您需要用八个反斜杠替换每个反斜杠,然后它将工作。这意味着字符串由shell样的东西解释三次。我可以破译其中两个发生但第三个仍然是一个谜。任何其他数量的反斜杠都不工作,只会导致不可理解的错误消息。

快速迭代是令人愉快的发展经验的主要成分之一。不幸的是,Xcode不提供此用例。它实际上是痛苦的速度。基本的Meson测试套件包括大约240个样本项目。使用ninja后端时,需要10分钟才能配置,构建和运行所有这些测试。 Xcode后端需要24分钟才能执行此操作。当XcodeBuild启动它首先读取它的输入文件时,请仔细阅读控制台,然后读取其输入文件和#34;规划构建",暂停一段时间,然后开始工作。这种冻结似乎比Meson需要更长的时间来配置和生成项目文件。 XcodeBuild甚至用于只有一个构建目标和一个源文件的项目。它让您想知道它正在做什么以及如何花费几乎可以花费几次完整的第二个规划一个文件的构建。它还让您了解如何在业余时间随机编写的纯Python程序如何优于世界上最富有的公司创建的旗舰开发应用程序。

授予,这是一个非常罕见的案例,因为很少有人需要一直重新生成他们的项目文件。尽管如此,这种缓慢使得开发Xcode后端繁琐的工作。每次添加功能以修复一个测试用例时,您必须重新运行整个测试套件。这意味着沿着你的进一步变得越来越慢。到最后,我花了更多的时间在YouTube等待测试完成,而不是写作代码。

这是非常不合适的。 向后兼容性并不是苹果真的做的事情。 通常,您可以获得当前版本的支持,如果您真的很幸运,前一个。 然而,Xcode支持一直返回到2008的版本。事实上,这可能是苹果公司提供的最长向下兼容性故事的产品。 为什么是这样? 我们真的知道。 然而,成为构建系统的维护者意味着有时人们会告诉你的事情。 当然,这些事情可能是假的或制造的,所以以下只是猜测。 我当然没有任何证据。 无论如何似乎很多用于构建MacoS的基本代码都仅存在于年前的Xcode项目中。 此次项目的作者已经离开了公司,并且没有人触动这些项目,以担心打破事物。 如果是这将表明Xcode开发团队必须保持那些旧版本的工作。 无论。