Xcode 使用不同的野牛

Xcode use different Bison

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

但是,Xcode 使用嵌入式旧 Bison 版本 (2.3):

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

尚不支持 %define api.pure full 指令。由于这个 bison 可执行文件在 Xcode.app 包下,我无法替换它,所以我通过 Brew 安装了最新版本,并将它添加到我的 $PATH~/.bash_profile (~/.bashrc还有 source 我的 bash 个人资料)。所以在 bash 我可以说:

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

然而,Xcode 仍然使用它自己的版本...我想内部野牛的路径是硬编码的。

我的第二种方法是为 Yacc 文件创建自定义构建规则,然后 运行 从那里创建正确版本的 bison。这次的问题是,作为 Xcode 运行 我的自定义构建规则,它会立即尝试构建生成的 C 文件。然而,生成的 C 文件将取决于尚未由 Flex 生成的头文件,因为那是例如yyscan_t 已声明(由 Bison 在生成的 C 文件中使用)。但另一方面,Flex 生成的 C 文件也包含 Bison 生成的头文件,所以先用 Flex 编译也无济于事...

我需要的是首先仅生成 Flex 和 Bison headers/sources,然后将它们与项目的其余部分一起构建。

我怎样才能做到这一点?

如果您转到构建目标、构建阶段,然后单击带有搜索框的栏上的 +,您可以添加一个新的 运行 脚本阶段。然后,您可以将其拖到当前的编译源阶段上方。你可以在那个脚本阶段做任何你想做的事,它会在编译开始前运行。

我设法通过将 *.l*.y 文件放在 *.parser 文件夹下并将该文件夹添加到项目中来解决问题。然后我删除了 *.l*.y 文件,将 文件夹 添加到编译源中:

然后为 *.parser 制定构建规则,如下所示:

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

我已经设法使用自定义构建规则来做到这一点,使用从 brew 安装的 bison 和 macOS 附带的 flex,而不是 [=16= 捆绑的那个].我不确定我的问题是否和你的一样,但如果你想看看我的项目在 GitHub.

这有点僵尸,但如果我再次回到这里,我会想看到答案。

当然从 XCode 12(可能之前)开始,答案非常简单。

(1) 转到构建设置 (2a) 按 + 获取全新的设置变量。 (2b) 将 NAME 更改为 YACC,并将其 VALUE 更改为 /usr/local/bin/bison(或任何您需要的 brew 路径)。

(3a) 按 + 获取全新的设置变量。 (3b) 将 NAME 更改为 LEX,并将其 VALUE 更改为 /usr/local/bin/flex(或任何您需要的 brew 路径)。

(4+) 将 YACC/LEX 设置用于您要使用的标志。