2017-07-05 6 views
3

Suppose you have a very simple CMakeLists.txtCMakeが理解できない情報源について黙っていないようにしますか?

add_executable(silent T.cpp A.asm) 

CMakeのは喜んでそれでT.cppで、silentを構築するためのC++ターゲットを生成しますが、それは接尾辞で何をするかわからないので黙って、A.asmに任意およびすべての参照をドロップします。

CMakeが(MakefileをCMakeに移植するのを助けるために)理解できないこのソースファイルについて大声で苦情を言わせる方法はありますか?

答えて

3

未知のファイル拡張子を無視することは、残念なことにあなたのケースでは設計によって行われます。

cmGeneratorTarget::ComputeKindedSources()のコードを見ると、不明なものはSourceKindExtra(生成されたIDEファイルに追加されます)に分類されます。

だから私は少しをテストし、add_executable()自体を上書きすることで、有効なファイル拡張子のためのあなたの実行可能なターゲットのソースファイルを評価し、次のスクリプトを思い付いた:あなたはむしろ大声で私が宣言CMakeので文句を望んでいたので

cmake_minimum_required(VERSION 3.3) 

project(silent CXX) 

file(WRITE T.cpp "int main() { return 0; }") 
file(WRITE T.h "") 
file(WRITE A.asm "") 

function(add_executable _target) 
    _add_executable(${_target} ${ARGN}) 

    get_property(_langs GLOBAL PROPERTY ENABLED_LANGUAGES) 
    foreach(_lang IN LISTS _langs) 
     list(APPEND _ignore "${CMAKE_${_lang}_IGNORE_EXTENSIONS}") 
    endforeach() 

    get_target_property(_srcs ${_target} SOURCES) 
    foreach(_src IN LISTS _srcs) 
     get_source_file_property(_lang "${_src}" LANGUAGE) 
     get_filename_component(_ext "${_src}" EXT) 
     string(SUBSTRING "${_ext}" 1 -1 _ext) # remove leading dot 
     if (NOT _lang AND NOT _ext IN_LIST _ignore) 
      message(FATAL_ERROR "Target ${_target}: Unknown source file type '${_src}'") 
     endif() 
    endforeach() 
endfunction() 

add_executable(silent T.cpp T.h A.asm) 

この実装例ではFATAL_ERRORです。

+0

これは素晴らしい答えです。本当にありがとう! –

1

CMakeは、未知のファイルをadd_executable()にドロップするだけではありません。

<dependees>は、実行可能ファイルをコンパイルする前A.asmを作成するためにCMakeのコマンドを再実行します変更したときに一緒に

add_executable(silent T.cpp A.asm) 

であなたはその後

add_custom_command(OUTPUT A.asm COMMAND <...> 
    DEPENDS <dependees>) 

を持っている場合。 自動的なヘッダがをスキャンすること

注意は、このような機能を提供していません:あなたの実行ファイルがfoo.hが含まれている場合、その後の実行はfoo.h自体が変更された場合にのみ再構築されます。このヘッダーを作成するカスタムコマンドは、が無視されます。


しかし、あなたはそれを再定義することによってadd_executable動作を変更することがあります。このような再定義の例については、@ Florianの答えを参照してください。

+0

甘い。本当にありがとう。それはここの役に立つ情報です。 –