私はC++プロジェクトを開発していますが、これはより大きなプロジェクトに含まれる予定です。
より大きなプロジェクト(Qtアプリケーションであり、qmakeから生成されている)では、特定のファイルへの相対パスを引数として入力するだけで、Linuxコマンドラインから単一のファイルをコンパイルできることを確認しました。
一方、私は自分のプロジェクトにCMakeを使用しています。コンパイルユニットのコードを変更し、そのヘッダーファイルを変更する必要がある場合、依存関係をコンパイルしてから独自のソースファイルをコンパイルするまで長時間待つ必要があります。ただし、*。ccファイルのソースコードがエラーなしでコンパイル可能かどうかを確認したい場合があります。
Qmakeがこれを行う方法でCMakeからMakefileを生成する方法はありますか? qmakeへの切り替えはもうオプションではありません。
CMakeによって生成されたMakefileにはすでに各.ccファイルの.oターゲットが含まれているため、CMakeスクリプトにカスタムターゲットを追加する必要はありません。例えば。 mySourceFile.cc
というソースファイルがある場合、ビルドディレクトリに<Some Path>/mySourceFile.cc.o
というターゲットを定義するMakefileがあります。ビルドディレクトリにcd
する場合は、grep
またはack-grep
を使用してこのターゲットを定義するMakefileを見つけ、cd
をそのMakefileのディレクトリに入れてビルドします。それ。
例えば。コマンドack-grep mySourceFile.cc.o
が次のようなものを出力するとします。
foo/bar/Makefile
119:x/y/z/mySourceFile.o: x/y/z/mySourceFile.cc.o
123:x/y/z/mySourceFile.cc.o:
124: # recipe for building target
次に、次の手順でmySourceFile.cc.o
を作成できます。
cd foo/bar && make x/y/z/mySourceFile.cc.o
CMakeにはこれを行うための一般的な組み込みの方法はありません(これは 未解決の問題 です)が、Ninjaジェネレーターを使用している場合は、 特別なNinja構文)を使用できます 指定されたソースファイルの直接出力のみをビルドする場合。たとえば、foo.o
だけをコンパイルするには、次を使用します。
ninja /path/to/foo.cpp^
箱から出していない。 CMakeは、メインのメイクファイルでこれらの「内部」メイクファイルルールを公開しません。
これは、CMakeが内部で使用するファイル構造の種類を検討する場合にのみ実行できます。あなたは例えばすることができますCMakeで生成されたmakefile呼び出しを使用して単一の.obj
ファイルをコンパイルする場合
make -f CMakeFiles/myProg.dir/build.make CMakeFiles/myProg.dir/main.cc.obj
あなたがのようなものを持っているとき
cmake_minimum_required(VERSION 3.1)
project(myProg CXX)
file(WRITE "main.cc" "int main()\n{\nreturn 0;\n}")
add_executable(myProg main.cc)
Src/foo.cppを単独でビルドするには:
cmake --build . --target src/foo.cpp.o
.cpp.o
ファイル名からターゲット名(.cpp
で終わる)を見つける方法を提案している人もいますが、.cpp
ファイルのコンパイルをトリガーするターゲットの名前をすでに知っている場合は忍者を使用している場合、この提案は簡単なはずです。
最初にターゲットを作成します。
ninja TriggersCppCompilationLib
ファイルが変更されたか、まだビルドされていないと仮定すると、忍者は完全なターゲット名を出力します。名前が表示されたら、Enterキーを押して、上書きされないようにします。次に、端末から名前をコピーするだけです(たとえば、tmuxコピーモードを使用します)。
いいえ、CMakeは単一ファイルをコンパイルするための組み込みサポートを提供していません。
ディレクトリのすべてのファイルを反復処理する関数によって、各オブジェクトファイルのターゲットを追加する必要があります。