gpt4 book ai didi

cmake - 如何确定 ARM、MIPS 和 IA32 等平台?

转载 作者:行者123 更新时间:2023-12-04 21:06:46 25 4
gpt4 key购买 nike

我们的 CmakeFileList.txt file 中有些东西是横向的.它试图在 ARM 平台上构建一个 IA32 组件。我正在努力解决这个问题。

有问题的文件已从 GLOB 中过滤掉,名为 rdrand.cpp :

list(REMOVE_ITEM cryptopp_SOURCES
...
${CMAKE_CURRENT_SOURCE_DIR}/rdrand.cpp
...
${cryptopp_SOURCES_TEST}
)
set(cryptopp_SOURCES

现在我想添加 rdrand,cpp回到 IA32 平台。根据 Building c++ project on Windows with CMake, Clang and Ninja (不太合适,但它有有用的信息)和 CMakePlatformId.h.in ,看起来我需要一个使用 ARCHITECTURE_ID 的谓词和 "X86" , "X32" , "X64""x64" (不是重复,x 是小写而不是大写)。

这是我创建谓词的尝试:
# http://github.com/weidai11/cryptopp/issues/419
if (${ARCHITECTURE_ID} == "X86" OR ${ARCHITECTURE_ID} == "X32" OR ${ARCHITECTURE_ID} == "X64" )
list(APPEND cryptopp_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/rdrand.cpp)
endif()

下面的结果来自带有 Cmake 3.5.2 的 BeagleBoard。都没有 == , = , STREQUAL似乎工作:
CMake Error at CMakeLists.txt:310 (if):
if given arguments:

"==" "X86" "OR" "==" "X32" "OR" "==" "X64"

Unknown arguments specified

和:
$ cmake .
CMake Error at CMakeLists.txt:310 (if):
if given arguments:

"STREQUAL" "X86" "OR" "STREQUAL" "X32" "OR" "STREQUAL" "X64"

Unknown arguments specified

我试图搜索如何使用 ARCHITECTURE_ID几乎没用。我 can't find an examplethe docs on Cmake's site .在 "${ARCHITECTURE_ID}" 周围添加引号没有帮助;也没有删除大括号来表示变量 ARCHITECTURE_ID .

我也尝试使用 CMAKE_SYSTEM_PROCESSOR和其他相关定义,但 Cmake 主要为它们返回“未知”。至少可以说它不是很有帮助。

我如何使用 ARCHITECTURE_ID识别IA32平台?或者,在这种情况下我还应该使用其他什么东西吗?

提前致谢。

这是我们在 GNUmakefile 中所做的. Make 不是一个构建系统,所以我们必须做一些繁重的工作:
IS_X86 := $(shell uname -m | $(EGREP) -v "x86_64" | $(EGREP) -i -c "i.86|x86|i86")
IS_X64 := $(shell uname -m | $(EGREP) -i -c "(_64|d64)")
...

# Need RDRAND for X86/X64/X32
ifeq ($(IS_X86)$(IS_X32)$(IS_X64),000)
SRCS := $(filter-out rdrand.cpp, $(SRCS))
endif

最佳答案

  • 我不认为名为 ARCHITECTURE_ID 的变量确实存在于 CMake 中进行查询。这可能就是您在 CMake 的文档中找不到任何提示的原因。仅用于 CMakePlatformId.h填写 MSVC特定的内部变量,如 MSVC_CXX_ARCHITECTURE_ID .

    /* For windows compilers MSVC and Intel we can determine
    the architecture of the compiler being used. This is because
    the compilers do not have flags that can change the architecture,
    but rather depend on which compiler is being used
    */
  • 您实际上正在寻找的是 cmake_host_system_information() 命令。问题在于,它并没有导出它实际拥有的所有信息。我认为这是一个缺失的功能,可能会在接下来的几天内向 CMake 的源 Git 发出拉取请求以扩展其功能,但这在不久的将来对您没有帮助。

    如果您在相关系统上拥有 CMake 的源代码,则可以运行其中一项测试
     $ cmsysTestscxx testSystemInformation

    查看 CMake 实际拥有的系统信息。

    𝓝𝓸𝓽𝓮:在交叉编译或例如在 64 位机器上编译 32 位(这也可能是您的 GNUMakefile 示例中的一个缺陷)。
  • 回答您关于 if 的问题声明,这可以简单地通过 Regular Expression 解决:

    cmake_minimum_required(VERSION 2.4)

    project(TestArchitectureId)

    if (ARCHITECTURE_ID MATCHES "^(X86|X32|X64|x64)$" )
    message(STATUS "Hello ${CMAKE_MATCH_1}")
    endif()


  • 否则这不是与 Detect 32-bit x86 processor in CMakeList.txt?有些关系吗?

    替代品

    CMake 本身使用
    if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL "ia64")

    或者
    if(NOT CMAKE_GENERATOR MATCHES "IA64")

    或者 - 即使这可能会加倍努力 - 调用 try_compile()rdrand.cpp :

    # Choose a configuration for our compiler tests
    if (NOT CMAKE_CONFIGURATION_TYPES AND
    NOT CMAKE_NO_BUILD_TYPE)
    set(CMAKE_TRY_COMPILE_CONFIGURATION "${CMAKE_BUILD_TYPE}")
    else()
    set(CMAKE_TRY_COMPILE_CONFIGURATION RelWithDebInfo)
    endif()
    set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

    string(TOUPPER "${CMAKE_TRY_COMPILE_CONFIGURATION}" cryptopp_TRY_COMPILE_CONFIGURATION)
    set(CMAKE_REQUIRED_FLAGS "${CMAKE_CXX_FLAGS}" "${CMAKE_CXX_FLAGS_${cryptopp_TRY_COMPILE_CONFIGURATION}}")
    get_directory_property(CMAKE_REQUIRED_INCLUDES INCLUDE_DIRECTORIES)
    get_directory_property(CMAKE_REQUIRED_DEFINITIONS COMPILE_DEFINITIONS)
    if (CMAKE_REQUIRED_DEFINITIONS)
    string(REPLACE ";" ";-D" CMAKE_REQUIRED_DEFINITIONS "-D${CMAKE_REQUIRED_DEFINITIONS}")
    endif()

    try_compile(
    cryptopp_RDRAND_WORKS
    ${CMAKE_CURRENT_BINARY_DIR}
    SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/rdrand.cpp
    CMAKE_FLAGS
    -DCOMPILE_DEFINITIONS:STRING=${CMAKE_REQUIRED_FLAGS}
    -DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}
    COMPILE_DEFINITIONS
    ${CMAKE_REQUIRED_DEFINITIONS}
    )

    关于cmake - 如何确定 ARM、MIPS 和 IA32 等平台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43923444/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com