如何确定像ARM,MIPS和IA32这样的平台?



我们的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

现在我正在尝试为 IA32 平台重新添加rdrand,cpp。根据使用 CMake、Clang 和 Ninja 在 Windows 上构建 c++ 项目(不太合适,但它有有用的信息)和 CMakePlatformId.h.in,看起来我需要一个使用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()

下面的结果来自带有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几乎毫无用处。我在 Cmake 的网站上找不到示例或文档。在"${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
  • 我认为 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语句的问题,可以通过正则表达式简单地解决:

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

否则,这与CMakeList.txt中的检测32位x86处理器无关吗?

选择

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}
)    

最新更新