2016-09-02 11 views
0

CMakeLists.txtメインファイルにあるので、問題が発生したときに実行する次の行があります。cmake:インストール時にcmakeコマンドを実行します。

set (git_cmd git) 
set (git_arg rev-parse --verify HEAD) 
message(STATUS \"git cmd: ${git_cmd}\") 
execute_process(COMMAND ${git_cmd} ${git_arg} 
    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} 
    RESULT_VARIABLE git_result 
    OUTPUT_VARIABLE git_ver) 

message(STATUS \"git ver[${git_result}]: ${git_ver}\") 

と私はcmakeの

-- "gitcmd:git" 
-- "gitver[0]:3268845bbbda4af12c951d75c25913d014da48ef 

を実行すると、以下の出力を得るしかし、私が本当にしたいことの受注は、私が「make install」を

を実行する時間を、インストールすることを実行することですしたがって、私はこれらのLINESをインストールの中に取り付ける:インストールとして(コード "行")

install(CODE 
       " 
set (git_cmd git) 
set (git_arg rev-parse --verify HEAD) 
message(STATUS \"git cmd: ${git_cmd}\") 
execute_process(COMMAND ${git_cmd} ${git_arg} 
    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} 
    RESULT_VARIABLE git_result 
    OUTPUT_VARIABLE git_ver) 

message(STATUS \"git ver[${git_result}]: ${git_ver}\") 
     " 
) 

ただし、th私は「make install」を実行して電子出力はタールgit_cmdは私が間違っているのは何

-- git cmd: 
CMake Error at cmake_install.cmake:196 (execute_process): 
    execute_process given COMMAND argument with no value. 

設定されていなかった示しているようですか?

ありがとうございました!

+0

あなたが知っていることは、あなたが自分の製品をインストールするには、** git **リポジトリにアクセスする必要があるということです。言い換えれば、このインストールは開発者だけのためのものですか? – GhostCat

+0

@GhostCatは、インストール手順が前にcmakeを実行したことを意味するため、実際には全く違いはありません。これが公開されている場合は、発行されたバンドルに含まれるものからバージョンを見つけるための_alternate_アプローチが必要です。しかし、コマンドが設定時であるかインストール時であるかは、どちらも同じマシン上で実行されるため、違いはありません。 –

答えて

1

インストールスクリプト内で変数を設定していますが、configureスクリプト内で変数を展開しています!

4つのオプションは、あなたがそれを修正する方法があります。

install(CODE 
       " 
set (git_cmd git) 
set (git_arg rev-parse --verify HEAD) 
message(STATUS \"git cmd: \${git_cmd}\") 
execute_process(COMMAND \${git_cmd} \${git_arg} 
    WORKING_DIRECTORY \${PROJECT_SOURCE_DIR} 
    RESULT_VARIABLE git_result 
    OUTPUT_VARIABLE git_ver) 

message(STATUS \"git ver[\${git_result}]: \${git_ver}\") 
     " 
) 
  • set (git_cmd git) 
    set (git_arg "rev-parse --verify HEAD") 
    install(CODE 
           " 
    message(STATUS \"git cmd: ${git_cmd}\") 
    execute_process(COMMAND ${git_cmd} ${git_arg} 
        WORKING_DIRECTORY \${PROJECT_SOURCE_DIR} 
        RESULT_VARIABLE git_result 
        OUTPUT_VARIABLE git_ver) 
    
    message(STATUS \"git ver[\${git_result}]: \${git_ver}\") 
         " 
    ) 
    
  • が正しくスニペットをエスケープ:

    1. が決定し、設定時に値をハードコーディング

      変数はあらかじめ設定しておきますが、高すぎる時間も。私は、彼らがそのためにキャッシュにする必要があるかどうかわからないが、私は彼らが疑われるので、私はそれを追加します。

      set (git_cmd git CACHE "" INTERNAL) 
      set (git_arg rev-parse --verify HEAD CACHE "" INTERNAL) 
      install(CODE 
             " 
      message(STATUS \"git cmd: \${git_cmd}\") 
      execute_process(COMMAND \${git_cmd} \${git_arg} 
          WORKING_DIRECTORY \${PROJECT_SOURCE_DIR} 
          RESULT_VARIABLE git_result 
          OUTPUT_VARIABLE git_ver) 
      
      message(STATUS \"git ver[\${git_result}]: \${git_ver}\") 
           " 
      ) 
      
    2. の代わりに、引用は権利を取得install(SCRIPTフォームを使用してコマンドを入れしようとしているが別のファイルに保存します。

    ことに注意してください。私も${PROJECT_SOURCE_DIR}を免れたが、私これらの変数は、常に唯一のスクリプト内と

  • 定義されているため

    1. は両方のケースでは、私は、最後の行に$をエスケープキャッシュがロードされているかどうかは完全にはわかりません。そうでない場合は、代わりに\"${PROJECT_SOURCE_DIR}\"としてエスケープする必要があります(値に"が含まれないようにしてください)。
    2. また、最初のケースでは、リストが;で区切られて展開され、正しく読み取られないため、git_argの値を引用符で囲みます。特殊文字での問題へ

    再解析するとき、私はは、最初のオプションをお勧めしません。

  • +0

    それはすべてを説明しています。ありがとう! –

    関連する問題