jww*_*jww 5 x86 platform cmake
我们的东西是横向的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
Run Code Online (Sandbox Code Playgroud)
现在我想重新加入rdrand,cppIA32平台.据与CMake的,锵和忍者在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()
Run Code Online (Sandbox Code Playgroud)
以下结果来自BeagleBoard和Cmake 3.5.2.无论是==,=,STREQUAL似乎工作:
CMake Error at CMakeLists.txt:310 (if):
if given arguments:
"==" "X86" "OR" "==" "X32" "OR" "==" "X64"
Unknown arguments specified
Run Code Online (Sandbox Code Playgroud)
和:
$ cmake .
CMake Error at CMakeLists.txt:310 (if):
if given arguments:
"STREQUAL" "X86" "OR" "STREQUAL" "X32" "OR" "STREQUAL" "X64"
Unknown arguments specified
Run Code Online (Sandbox Code Playgroud)
我试图搜索如何使用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
Run Code Online (Sandbox Code Playgroud)
我认为 CMake 中不存在名为 的变量可供ARCHITECTURE_ID查询。这可能就是为什么你在 CMake 的文档中找不到任何提示的原因。它仅用于CMakePlatformId.h填充MSVC特定的内部变量,例如MSVC_CXX_ARCHITECTURE_ID.
Run Code Online (Sandbox Code Playgroud)/* 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
Run Code Online (Sandbox Code Playgroud)
查看 CMake 实际有哪些系统信息。
:在交叉编译或例如在 64 位计算机上编译 32 位时,查询主机系统不会有帮助(这也可能是您的GNUMakefile示例中的一个可能的缺陷)。
要回答有关该语句的问题,可以简单地通过正则表达式if来解决:
/* 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
*/
Run Code Online (Sandbox Code Playgroud)否则这不是与CMakeList.txt 中的 Detect 32-bit x86 process 有点关系吗?
备择方案
CMake本身使用
if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL "ia64")
Run Code Online (Sandbox Code Playgroud)
或者
if(NOT CMAKE_GENERATOR MATCHES "IA64")
Run Code Online (Sandbox Code Playgroud)
或者 - 即使这可能会加倍努力 -try_compile()致电rdrand.cpp:
$ cmsysTestscxx testSystemInformation
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1025 次 |
| 最近记录: |