3

CMake を使用するオープン ソース プロジェクト (kst、v2.0.8) を構築しています。CMake v2.8.12.2 と MSVC 2008 をコンパイラとして使用しており、コマンド ラインでビルドするために NMake メイクファイルを生成しています。このセットアップで正常にビルドできます。これらのバージョンは義務付けられているため、現在、CMake または MSVC の新しいバージョンを使用することはできません。

HP の Fortify を使用して kst のソース コード分析を実行し、コマンド ラインから使用できるようにする必要があります。

  1. 独自の「cl.exe」を作成するタッチレス モードでは、実際の cl.exe へのパスの前にそのパスを設定するため、ビルド中に起動されます。

  2. Makefile のコンパイラを Fortify コマンド ラインに設定しsourceanalyzer -b build_id clますcl

いずれにせよ、cmakeがmakefileに生成するコンパイラを、cmakeが自動的に検出しないものにする必要があります。

この質問の同じ方法に従ってcmakeを実行するときにコンパイラを設定しようとしましたが、cmakeはまだメイクファイルにMSVC cl.exeへのフルパスを入れることを主張しています。

cmake -DCMAKE_C_COMPILER=cl -DCMAKE_C_COMPILER_FORCED=ON -DCMAKE_CXX_COMPILER=cl -DCMAKE_CXX_COMPILER_FORCED=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=%CFITSIO_DIR% -G"NMake Makefiles" ..\cfit3250

Fortify を呼び出すようにコンパイラを設定しようとしましたが、cmake がコンパイラをテストすると、コンパイラが見つからないと言って失敗します。(また、FORCED=ON 引数なしでこれを試しましたが、その場合、コンパイラが失敗したと表示されます。)

cmake -DCMAKE_C_COMPILER="sourceanalyzer -b %BUILDID% cl" -DCMAKE_C_COMPILER_FORCED=ON -DCMAKE_CXX_COMPILER="sourceanalyzer -b %BUILDID% cl" -DCMAKE_CXX_COMPILER_FORCED=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=%CFITSIO_DIR% -G"NMake Makefiles" ..\cfit3250

おそらくmakefile内のすべてのコンパイラ呼び出しを検索して置き換えることができますが、cmakeのたびにそれを行うことを覚えておく必要があり、複数のプロジェクト/ makefile / clへの呼び出しがあるため(CCを定義するのではなく)見るのは面倒です.メイクファイルの変数)。オフセットから直接、目的のコンパイラを cmake に使用させる方法があればいいのにと思います。

4

1 に答える 1

3

更新:テストでは、最初に提案されたアプローチが少なくとも一部のプラットフォームで期待どおりに機能しないことが示されました。ラッパー スクリプトを使用する方法が適しているようです。

特定のコンパイラを強制し、CMake のコンパイラ チェックをバイパスしたい場合は、そのCMakeForceCompilerモジュールが探しているものである可能性があります。CMake ドキュメントへのそのリンクには、パスのない単純なコマンドとして呼び出される特定のコンパイラを使用する方法を示す簡単なツールチェーン ファイルの例が含まれています。残念ながら、CMake はこれを絶対パスに変換するため、単独では問題を解決できません。ただし、ツールチェーン ファイルを使用してラッパー スクリプトを指定しCMakeForceCompiler、コンパイラ チェックをバイパスするために使用できます。CMakeForceCompilerこの組み合わせにより、要求した動作が得られるはずですが、現在は非推奨になっていることに注意してください。

モジュールを使用するときは、CMake 情報、特に強制的に使用したい特定のコンパイラのコンパイラ ID を伝える責任が少し増えることに注意CMakeForceCompilerてください。MSVC

-DCMAKE_TOOLCHAIN_FILE=path/to/fileツールチェーン ファイルを使用するには、独自のカスタム ツールチェーン ファイルを指すオプションを指定して CMake を呼び出します。CMake のドキュメントには、ツールチェーンの使用をカバーする特定のセクションがありますが、重要な核心的な詳細のいくつかは省略されています。

@Tsyvarev のコメントで述べたように、ラッパー スクリプトを使用することが、これに対処する最善の方法である可能性があります。そのラッパー スクリプトは、パスを指定せずに、呼び出しを通常のコンパイラ コマンドに転送するだけで済みます。次に、ビルドを行うときにコマンドが PATH にあることを確認する責任があります。Windows のラッパー バッチ ファイルとしては、次のような単純なもので十分です (未テスト)。

cl %*

これで、Visual Studio コンパイラまたは Fortify が、ビルドが参照する PATH によって純粋に呼び出されるかどうかを制御できるようになりました。個人的には、これは少し壊れやすいと思いますが、それはあなたが求めたものです。;)

より堅牢な代替手段として、2 つの完全に別個のビルドを使用することは可能ですか? もしそうなら、より良い代替手段としてそれをお勧めします。1 つをデフォルトの Visual Studio コンパイラで通常どおりビルドし、もう 1 つのビルドでは、ツールチェーン ファイルを使用して Fortify コンパイラを指定し、CMake がそのコンパイラ チェックをバイパスするようにします。そうすれば、ビルド環境が特定の方法で設定されていることに依存しません。

于 2016-01-21T11:24:15.343 に答える