2017-08-09 32 views
0

私はマルチプラットフォームのcmakeプロジェクトに変換する必要があるプロジェクトのかなり大きなファイル構造を持っています。これで、cmakeは、単一のcppファイルを実行可能ファイルに個別に追加する必要があることを確認します。しかし、これを自動化するスクリプトはありますか?それはファイル構造をスヌープし、すべてのソースファイルを自動的に追加するだけですか?プロジェクトはおそらくもっと多くのソースファイルを取得するので、私はおそらく手動で1つ1つ追加することはできません。CMakeは、ディレクトリのすべてのサブディレクトリ内のすべてのソースファイルを再帰的に実行可能ファイルに追加しますか?

+0

'file(GLOB ...)'はあなたの友人です。 – arrowd

+0

ありがとう、私はそれを調べるでしょう – user1510024

+1

彼らは明示的にソースファイルを検索するために使用すべきではないことを彼らはウィキに明記します。なぜなら、cmakeファイルが変更されていなければ、cmakeはmakefileを再構築しないからです。しかし、私はおそらくそれをとにかく行い、プロジェクトにファイルを追加するたびにcmakeに再構築させるシェルスクリプトを作成します。あなたの助けをありがとう – user1510024

答えて

0

あなたは再帰的のようなあなたのCMakeLists.txtつまり何かに含まれるファイルに書き込み、ソースファイルをスキャンするためにはglobしcmake -Pスクリプトでexecute_process()を使用することができます。

「CMakeLists.txt」:

execute_process(COMMAND ${CMAKE_COMMAND} 
    -D "RDIR=${CMAKE_CURRENT_SOURCE_DIR}" 
    -P "scansources.cmake" 
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") 
include("sources.cmake") 
add_executable(myexe ${sources}) 

"scansources.cmake"( "sources.cmake" を生成する):

file(GLOB_RECURSE sourcelist 
    *.c 
    *.cc 
    *.cpp 
    *.cxx) 
string(REGEX REPLACE "${RDIR}/" "" relative_sources "${sourcelist}") 
string(REPLACE ";" "\n" sources_string "${relative_sources}") 
set(sources_string "set(sources\n${sources_string})") 
file(WRITE sources.cmake "${sources_string}") 

なぜこのような理由設定時にexecute_process()が発生するためです。

他のツールやIDEを使用してsources.cmakeを生成することもできますが、scansources.cmakeまたはexecute_process()は必要ありません。

+0

私は私のプログラムをコンパイルし、その後にmake -j4をつけて、ファイルを再スキャンするたびにcmakeを実行するスクリプトを基本的に設定します。私は、cmakeが自分でcmakeを再度実行しても自動的に検索しないことを知っています。ソースファイルをグロビングしていますが、これは実際にこれを解決するかもしれません。ありがとう – user1510024

関連する問題