如何确定ARM,MIPS和IA32等平台?

时间:2017-05-11 18:49:19

标签: cmake x86 platform

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

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

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

现在我正在尝试为IA32平台添加rdrand,cpp。根据{{​​3}}(不太合适,但它包含有用的信息)和Building c++ project on Windows with CMake, Clang and Ninja,看起来我需要使用ARCHITECTURE_ID"X86""X32"的谓词},"X64""x64"(不是dup,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()

以下结果来自BeagleBoard和Cmake 3.5.2。 ===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几乎没用。我CMakePlatformId.h.incan't find an example。在"${ARCHITECTURE_ID}"附近添加引号无济于事;也没有删除大括号来表示变量ARCHITECTURE_ID

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

如何使用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

1 个答案:

答案 0 :(得分:2)

  • 我不认为CMake中存在名为ARCHITECTURE_ID的变量来查询。这可能是您无法在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}
)