在CMakeList.txt中检测到32位x86处理器? [英] Detect 32-bit x86 processor in CMakeList.txt?
问题描述
由于缺少 -fPIC $ c $,我们在CMake生成文件中捕获了错误 c>。她是ci20 MIPS开发板上的一位:
...
[92 %]构建目标cryptopp-object
扫描目标cryptopp共享的
的依赖关系扫描目标cryptopp-static
的依赖关系链接CXX静态库libcryptopp.a
链接CXX共享库libcryptopp。因此
/ usr / bin / ld:CMakeFiles / cryptopp-object.dir / cryptlib.cpp.o:将R_MIPS_HI16相对于
本地符号进行重定位时,不能使用共享对象;用-fPIC
重新编译CMakeFiles / cryptopp-object.dir / cryptlib.cpp.o:无法读取符号:错误值
collect2:ld返回1退出状态
由于寄存器压力,除32位x86以外,该项目的政策一直对我们PIC有用。这意味着x86_64,ARM-32,Aarch32,Aarch64,MIPS,MIPS64,UltraSparc等将获得PIC。
我相信目标处理器在 CMAKE_SYSTEM_PROCESSOR
。我遇到的问题是文档没有告诉我这些值,因此我无法弄清楚如何制作非32位x86测试。
如何在CMakeList.txt中检测32位x86处理器?
更好的是,我希望看到CMake设置<$ c $的处理器的完整列表。 c> CMAKE_SYSTEM_PROCESSOR 到。
我可能会在编译器周围构建一些东西。 / p>
使用现有变量/模块的近似值是:
include(TestBigEndian)
if(不是WIN32)
TEST_BIG_ENDIAN(_bigendian)
if(((CMAKE_SIZEOF_VOID_P GREATER 4)OR(_bigendian))
消息(
STATUS正在设置$ {CMAKE_CXX_COMPILE_OPTIONS_PIC}
对于机器$ {CMAKE_HOST_SYSTEM_PROCESSOR}
)
set(CMAKE_POSITION_INDEPENDENT_CODE 1)
endif()
endif()
简而言之,我做了什么:
-
WIN32
也适用于64位Windows编译器/环境 -
CMAKE_SIZEOF_VOID_P GREATER 4
检查大于32位 - 最后一个是bigg最佳假设:将所有小的字节序处理器作为基于Intel / AMD的
- 使用更通用的
CMAKE_POSITION_INDEPENDENT_CODE
设置-fPIC
我承认更准确的方法是围绕预定义的宏测试构建一些东西。
编辑:添加了预定义宏检查选项
以下是对预定义宏的更精确的检查:
include(CheckCXXSourceCompiles)
if(CMAKE_CXX_COMPILE_OPTIONS_PIC)
set(
_preDefMacrosX86
__i386 __i386__ __i486__ __i586__ __i686__
_M_I86 _M_IX86 __X86__ _X86_ __THW_INTEL__
__I86__ __INTEL__ __386
)
set(_} foreach(_宏在列表中_preDefMacrosX86)
set(
_code
$ {_ code} \n\#ifdef $ {_ macro} \n\#error $ {_ macro}已定义\ n\#endif
)
endforeach()
CHECK_CXX_SOURCE_COMPILES( $ {_ code} _canCompileX86DoesFailCheck)
if((CMAKE_SIZEOF_VOID_P GREATER 4)OR(_canCompileX86Does ))
消息(状态正在设置$ {CMAKE_CXX_COMPILE_OPTIONS_PIC}))
set(CMAKE_POSITION_INDEPENDENT_CODE 1)
endif()
endif()
参考
- < a href = https://stackoverflow.com/questions/39258250/how-to-detect-if-64-bit-msvc-with-cmake>如何使用cmake检测64位MSVC?
- 检测CPU体系结构的编译时间
We are catching errors in our CMake makefiles due to lack of -fPIC
. Her's one from a ci20 MIPS dev-board:
...
[ 92%] Built target cryptopp-object
Scanning dependencies of target cryptopp-shared
Scanning dependencies of target cryptopp-static
Linking CXX static library libcryptopp.a
Linking CXX shared library libcryptopp.so
/usr/bin/ld: CMakeFiles/cryptopp-object.dir/cryptlib.cpp.o: relocation R_MIPS_HI16 against
`a local symbol' can not be used when making a shared object; recompile with -fPIC
CMakeFiles/cryptopp-object.dir/cryptlib.cpp.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
The project's policy is to us PIC everywhere except 32-bit x86 due to register pressures. That means x86_64, ARM-32, Aarch32, Aarch64, MIPS, MIPS64, UltraSparc, etc get PIC.
I believe the target processor is provided in CMAKE_SYSTEM_PROCESSOR
. The problem I am having is the docs don't tell me the values, so I can't figure out how to craft a "not 32-bit x86" test.
How do I detect 32-bit x86 processor in CMakeList.txt?
Even better, I would like to see a comprehensive list of processors that CMake sets CMAKE_SYSTEM_PROCESSOR
to. If anyone has the list, then it would be great to provide it.
I probably would build something around the compiler.
A close approximation using existing variables/modules would be:
include(TestBigEndian)
if (NOT WIN32)
TEST_BIG_ENDIAN(_bigendian)
if((CMAKE_SIZEOF_VOID_P GREATER 4) OR (_bigendian))
message(
STATUS "Setting ${CMAKE_CXX_COMPILE_OPTIONS_PIC} "
"for machine ${CMAKE_HOST_SYSTEM_PROCESSOR}"
)
set(CMAKE_POSITION_INDEPENDENT_CODE 1)
endif()
endif()
In short what I have done:
WIN32
is also valid for 64 Bit Windows compilers/environmentsCMAKE_SIZEOF_VOID_P GREATER 4
checks for "greater then 32 Bit"- The last is the biggest assumption: take all little endian processors as Intel/AMD based
- Used more generic
CMAKE_POSITION_INDEPENDENT_CODE
to set-fPIC
I admit a more accurate method would be to build something around a pre-defined macros test.
Edit: Added "Predefined Macros Check" Alternative
Here is the more precise check for predefined macros:
include(CheckCXXSourceCompiles)
if (CMAKE_CXX_COMPILE_OPTIONS_PIC)
set(
_preDefMacrosX86
__i386 __i386__ __i486__ __i586__ __i686__
_M_I86 _M_IX86 __X86__ _X86_ __THW_INTEL__
__I86__ __INTEL__ __386
)
set(_code "void main() {}")
foreach(_macro IN LISTS _preDefMacrosX86)
set(
_code
"${_code}\n\#ifdef ${_macro}\n\#error ${_macro} is defined\n\#endif"
)
endforeach()
CHECK_CXX_SOURCE_COMPILES("${_code}" _canCompileX86DoesFailCheck)
if((CMAKE_SIZEOF_VOID_P GREATER 4) OR (_canCompileX86DoesFailCheck))
message(STATUS "Setting ${CMAKE_CXX_COMPILE_OPTIONS_PIC}")
set(CMAKE_POSITION_INDEPENDENT_CODE 1)
endif()
endif()
References
这篇关于在CMakeList.txt中检测到32位x86处理器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!