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 设置用于您要使用的标志。
我在 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 设置用于您要使用的标志。