2016-11-16 8 views
0

私はアンドロイドndk13bから作られたスタンドアロンのツールチェーンを使用しています。それはうまく動作しますが、すべてのツール(リンカー、アーカイバなど)を見つけるために、ツールチェーンファイルにかなり詳細なセクションがあります。 凝縮させる方法はありますか?動作しませんでした何Cmakeクロスコンパイル:ツールを見つける

SET(COMPILER_PATH "<path_to_my_llvm_directory>") 

SET(CMAKE_TOOLCHAIN_PREFIX aarch64-linux-android-) #In theory should allow to find minor tools like ar and objdump, see http://stackoverflow.com/a/7032021/2436175 
find_program(CMAKE_C_COMPILER clang.cmd PATH ${COMPILER_PATH}) 
find_program(CMAKE_CXX_COMPILER clang++.cmd PATH ${COMPILER_PATH}) 
find_program(CMAKE_AR ${CMAKE_TOOLCHAIN_PREFIX}ar.exe PATHS ${COMPILER_PATH}) 
find_program(CMAKE_RANLIB ${CMAKE_TOOLCHAIN_PREFIX}ranlib.exe PATHS ${COMPILER_PATH}) 
find_program(CMAKE_LINKER ${CMAKE_TOOLCHAIN_PREFIX}ld.exe PATHS ${COMPILER_PATH}) 
find_program(CMAKE_NM ${CMAKE_TOOLCHAIN_PREFIX}nm.exe PATHS ${COMPILER_PATH}) 
find_program(CMAKE_OBJCOPY ${CMAKE_TOOLCHAIN_PREFIX}objcopy.exe PATHS ${COMPILER_PATH}) 
find_program(CMAKE_OBJDUMP ${CMAKE_TOOLCHAIN_PREFIX}objdump.exe PATHS ${COMPILER_PATH}) 
find_program(CMAKE_STRIP ${CMAKE_TOOLCHAIN_PREFIX}strip.exe PATHS ${COMPILER_PATH}) 

  • 明示的find_programを使用していない - >それは、${COMPILER_PATH}CMAKE_FIND_ROOT_PATHの設定
  • 私の道に私が持っているいくつかの他のmingwのツールチェーンからいくつかの他のツールを見つけました。その時点でコンパイラを見つけることさえできません。

私は find_programを見つけ注意を私は(++打ち鳴らすために同じ) SET(CMAKE_C_COMPILER ${COMPILER_PATH}/clang.cmd)で代わりにコンパイラを設定することであることを回避することができますが、それはまだ find_programと様々なフラグをしようとする他のツール
  • を見つけることができません、特にONLY_CMAKE_FIND_ROOT_PATH例えば、以下は動作しませんので、ツールを見つけるための唯一の回避策も:

    SET(CMAKE_AR ${COMPILER_PATH}/${CMAKE_TOOLCHAIN_PREFIX}ar.exe 
    

    (アーカイブ操作が失敗し、私は、変数が設定されていませんcmakeの-GUIから見ることができます)。

  • +0

    '... cmake-guiから変数が設定されていないことが分かります。 ' - ' cmake-gui'は*キャッシュされた変数のみを表示します。 'SET(CMAKE_AR ... CACHE PATH" Archiver ")'を使うことができます。 – Tsyvarev

    +0

    「凝縮させる方法はありますか?」それに幸運。 Cmakeは素晴らしいツールですが、構文と言語の振る舞いはゴミです。キットウェアがPythonで書かなかったのは本当に残念です(IMHO)。( –

    +0

    @RichardHodges私はPythonを持っていますが、私たちのソフトウェアを構築できるという理由だけで私の同僚にインストールするように頼んだのは、私たちの人生を楽にしてくれませんでした – Antonio

    答えて

    2

    最新のCMake 3.7リリースでは、Android NDKのサポートが非常に簡単になったという点が良いです。 Kitware Increases Android Support in CMake 3.7およびCross Compiling for Androidを参照してください。

    編集:私は正常にCMake 3.7(例えば、私のWindows PC上でrootにADKをインストール)でテストを実行している:

    toolchain.cmake

    set(CMAKE_SYSTEM_NAME Android) 
    set(CMAKE_SYSROOT "C:/android-ndk-r13b/platforms/android-24/arch-arm64") 
    

    そして、例えば使用をNinjaメイクファイルジェネレータ:

    > cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake -G "Ninja" .. 
    -- Android: Targeting API '24' with architecture 'arm64', ABI 'arm64-v8a', and processor 'aarch64' 
    -- Android: Selected GCC toolchain 'aarch64-linux-android-4.9' 
    -- The C compiler identification is GNU 4.9.0 
    -- The CXX compiler identification is GNU 4.9.0 
    

    私は、一般的に、最小限のツールチェーンファイルとしていくつかの良い経験をしてきました

    一般に簡体ツールチェイン - でキャッシュされた変数を使用して - あなたは、具体的なツールパスを指定する場合ツールチェーンファイル。 CMAKE_SYSTEM_NAMEを指定すると、クロスコンパイルを有効にするために不可欠であること

    set(CMAKE_SYSTEM_NAME Android) 
    set(CMAKE_SYSTEM_PROCESSOR arm) 
    
    set(CMAKE_C_COMPILER <path_to_my_llvm_directory>/clang.cmd) 
    set(CMAKE_C_COMPILER_TARGET aarch64-linux-android) 
    set(CMAKE_CXX_COMPILER <path_to_my_llvm_directory>/clang++.cmd) 
    set(CMAKE_CXX_COMPILER_TARGET aarch64-linux-android) 
    

    注:

    のようなものの中に、あなたのケースで翻訳しますCMakeののドキュメントからthis minimal exampleを参照してください。 CMAKE_ARを指定すると、あなたのCMAKE_AR問題について

    を働かなかったのはなぜ

    CMakeの自体がar.exeを見つけるためにfind_program()を使用しないことに注意してください。 find_program()はその結果をキャッシュするので、CMAKE_ARをキャッシュ変数として事前に埋めなければなりません(0013038: cannot set CMAKE_AR when cross-compiling Fortran-only project参照)。

    +0

    CMake 3.7のリリースは私の疑問と同期しているようです:)。これらの変数を設定してくれてありがとうございます。CMakeにllvmを使うように説得する方法はありません。これだけでは不十分です。 'set(CMAKE_C_COMPILER <コンパイラのフルパス> CACHE PATH" Cコンパイラ ")'。すべての場合、スタンドアローンのツールチェーンで利用できるgcc/g ++の使用を試みます。 – Antonio

    +0

    私が試みた特定の回避策では、CMakeは 'あなたのキャッシュを削除する必要がある変数を変更しました。 設定が再実行され、一部の変数をリセットする必要が生じる場合があります。 CMAKE_C_COMPILER = <私のフルパス> CMAKE_CXX_COMPILER = <私のフルパス>は、変数定義で選択した順序とは関係なく変更されています。 – Antonio

    +0

    @Antonio私は問題を再現できるかどうかを確認するために、最新のADKとCMakeのバージョンでいくつかのテストを実行しました。私はそれに応じて私の答えを今日遅く更新します。 CMAKE_C_COMPILER'や 'CMAKE_CXX_COMPILER'を変更した場合は、空のバイナリ出力ディレクトリからやり直すことをお勧めします(これは、ジェネレータを以下のように変更した場合とほぼ同じです)。中古)。 – Florian

    関連する問題