8

私はもともとCMakeメーリング リストでこの質問をしました: How to configure target or command to preprocess C file?

GNU Autotoolsに基づくビルド構成をCMake に移植しており、ファイルを生成するために C の前処理を行う必要があります。

プリプロセッサの入力は、 などのC プリプロセッサディレクティブが使用されたSQLファイルです。#include "another.sql"

現在、Makefile次のルールを使用してプレーンSQLファイルを出力として生成します。

myfile.sql: myfile.sql.in.c
    cpp -I../common $< | grep -v '^#' > $@

そのため、myfile.sql共有ライブラリや実行可能ファイルと同様に、ビルド プロセスの製品の 1 つを意味します。

同じ効果を得るには、どの CMake ツールを使用すればよいですか?

add_custom_commandを使用するadd_custom_targetか、両方を組み合わせる必要があるかは不明です。

明らかに、少なくともGNU GCCおよびVisual Studioツールセットで動作するポータブル ソリューションを探しています。プラットフォーム固有のカスタム コマンドを定義する必要があると思います。1 つはcppプリプロセッサ用、もう 1 つはcl.exe /P.

または、CMake は C プリプロセッサに何らかの抽象化を提供しますか?

アーカイブをスキャンしましたが、fortran ファイルの前処理またはmake機能に基づくソリューションしか見つかりませんでした。make myfile.i したがって、探しているものとはまったく異なります。

更新: CMake メーリング リストでPetr Kmoch から受け取ったソリューションに基づいて回答を追加しました。

4

2 に答える 2

8

メーリング リストへの私の投稿への応答としてPetr Kmoch から受け取ったソリューションの重要な部分をコピーすることで、私は自分自身への質問に答えています。

add_custom_commandまず、 (OUTPUT 署名付きのバージョン) を使用してカスタム コマンドを作成し、実際に前処理を行います。

例えば:

add_custom_command(
  OUTPUT myfile.sql
  COMMAND "${CMAKE_C_COMPILER}" -E myfile.sql.in -I ../common
  MAIN_DEPENDENCY myfile.sql.in
  COMMENT "Preprocessing myfile.sql.in"
  VERBATIM)

次に、コマンド トリガーを構成します。

  • コマンド出力ファイル ( ) が別のターゲットで使用され、またはにmyfile.sql追加されたソース ファイルとして追加された場合、これらのコマンドでそれを指定するだけで十分です。CMake はそれを依存関係として検出し、必要に応じてカスタム コマンドを実行します。add_libraryadd_executable

  • コマンド出力ファイルが、他のターゲットで依存関係として使用されていない最終出力である場合は、次を使用してコマンドを実行するカスタム ターゲットを追加します。add_custom_target

例えば:

add_custom_target(
  ProcessSQL ALL
  DEPENDS myfile.sql
  COMMENT "Preprocessing SQL files"
  VERBATIM)

クレジット: Petr Kmoch

于 2012-07-11T23:28:56.003 に答える
3

To take advantage of CMake' make myfile.i feature, you can do this:

add_library(sql_cpp_target EXCLUDE_FROM_ALL myfile.sql.in.c)

Now running make myfile.sql.in.c.i will produce preprocessed source for you, using defined CMAKE_C_FLAGS. It might be possible to change output name and dir for preprocessed file.

At any rate, you'd need to wrap these make invocations into add_custom_target(ALL ...) to make CMake run them during build.

Use CMAKE_MAKE_PROGRAM variable in targets definitions.

If you want to abstract from build tool, you can call cmake itself to build a target for you. Use ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target targetname when defining custom target.


Alternatively, you can just add_custom_command() which runs specified compiler to preprocess files and put them at the appropriate place. But this seems to be less flexible, IMO.

于 2012-07-10T08:14:27.743 に答える