cmake - 无法配置 CMake 来查找 Bison 的 Homebrew 安装版本

标签 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/binCMAKE_PROGRAM_PATH ,但是/usr/bin/bison无论如何总是首先被选择。如何强制 CMake 支持 Bison 可执行文件的 Homebrew 安装版本?

最佳答案

由于 Macos 中的某些内容依赖于 Apple 提供的 Flex 和 Bison 版本,因此 Homebrew 将它们作为“小桶”安装在用户正常的 $PATH 之外。手动解决方案是确保您(和您的用户)将程序的brew前缀添加到其路径中(可以通过运行brew --prefix bison等找到)。

一个自动解决方案是将此逻辑放入 CMake 文件中。一些开源项目已经像这样解决了这个问题。我能找到的最早的修复示例来自 this commit to 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)

关于cmake - 无法配置 CMake 来查找 Bison 的 Homebrew 安装版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53877344/

相关文章:

c - 在 flex 中使用 strdup()

c++ - Qt/CMake : missing ':' before identifier 'slots' `

c++ - 在 Visual Studio CMake 中设置默认编译器

build-automation - 如何使用cmake包含目录的所有文件?

python - 使用pyenv时如何为python安装libxml2

javascript - Jison 解析器中的语法错误

cmake - 如何为 qcc 编译器获取 cmake generate -std=c++14 标志

python - 切换 Homebrew 安装的 Python 版本 (3.9 → 3.8)

macos - 安装缺少的 ImageMagick 委托(delegate)库 - OSX 10.8

parsing - Bison 错误恢复