5

コンパイルを高速化するために CMakeLists.txt を作成しようとしています。

実行可能ファイルは、スクリプトで生成された .cpp ファイルに依存します。次のように、コンパイル中に .tmpl を .cpp ファイルに変換する必要があるテンプレート システムを持つ cppcms Web アプリケーション ライブラリを使用します。

cppcms_tmpl_cc page.tmpl -o page.cpp

cmake 内での bash コマンドの使用をカバーする関連する質問があります:
How to run a command at compile time within Makefile generated by CMake?
CMake : CMakeLists.txt で bash コマンドを使用する方法
これらの質問は、私のニーズのほとんどをカバーしています。

私が知りたいのは、cmake に上記のコマンドを実行し、page.tmpl 自体が変更されるたびに page.cpp を再生成するように指示する方法です。

目標は明らかに、コンパイル時間を改善し、最新のテンプレートを使用して最新のバイナリを作成することです。

(モデレーターは cppcms タグを追加できますか?)

[編集: 実際に次の Makefile を cmake に変換しようとしています:

LIBS=-lcppcms -lconfig++ -lboost_filesystem-mt

all: clean gitbrowser

gitbrowser: main.cpp view.cpp content.hpp gitbrowser.cpp
       $(CXX) -Wall main.cpp gitbrowser.cpp view.cpp -o run ${LIBS}

view.cpp: page.tmpl content.hpp
       cppcms_tmpl_cc page.tmpl -o view.cpp

[Edit2: 公式の cppcms wiki に解決策に関するメモを追加しました:
http://art-blog.no-ip.info/wikipp/en/page/cppcms_1x_howto#How.to.compile.the.templates.with. cmake

4

2 に答える 2

5
now = get_now_time()
time = get_last_upd_time()
if (now > time)
  set (LAST_UPD_TIME time CACHE INTERNAL "Defines last update time of the file" FORCE)
  # run bash command here
endif (now > time)

get_now_timeおよびget_last_upd_timeは架空の関数であり、タイムスタンプを返します (bash コマンドを使用してこれらのタイムスタンプを取得できると思います)。次に、それらを比較して、最終変更のタイムスタンプをキャッシュに保存できます。

ただし、ターゲットとそれらの間の依存関係を適切に定義すれば、CMake自体が変更されたファイルのみを再構築することを知っているので、このソリューションは私には見苦しく見えますね。ターゲットの定義を教えていただけますか?

編集

次の CMakeLists.txt を使用できます (よくわかりませんが、私のプロジェクトに基づいています)。

# add main target, the executable file
ADD_EXECUTABLE(gitbrowser main.cpp view.cpp content.hpp gitbrowser.cpp)
# linking it with necessary libraries
TARGET_LINK_LIBRARIES(gitbrowser "cppcms config++ boost_filesystem-mt")

# add page.cpp target
ADD_CUSTOM_COMMAND(
    OUTPUT page.cpp 
    COMMAND "cppcms_tmpl_cc page.tmpl -o view.cpp" 
    DEPENDS page.tmpl content.hpp
)
# and finally add dependency of the main target
ADD_DEPENDENCIES(gitbrowser page.cpp)

幸運を

于 2011-01-10T04:22:27.877 に答える
1

Wikipp行 66-72のこの CMake ファイルを見てください。

基本的に次のようなものが必要です。

add_custom_command(
   OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/view.cpp
   COMMAND cppcms_tmpl_cc
               view.tmpl
               -o ${CMAKE_CURRENT_BINARY_DIR}/view.cpp
   DEPENDS view.tmpl) 

編集:また、コンパイル速度を向上させたい場合は、ビューを共有オブジェクトにコンパイルして動的にロードすることができます。

これにより、ビューのみを変更した場合、アプリケーションを再起動しなくてもよくなり、再コンパイル後の共有オブジェクトは自動的に再読み込みされます。

詳細については、http: //art-blog.no-ip.info/wikipp/en/page/cppcms_1x_config#viewsを参照してください。

于 2011-01-10T06:45:43.623 に答える