如何在Xcode中为派生源禁用ARC?

时间:2013-06-15 08:07:21

标签: xcode bison flex-lexer

我正在移植一个编译器项目以使用自动引用计数。我不久前在Xcode中设置了这个项目,它继续在没有ARC的情况下在Xcode 4.6中构建并运行良好。现在我已将其中大部分内容移植到ARC,但我发现Bison和Flex生成的Objective-C文件需要禁用ARC。

(具体原因是因为YYSTYPEid我项目的ARC之前的版本。我可以将其声明为__unsafe_unretained id并且它将编译,但ARC编译的代码不会将对象放在自动释放池中,其生命周期与我的旧非ARC代码相同,因此它会在运行时崩溃。)

但是,我无法弄清楚如何为生成的文件禁用ARC。正常的过程是将--fno_objc_arc选项添加到Build Phases选项卡中的特定Objective-C文件。当我尝试将该选项添加到Flex和Bison源文件时,构建失败,因为Flex / Bison不理解该选项。

生成的文件位于DerivedSources目录中,由DERIVED_FILE_DIR变量指向。但它们不会出现在Xcode Project Navigator或Build Phases选项卡中。我无法将它们添加到项目中,因为调试和发布版本之间的路径不同。所以我不知道如何将--fno_objc_arc应用于他们。

有没有人有关于在Xcode中为Flex / Bison派生源设置每个文件构建选项的任何提示?

1 个答案:

答案 0 :(得分:3)

我想出了一个解决方法:

将Bison / Flex文件放在单独的Xcode目标中,并在该目标上禁用ARC。这个“Parser”目标构建了一个静态库。 Flex和Bison生成的Objective-C文件在此目标中编译。然后使该目标成为项目中主目标的依赖项,以便后者与解析器代码链接。

棘手的部分是使主要目标可以访问Flex和Bison生成的标头。人们不能将它们标记为“公共标题”,因为它们是生成的,而不是添加到项目中。因此,您需要将以下构建设置添加到主目标:

USER_HEADER_SEARCH_PATHS = $(CONFIGURATION_TEMP_DIR)/Parser.build/DerivedSources (其中“Parser”是构建Bison / Flex文件的静态库目标的名称)

此解决方案相当脆弱,因为它会在构建设置中对目标名称进行硬编码。如果有人有一个真正的解决方案来禁用衍生源上的ARC,请发布它。