在CMakeList.txt中检测到32位x86处理器? [英] Detect 32-bit x86 processor in CMakeList.txt?

查看:592
本文介绍了在CMakeList.txt中检测到32位x86处理器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由于缺少 -fPIC 错误 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()

参考




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/environments
  • CMAKE_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆