cmake - 无法配置 CMake 以查找 Homebrew 安装的 Bison 版本
问题描述
我正在运行 macOS 10.14 并安装了bison
3.2 版brew
,但它拒绝链接:
$ brew link bison --force
Warning: Refusing to link macOS-provided software: bison
If you need to have bison first in your PATH run:
echo 'export PATH="/usr/local/opt/bison/bin:$PATH"' >> ~/.bash_profile
For compilers to find bison you may need to set:
export LDFLAGS="-L/usr/local/opt/bison/lib"
我CMakeLists.txt
的有以下几行:
find_package(BISON 3.2 REQUIRED)
...
message(STATUS "Found bison ${BISON_VERSION} at: ${BISON_EXECUTABLE}")
cmake
失败并显示以下输出:
Could NOT find BISON: Found unsuitable version "2.3", but required is at
least "3.2" (found /usr/bin/bison)
系统安装bison
的是 2.3 版,我知道 Homebrew 安装的版本是 3.2 版。
该FindBISON
模块显然使用了find_program
CMake 指令,我尝试添加/usr/local/opt/bison/bin
to CMAKE_PROGRAM_PATH
,但/usr/bin/bison
无论如何总是首先选择。如何强制 CMake 支持 Bison 可执行文件的 Homebrew 安装版本?
解决方案
由于 macos 中的某些内容依赖于 Apple 提供的 flex 和 bison 版本,因此 homebrew 将它们安装在用户正常之外的$PATH
“小桶”中。手动解决方案是确保您(和您的用户)将程序的 brew 前缀添加到他们的路径中(可以通过运行brew --prefix bison
等找到)。
一个自动的解决方案是将此逻辑放入您的 CMake 文件中。几个开源项目已经像这样解决了它。我能找到的最早的修复示例是从这个提交到 STP(复制下面的基本部分)。
搞砸所有这些时,请务必清除您的 CMake 缓存,因为BISON_EXECUTABLE
(等)已缓存。
# On macOS, search Homebrew for keg-only versions of Bison and Flex. Xcode does
# not provide new enough versions for us to use.
if (CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin")
execute_process(
COMMAND brew --prefix bison
RESULT_VARIABLE BREW_BISON
OUTPUT_VARIABLE BREW_BISON_PREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if (BREW_BISON EQUAL 0 AND EXISTS "${BREW_BISON_PREFIX}")
message(STATUS "Found Bison keg installed by Homebrew at ${BREW_BISON_PREFIX}")
set(BISON_EXECUTABLE "${BREW_BISON_PREFIX}/bin/bison")
endif()
execute_process(
COMMAND brew --prefix flex
RESULT_VARIABLE BREW_FLEX
OUTPUT_VARIABLE BREW_FLEX_PREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if (BREW_FLEX EQUAL 0 AND EXISTS "${BREW_FLEX_PREFIX}")
message(STATUS "Found Flex keg installed by Homebrew at ${BREW_FLEX_PREFIX}")
set(FLEX_EXECUTABLE "${BREW_FLEX_PREFIX}/bin/flex")
endif()
endif()
find_package(bison REQUIRED)
find_package(flex REQUIRED)
推荐阅读
- macos - 如何使用 SwiftUI 在 MacOS 上配置多选分段控制
- relative-path - 相对文件路径暗示不同的文件夹结构?
- android - 崩溃 github.com/siralam/LoopingViewPager Android 工作室
- elixir - 如何通过 Elixir 中的索引同时从列表中删除多个项目?
- vb.net - 如何为 AddressOf CalledBack 添加委托?
- python - Using Python Popen to run command with mulitple inputs
- html - 从 HTML 中的动态数组中选择一个随机元素
- sql - 使用嵌套过滤器(case 或 if 语句?)汇总库存的 SQL 查询
- javascript - 使用 vue.js 从 v-for 计算对象数组中的一些字段
- javascript - shinymobile App:如何在 javascript 中保存从网络摄像头拍摄的图像