1

みなさん、良い一日を。

次のような状況があります: アプリケーションをコンパイルすることになっている CMake ファイルがあります。

  1. 1 つまたは複数のcppファイル
  2. いくつかのテンプレート ファイル ( ecpp) は、cppファイルに生成され、アプリケーションにコンパイルされます (以下にリストされているWEB_COMPONENTSため、コンポーネントごとに関連.ecppファイルとそこ.cppから生成される があります)。

そして、ここに CMakeLists.txt (簡略化) があります

cmake_minimum_required (VERSION 2.6)
set (PROJECT sinfonifry)
set (ECPPC /usr/local/bin/ecppc)
set (WEB_COMPONENTS 
     images 
     menu
     css
)

set(${PROJECT}_SOURCES
  ""
  CACHE INTERNAL ${PROJECT}_SOURCES
)

foreach(comp ${WEB_COMPONENTS})
  list(APPEND ${PROJECT}_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/${comp}.cpp )

  execute_process(COMMAND ${ECPPC} -o ${CMAKE_CURRENT_BINARY_DIR}/${comp}.cpp -v
                  ${CMAKE_CURRENT_SOURCE_DIR}/${comp}.ecpp 
                  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_QUIET
                 )
endforeach()

list(APPEND ${PROJECT}_SOURCES main.cpp )
add_executable(${PROJECT}_exe ${${PROJECT}_SOURCES})
target_link_libraries(${PROJECT}_exe cxxtools dl tntnet tntdb)

さて、何が起こるか: 非常に初めて (つまり、ビルド ディレクトリを作成し、cmake-gui を実行し、Web コンポーネントを選択し、構成し、生成し、作成します)、CMake は${ECPPC}コマンドを適切に実行します。必要な CPP ファイルをバイナリ ディレクトリに生成し、それらをリンクします。

しばらくして、明らかに作業中に、コンポーネント ファイルの 1 つ ( など) を変更し、ビルド ディレクトリで再度images.ecpp実行します。makeしかし、現在、CMake はecppファイルの変更を取得しません。cmake-gui に移動し、キャッシュを削除し、すべてをゼロから再起動する必要があります。これは非常に面倒で遅いです。

だから、2つの質問:

  1. の変更を追跡し、変更された場合にコンパイラimages.ecppを呼び出すように CMake に指示できますか?${ECPPC}

  2. 生成されたファイルmake cleanも削除するにはどうすればよいですか。cpp

お時間をいただきありがとうございます、f.

4

1 に答える 1

3

代わりにexecute_process()を使用しますadd_custom_command()。ここを参照してください: https://stackoverflow.com/a/2362222/4323

基本的に、CMake にOUTPUT(生成されたファイル名)、COMMAND、およびDEPENDS(.ecpp ファイル名) を伝えます。これにより、ソースを必要な C++ 生成ファイルに変換する方法を理解できます。次に、生成されたファイルをターゲット、たとえばadd_executable()、またはadd_custom_command()依存関係に追加します (コンパイルする必要がない場合は、必要になる可能性が高くなります)。

于 2013-04-24T14:00:34.687 に答える