Xcode 如何使用不同版本的 Bison?

3

我在Xcode项目中使用Bison和Flex。我不想将生成的文件放在源代码控制下,所以很高兴发现Xcode原生支持Bison/Flex文件,在其派生数据文件夹中即时生成解析器。到目前为止一切顺利。

然而,Xcode使用的是嵌入式旧版Bison(2.3):

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/yacc

这个版本的bison还不支持%define api.pure full指令。由于这个bison可执行文件在Xcode.app包中,我无法替换它,所以我通过Brew安装了最新版本,并将其添加到我的$PATH中,通过~/.bash_profile~/.bashrcsource我的bash配置文件)。因此,在bash中,我可以输入以下命令:

$ which bison
/usr/local/Cellar/bison/3.0.4/bin//bison

然而,Xcode仍然使用它自己的版本...我想内部bison的路径是硬编码的。
我的第二个方法是为Yacc文件创建自定义构建规则,并从那里运行正确版本的bison。这一次的问题是,当Xcode运行我的自定义构建规则时,它立即尝试构建生成的C文件。但是生成的C文件将依赖于Flex尚未生成的标头文件,因为例如yyscan_t在其中声明(由Bison在生成的C文件中使用)。但另一方面,Flex生成的C文件也包括Bison生成的标头,因此先使用Flex进行编译没有帮助...
我需要的是首先只生成Flex和Bison标头/源文件,然后与项目的其余部分一起构建它们。
我该如何实现这一点?

你能直接编辑构建规则吗? - rici
4个回答

2
我通过将*.l*.y文件放入*.parser文件夹并将该文件夹添加到项目中来解决了这个问题。然后,我删除了*.l*.y 文件,将该文件夹添加到已编译的源代码中:

compile sources phase

然后,我为*.parser创建了一个构建规则,如下所示:

build rule for *.parser

这使我能够首先运行yacc和lex,然后将生成的*.cpp文件传递给编译步骤。


1
谢谢,当我遇到同样的问题时,这篇文章给了我帮助。仍然适用于XCode 10.1。需要注意的是,一开始我尝试将文件夹添加到我的项目文件中。但这行不通,因为XCode仍然会退回到Lex规则,因为.l文件仍然作为项目的一部分。只有当您将文件夹添加到“编译源”构建阶段时才起作用。如果Xcode开发人员使Lex构建规则可编辑,这将更容易。但我不知道它如何处理您首先想要编译所有.y文件,然后才是.l文件的依赖关系。 - RetepV

1
如果您前往构建目标、构建阶段,并在带有搜索框的栏上点击 +,则可以添加新的运行脚本阶段。然后,您可以将其拖到当前编译源代码阶段之上。您可以在该脚本阶段中执行任何操作,并且它将在编译开始之前运行。

Xcode build target


好的计划...但是一个自定义的构建规则(覆盖系统Yacc规则),而不是一个自定义的构建阶段,可能更有意义,因为这样它可以自动应用于所有yacc文件。 - rickster
@rickster OP说那个方法不起作用:“我的第二种方法是为Yacc文件创建自定义构建规则…” - Ewan Mellor
是的,但我希望生成的文件可以与其他文件一起编译,就像它们在“编译源代码”阶段一样。但由于它们是即时生成的,我不知道如何将它们添加到编译阶段。你知道有什么方法吗? - Tamás Zahola

1
这有点复杂,但如果我再回来的话,我会想看到答案。
从XCode 12(可能更早)开始,答案非常简单。
(1)进入构建设置 (2a)按下+以获取全新的设置变量。 (2b)将名称更改为YACC,并将其值更改为/usr/local/bin/bison(或者您需要Homebrew的其他路径)。
(3a)按下+以获取全新的设置变量。 (3b)将名称更改为LEX,并将其值更改为/usr/local/bin/flex(或者您需要Homebrew的其他路径)。
(4+)使用YACC / LEX设置作为您想要使用的标志。

Build Settings


1
太好了!谢谢! - Tamás Zahola
因此需要使用-y选项,以便文件名与yacc兼容(这是Xcode所期望的)-但bison仍然可以正确编译-只是会为额外的功能输出“不兼容性”警告。 - Konchog

0

我已经通过自定义构建规则成功实现了它,使用的是从brew安装的bison和macOS自带的flex,而不是Xcode捆绑的那个。我不确定我的问题是否与你的相同,但如果你想看一下,我的项目在GitHub上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接