2016-09-14 6 views
0

-fPICの不足のためにerrors in our CMake makefilesがキャッチされています。彼女はci20 MIPS devのボードからの一つだ:CMakeList.txtの32ビットx86プロセッサを検出しますか?

... 
[ 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 

プロジェクトの方針は、圧力を登録するため、32ビットx86以外どこでも、私たちにPICです。つまり、x86_64、ARM-32、Aarch32、Aarch64、MIPS、MIPS64、UltraSparcなどはPICを取得します。

ターゲットプロセッサがCMAKE_SYSTEM_PROCESSORで提供されていると思います。私が抱えている問題は、ドキュメントが私に値を教えてくれないので、「32ビットx86ではない」テストを作る方法を理解することができないということです。

CMakeList.txtで32ビットx86プロセッサを検出するにはどうすればよいですか?

CMakeがCMAKE_SYSTEM_PROCESSORに設定するプロセッサの包括的なリストを見たいと思います。誰かがリストを持っているなら、それを提供することは素晴らしいでしょう。

答えて

1

私はおそらく、コンパイラの周りに何かを構築するでしょう。既存の変数/モジュールを使用して

近似値は次のようになります。

  • WIN32は、64ビットのWindowsコンパイラ/環境
  • CMAKE_SIZEOF_VOID_P GREATER 4に対して有効である:私がやっていること要するに

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

    「32ビットを超える」を確認します

  • 最後に、最大の前提があります:すべてのリトルエンディアンプロセッサ-fPIC

を設定することがより一般的なCMAKE_POSITION_INDEPENDENT_CODEを使用し

  • をベースのIntel/AMDように私は、より正確な方法は、あらかじめ定義されたマクロのテストを中心に何かを構築することです認めます。

    編集:追加されました。ここオルタナティブ

    を "定義済みマクロを調べるには、" 定義済みのマクロのためのより正確なチェックです:

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

    参照

  • +0

    ありがとうフロリアン。私は 'CMAKE_POSITION_INDEPENDENT_CODE'について知らなかった。私はそれを追加取得します。 – jww

    +0

    * "...すべてのリトルエンディアンプロセッサをインテルベースとして使用してください" * - これはちょっと緩んでください。私が扱うすべてのARMプロセッサはLEです。コーナーケースは、古いApple G5のPowerPCと言えます。そのBEであり、-fPIC(IIRC)が必要です。私はライブラリのBEビルドをテストするために、私の地下にG5の1つを持っています。 [Verizonがルータのポート転送を修正する](https://www.google.com/search?q=verizon+prt+forwarding+broke)、必要に応じてリモートSSHアクセスを提供できます。 PFは動作していましたが、VZは4XXシリーズのファームウェアアップデートでそれを壊しました。あなたは、あなたが好きなすべてのCMakeをテストすることができます:) – jww

    +0

    @jwwええ、私はよく知っている必要があります。そのために残念。はるかに正確な "定義済みx86マクロのチェック"バージョンを追加しました。それはそれを行う必要があります。 – Florian

    0

    これは、Windows以外のほとんどすべてで検出を実行すると考えています。 Windowsは-fPICを消費しないので、私には関係ありません。断片は、3つのスタックオーバーフローの答えから一緒に接着されました。

    # Stop hiding the damn output... 
    set(CMAKE_VERBOSE_MAKEFILE on) 
    
    # Enable PIC for all targets except Windows and 32-bit x86 
    if (NOT (WINDOWS OR WINDOWS_STORE OR WINDOWS_PHONE)) 
    
        set (UNAME_CMD "uname") 
        set (UNAME_ARG "-m") 
        execute_process(COMMAND ${UNAME_CMD} ${UNAME_ARG} 
         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} 
         RESULT_VARIABLE UNAME_RESULT 
         OUTPUT_VARIABLE UNAME_MACHINE) 
    
        # Use Regex; match i386, i486, i586 and i686 
        IF (NOT (${UNAME_MACHINE} MATCHES "i.86")) 
         # message(STATUS "Setting -fPIC for machine ${UNAME_MACHINE}") 
         if (CMAKE_VERSION VERSION_LESS 2.8.12) 
          add_definitions(-fPIC) 
         else() 
          add_compile_options(-fPIC) 
         endif() 
        endif() 
    endif() 
    

    あなたがuname -p戻りi386uname -mしばらく戻っx86_64、OS X上で、でも、例えばOS X上で、uname -m、そしてその大部分は正確に機械を得ます。私は10.6か10.7を思い出しているようだが、64ビットMacへの移行が少しばかり進んでいた。

    プロセッサーがuname -pになることがありますが、多くのdev-boardでは失敗します。たとえば、私のci20 dev-boardは、マシンの "mips"とプロセッサの "unknown"を返します。もう1つの例はLeMaker HiKeyです。マシンの "aarch64"とプロセッサの "unknown"を返します。


    私はまだCmakeが提供するプロセッサーの一覧を見たいと思います。

    関連する問題