【问题标题】:Building Verilator (C++) with CMake built-in NDK使用 CMake 内置 NDK 构建 Verilator (C++)
【发布时间】:2020-12-15 19:54:52
【问题描述】:

我尝试了this 示例,但没有任何反应:

cmake_minimum_required(VERSION 3.8)
project(cmake_simulator)

set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 21)
set(CMAKE_ANDROID_ARCH_ABI x86)
set(CMAKE_ANDROID_NDK /home/icarolima/Android/Sdk/ndk/21.3.6528147)
set(CMAKE_ANDROID_STL_TYPE gnustl_static)

set(CMAKE_TOOLCHAIN_FILE /home/icarolima/Android/Sdk/ndk/21.3.6528147/build/cmake/android.toolchain.cmake)

find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
if (NOT verilator_FOUND)
  message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
endif()

# Create a new executable target that will contain all your sources
add_library(simulator SHARED simulator.cpp)

# Add the Verilated circuit to the target
verilate(simulator
  INCLUDE_DIRS "."
  SOURCES top.sv
  VERILATOR_ARGS -Wno-CASEINCOMPLETE -Wno-WIDTH -Wno-COMBDLY -cc +1800-2012ext+sv)

例如,如果我将CMAKE_ANDROID_ARCH_ABI 更改为其他任何内容,则不会发生任何事情。就像 CMake 忽略了代码的 NDK 部分。

但是如果我将项目更改到另一个位置,就会发生不同的事情:

cmake_minimum_required(VERSION 3.8)

set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 21)
set(CMAKE_ANDROID_ARCH_ABI x86)
set(CMAKE_ANDROID_NDK /home/icarolima/Android/Sdk/ndk/21.3.6528147)
set(CMAKE_ANDROID_STL_TYPE gnustl_static)

project(cmake_simulator)

set(CMAKE_TOOLCHAIN_FILE /home/icarolima/Android/Sdk/ndk/21.3.6528147/build/cmake/android.toolchain.cmake)

find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
if (NOT verilator_FOUND)
  message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
endif()

# Create a new executable target that will contain all your sources
add_library(simulator SHARED simulator.cpp)

# Add the Verilated circuit to the target
verilate(simulator
  INCLUDE_DIRS "."
  SOURCES top.sv
  VERILATOR_ARGS -Wno-CASEINCOMPLETE -Wno-WIDTH -Wno-COMBDLY -cc +1800-2012ext+sv)

错误:

CMake Error at /home/icarolima/Android/Sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler-NDK.cmake:97 (message):
  Android: No toolchain for ABI 'x86' found in the NDK:

    /home/icarolima/Android/Sdk/ndk/21.3.6528147

我没有使用 CMake 的经验,我认为问题在于事物的顺序。谁能帮帮我?

【问题讨论】:

    标签: android c++ cmake android-ndk verilator


    【解决方案1】:

    设置所有这些变量(例如CMAKE_SYSTEM_NAMECMAKE_SYSTEM_VERSIONCMAKE_ANDROID_ARCH_ABI 等)应在工具链文件中进行。通过将这些放在 CMakeLists.txt 文件本身中,您肯定会遇到一些令人讨厌的 CMake 行为。您链接的 CMake 文档中甚至还有一个示例工具链文件 here

    另外,CMAKE_TOOLCHAIN_FILE 变量应该在调用cmake 时在命令行 上设置,而不是在CMake 文件本身中。这会将您的 CMakeLists.txt 文件缩减为以下内容:

    cmake_minimum_required(VERSION 3.8)
    
    project(cmake_simulator)
        
    find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
    if (NOT verilator_FOUND)
      message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
    endif()
    
    # Create a new executable target that will contain all your sources
    add_library(simulator SHARED simulator.cpp)
    
    # Add the Verilated circuit to the target
    verilate(simulator
      INCLUDE_DIRS "."
      SOURCES top.sv
      VERILATOR_ARGS -Wno-CASEINCOMPLETE -Wno-WIDTH -Wno-COMBDLY -cc +1800-2012ext+sv)
    

    然后,您应该调用cmake,指定要使用的工具链文件,如下所示:

    cmake -DCMAKE_TOOLCHAIN_FILE=/home/icarolima/Android/Sdk/ndk/21.3.6528147/build/cmake/android.toolchain.cmake ..
    

    【讨论】:

    • 那么如果我想指定ABI,我该怎么办?此外,使用这些参数调用 CMake 和此 CMakeLists.txt 会给我以下错误:CMake Error at CMakeLists.txt:27 (message): Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable 但是当我不设置 CMAKE_TOOLCHAIN_FILE 时不会发生此错误。
    • @ÍcaroDantasdeAraújoLima 正如我在回复中所建议的,您应该在 toolchain 文件中设置所有这些变量(例如 CMAKE_ANDROID_ARCH_ABI)。此外,正如错误所说,您必须首先在您的机器上安装 Verilator 软件,确保它与您在 CMake 中使用的编译器/架构相匹配。
    • 我发现发生了什么:我已经安装了 Verilator,问题描述为here
    • 我会将您的答案标记为已接受,然后我将使用完整的解决方案编辑我的问题,非常感谢!
    • @ÍcaroDantasdeAraújoLima 很高兴它正在工作!如果您有更完整的解决方案,请考虑撰写您自己的答案帖子,将完整的解决方案与您的问题分开记录。也可以随意将您的标记为已接受
    【解决方案2】:

    所以,澄清一下,我解决它的方法可以在这里看到:Dockerfile,在这里:sandbox_template

    感谢@squareskittles 的回答!

    【讨论】:

      猜你喜欢
      • 2013-10-13
      • 1970-01-01
      • 2018-11-04
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2017-03-04
      • 2019-06-25
      相关资源
      最近更新 更多