2012-06-06 6 views
21

CMake documentationには、file(GLOB ...)が ではないことが明示的に記載されていますが、実際に推奨される方法については には記載されていません。グレイビングせずにCMakeでソースファイルを収集するには?

すべてのソースファイルを手動で指定すると、手作業でもちょっと手が届く したがって、ソースファイルを収集する正しい方法は何ですか、そうでない場合は file(GLOB ...)

+0

... add_library(MyLib inc/a.h ) ... 

後。 – Damian

答えて

17

マニュアルは本当にお勧めの方法です。 GLOBを使用することを推奨することによって、ドキュメントは、存在するファイルに依存するビルドシステムに対して警告するだけです。たとえば、テスト実行ファイルを追加すると、mytest.cppが作成されます。おっとっと。これで、ライブラリのコンパイルが中断されます。ソースのライブラリや実行ターゲットの ファイルのリストを書くことを避けるために、このコマンドを使用するために魅力的です

:AUX_SOURCE_DIRECTORYのドキュメント(ソースファイルのためのグロブと同様の目的は)次の警告を与えます。これがうまくいくようですが、 新しいソースファイルが追加されたときを知っているビルドシステムをCMakeが生成する方法はありません。通常、生成されたビルドシステム は、CMakeLists.txtファイルが新しいソースを追加するために に変更されたため、CMakeを再実行する必要があることを認識しています。このファイルを変更せずにソースを ディレクトリに追加するだけで、手動で CMakeを再実行して、新しいファイルを組み込んだビルドシステムを生成する必要があります。

ディレクトリのすべてのコンテンツが必要であり、新しいディレクトリを追加する予定がない場合は、必ずGLOBを使用してください。

また、リストファイルを手動で忘れることなく、すべてのファイル名を入力する必要はありません。たとえば、ls *.cpp >> CMakeLists.txtを実行してから、エディタを使用して、ファイルのリストをファイル内の正しい場所に移動します。

+0

IDEに依存する種類tbh。 Qt Creatorでは、常にGLakeを使用して問題を起こさないようにCMakeを再実行します。 – Lap

+2

'printf" add_library(xxx $(ls * .cpp)) ">> CMakeLists.txt'もすばらしくすべきです! – Alex

+0

テストが通常はテストフォルダにあり、ソースツリーが乱雑であってはいけないので、あなたの複雑な問題は有効ではないと思います。 – Arne

12

は、私はディレクトリを再スキャンします

touch ../src/CMakeLists.txt 

makeのコマンドを実行して、私は、ファイルを追加し、正確にそのたびはglobを使用しています。

"新しいソースファイルがいつ追加されたかを知っているビルドシステムをCMakeが生成する方法はありません"本当ですか?さて、だからそれを教えて

これは100%自動ではありませんが、手動でファイルを追加するよりも簡単です。

1

私はcog、pythonモジュールを使用します。

CMakeLists.txt:ここで.cppファイルを収集するためのサンプルです

set(SRC_FILES "") 

# [[[cog 
# import cog, glob 
# for src in glob.glob('*.cpp'): 
#  if "skeleton" in src: continue 
#  cog.outl("SET(SRC_FILES ${SRC_FILES} %s)" % src) 
# ]]] 
# [[[end]]] 

add_library(mylib STATIC ${SRC_FILES}) 

そしてが、実行します。

python -m cogapp -r CMakeLists.txt 

CMakeLists.txtファイルが所定の位置に更新されます。

コグなどの使用方法についてはthe article from the authorをご覧ください。

0

私は従来のCMakeLists.txtとpythonスクリプトを使ってそれを更新します。私はファイルを追加した後、手動でpythonスクリプトを実行します。

import os 
import re  

def relFiles(base, sub): 
    fullSub = os.path.join(base,sub) 
    abs = [os.path.join(dp, f) for dp, dn, fn in os.walk(fullSub) for f in fn] 
    return [os.path.relpath(f, base) for f in abs] 

def updateAddLibrary(cmakelistsDir, subs): 
    cmakelists = os.path.join(cmakelistsDir, "CMakeLists.txt") 
    listings = [relFiles(cmakelistsDir, sub) for sub in subs] 
    files = [f for listing in listings for f in listing] #flatten 
    with open(cmakelists, 'r') as file: 
     text = file.read() 
    sources = "".join([" %s\n" % f.replace('\\', '/') for f in files]) 
    text = re.sub(r"add_library\s*\(\s*([^\s\)]+).*?\)", 
      r"add_library(\1\n%s)" % sources, 
      text, 1, re.DOTALL) 
    with open(cmakelists, "w") as file: 
     file.write(text) 

dir = os.path.dirname(os.path.abspath(__file__)) 
updateAddLibrary(dir, ['inc','src']) 

例の前に:あなたはスクリプトでcmakeのからGLOBを使用してファイル名をダンプ追加している可能性があり

... 
add_library(MyLib 
    inc/a.h 
    inc/sub/b.h 
    src/a.cpp 
)   
... 
関連する問題