2017-05-11 36 views
5

私たちはCmakeFileList.txt fileに何か横があります。 ARMプラットフォーム上にIA32コンポーネントを構築しようとしています。私はこの問題を解決しようとしています。ARM、MIPS、IA32などのプラットフォームを特定する方法は?

問題のファイルがrdrand.cpp命名されGLOB、から濾過アウトだった:

list(REMOVE_ITEM cryptopp_SOURCES 
     ... 
     ${CMAKE_CURRENT_SOURCE_DIR}/rdrand.cpp 
     ... 
     ${cryptopp_SOURCES_TEST} 
     ) 
set(cryptopp_SOURCES 

今私は戻ってIA32プラットフォーム用でrdrand,cppを追加しようとしています。私はARCHITECTURE_ID"X86""X32""X64"または"x64"(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 

そして:ARCHITECTURE_IDはほとんど役に立たない使用方法を検索するための

$ cmake . 
CMake Error at CMakeLists.txt:310 (if): 
    if given arguments: 

    "STREQUAL" "X86" "OR" "STREQUAL" "X32" "OR" "STREQUAL" "X64" 

    Unknown arguments specified 

私の試み。 I can't find an exampleまたはthe docs on Cmake's site"${ARCHITECTURE_ID}"の前後に引用符を付けることは役に立たなかった。変数ARCHITECTURE_IDを示すように中括弧も削除しませんでした。

また、CMAKE_SYSTEM_PROCESSORと他の関連する定義を使用しようとしましたが、Cmakeは大部分が"unknown"を返します。それはあまり意味がありません。

を使用してIA32プラットフォームを特定するにはどうすればよいですか?または、このインスタンスで使用する必要がある別のものがありますか?

ありがとうございます。


ここでは、GNUmakefileで行っていることがあります。ビルドシステムがないことを確認しますので、我々は重い物を持ち上げるをしなければならない:私はCMakeの中に存在しないARCHITECTURE_IDという名前の変数を照会するとは思わない

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 
+0

を明確にするために、私はIA32をしたいですこのルールはBSD、Linux、Unix、Solaris、OS X、Windowsの{x86 | x32 | x64}に適用されるためです。そして、CentOS 5とUbuntu 10で動作するものが必要です。 – jww

+0

変数の値を文字列と比較する適切な方法は 'if(ARCHITECTURE_ID STREQUAL" X86 ")'です。 – Tsyvarev

+0

ありがとう@Tsyvarev。 x86やx64マシンで 'ARCHITECTURE_ID STREQUAL" X86 "'が一致しないようです。 'ARCHITECTURE_ID STREQUAL" X64 "または" ARCHITECTURE_ID STREQUAL "x64" 'もどちらもしません。他のアイデア? – jww

答えて

2
  • 。これはおそらく、CMakeのドキュメントで何もヒントが見つからない理由です。 で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の機能を拡張するためのプルリクエストを作成するだろうが、それは近い将来あなたを助けるものではない。

    あなたは問題のシステム(S)上にCMakeのソースコードを持っている場合は、cmakeのは、実際に持っているもののシステム情報を参照する

    $ cmsysTestscxx testSystemInformation 
    

    テストのいずれかを実行することができます。

    :ホストシステムへのクエリは、クロスコンパイル時などに役立ちません。 64ビットマシンで32ビット用にコンパイルしてください(これは、GNUMakefileの例の可能性のある欠陥かもしれません)。

  • これは単にRegular Expressionによって解決することができ、if声明についての質問に答えるために:

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

そうでなければ、これはDetect 32-bit x86 processor in CMakeList.txt?

に多少は関係ありません代替品

CMakeの自体は

if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL "ia64") 

または

if(NOT CMAKE_GENERATOR MATCHES "IA64") 

または使用しています - をしても、これは余分なマイルを行くすることができる - rdrand.cpptry_compile()を呼び出します。

# 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} 
)  
関連する問題