これを実行する必要があるプラットフォームや、使用できる追加のツールがあるかどうかなど、いくつかの情報を省略しています。PythonのRubyやPerlが使えれば、物事はずっと簡単になります。Unix と Windows pqlatform の両方で実行する必要があり、追加のツールは利用できないと仮定します。
コマンドからの出力をプリプロセッサ シンボルで取得する場合、コマンド ライン パラメーターをいじる代わりに、ヘッダー ファイルを生成するのが最も簡単な方法です。CMake には、ファイル内のスクリプト コマンドのみを処理するスクリプト モード (-P) があるため、次のようなことができることに注意してください。
CMakeLists.txt:
project(foo)
cmake_minimum_required(VERSION 2.6)
add_executable(foo main.c custom.h)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_custom_command(OUTPUT custom.h
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/custom.cmake)
ファイル「custom.h」は、コマンド「cmake -P custom.cmake」によってコンパイル時に生成されます。custom.cmake は次のようになります。
execute_process(COMMAND uname -a
OUTPUT_VARIABLE _output OUTPUT_STRIP_TRAILING_WHITESPACE)
file(WRITE custom.h "#define COMPILE_TIME_VALUE \"${_output}\"")
コマンドを実行し (この場合は "uname -a"、任意のコマンドに置き換えます)、出力を変数 _output に入れ、それを custom.h に書き込みます。これは、コマンドが単一行を出力する場合にのみ機能することに注意してください。(複数行の出力が必要な場合は、複数行のデータをプログラムにどのように組み込むかによって、より複雑な custom.cmake を記述する必要があります。)
メインプログラムは次のようになります。
#include <stdio.h>
#include "custom.h"
int main()
{
printf("COMPILE_TIME_VALUE: %s\n", COMPILE_TIME_VALUE);
return 0;
}
コンパイル時にコンパイラ オプションを実際に計算したい場合は、さらに複雑になります。Bourne シェル ジェネレーターの場合は、コマンドをバッククォート内に挿入するだけです。mycommand.sh
引用を理解しているときに腹が立った場合は、コマンドのすべてのロジックをシェルスクリプト内に移動して、 add_definitions()に入れるだけでよいようにします。
if(UNIX)
add_definitions(`${CMAKE_CURRENT_SOURCE_DIR}/custom-options.sh`)
endif()
Windows のバッチ ファイル ベースのジェネレーターの場合、事態はかなりトリッキーであり、適切な解決策がありません。問題は、PRE_BUILD
コマンドが実際のコンパイラ呼び出しと同じバッチ ファイルの一部として実行されないことです (詳細については BuildLog.htm を調べてください) PRE_BUILD
。その上で「call custom.bat」を実行して、後でコンパイラ コマンド ラインで参照できる変数セットを取得します)。バッチ ファイルにバッククォートに相当するものがあれば、問題は解決します。
これがいくつかのアイデアと出発点を与えることを願っています。
(ここで避けられない反論: あなたは本当に何を
しようとしているのですか?)
編集: ヘッダー ファイルの生成に CMake を使用させたくない理由がわかりません。${CMAKE_COMMAND} を使用すると、Makefiles/.vcproj-files の生成に使用される CMake に展開されます。CMake は移植可能な Makefiles/.vcproj-files を実際にはサポートしていないため、ターゲット マシンで CMake を再実行する必要があります。
この明確な理由から、CMake には多数のユーティリティ コマンド (一覧を表示するには "cmake -E" を実行します) もあります。たとえば、次のことができます
add_custom_command(OUTPUT custom.h COMMAND ${CMAKE_COMMAND} -E copy file1.h file2.h)
file1.h を file2.h にコピーします。
とにかく、CMake を使用してヘッダー ファイルを生成したくない場合は、別の .bat/.sh スクリプトを呼び出してヘッダー ファイルを生成するか、echo を使用して実行する必要があります。
add_custom_command(OUTPUT custom.h COMMAND echo #define SOMETHING 1 > custom.h)
必要に応じて引用を調整します。