回答:
ありませんcmake clean
。
私は通常、「ビルド」のような単一のフォルダーにプロジェクトをビルドします。だから私がしたいならmake clean
、私はただすることができますrm -rf build
。
ルート「CMakeLists.txt」と同じディレクトリにある「build」フォルダは、通常は適切な選択です。プロジェクトをビルドするには、cmakeにCMakeLists.txtの場所を引数として指定するだけです。次に例を示しますcd <location-of-cmakelists>/build && cmake ..
。(@ComicSansMSから)
cd <location-of-cmakelists>/build && cmake ..
CMakeの公式FAQには次のように記載されています。
GNU autotoolsで作成された一部のビルドツリーには、ビルドをクリーンアップし、Makefileと生成されたビルドシステムの他の部分を削除する「make distclean」ターゲットがあります。CMakeLists.txtファイルはスクリプトや任意のコマンドを実行できるため、CMakeは「make distclean」ターゲットを生成しません。CMakeには、CMakeの実行中に生成されたファイルを正確に追跡する方法がありません。distcleanターゲットを提供すると、期待どおりに機能するという誤った印象をユーザーに与えます。(CMakeは、コンパイラーとリンカーによって生成されたファイルを削除するために「make clean」ターゲットを生成します。)
「make distclean」ターゲットは、ユーザーがソース内ビルドを実行する場合にのみ必要です。CMakeはソース内ビルドをサポートしていますが、ユーザーにはソース外ビルドの概念を採用することを強くお勧めします。ソースツリーとは別のビルドツリーを使用すると、CMakeがソースツリーでファイルを生成できなくなります。CMakeはソースツリーを変更しないため、distcleanターゲットは必要ありません。ビルドツリーを削除するか、別のビルドツリーを作成することで、新しいビルドを開始できます。
Gitの至る所で、CMakeを忘れてを使用するとgit clean -d -f -x
、ソース管理下にないすべてのファイルが削除されます。
-x
オプションも。それはgit
取引の優れたトリックです。けれども私は個人的にはまだ、ドライ実行最初にしてくださいgit clean -d -f -x -n
。git
たまに、プロジェクトで使用する便利なファイルをプロジェクトフォルダーで管理していますが、他の人と共有したくないgit add
ので、プロジェクトでは使用しません。私が-e <pattern>
オプションを追加するように注意しなかった場合、これはその種のファイルを吹き飛ばしてしまいます。その点でgit
は、.gitcleanignore
ファイルがあればいいでしょう。:)
chattr +i $filename
(ルート権限が必要です。この後、ファイルを変更することはできません)。このようにgitは、のように実行しようとしても、そのファイルを削除できませんrm -f
。
git add
どうですか?
私はそれを30分ほどグーグルで操作し、思いついた唯一の有用なことはfind
ユーティリティを呼び出すことでした。
# Find and then delete all files under current directory (.) that:
# 1. contains "cmake" (case-&insensitive) in its path (wholename)
# 2. name is not CMakeLists.txt
find . -iwholename '*cmake*' -not -name CMakeLists.txt -delete
また、その前にmake clean
(または、使用しているCMakeジェネレーター)を必ず呼び出してください。
:)
rm -rf CMakeFiles ; rm -rf */CMakeFiles ; rm -rf */*/CMakeFiles ; rm -rf */*/*/CMakeFiles
、まだやっていませんでした...
あなたは次のようなものを使うことができます:
add_custom_target(clean-cmake-files
COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)
// clean-all.cmake
set(cmake_generated ${CMAKE_BINARY_DIR}/CMakeCache.txt
${CMAKE_BINARY_DIR}/cmake_install.cmake
${CMAKE_BINARY_DIR}/Makefile
${CMAKE_BINARY_DIR}/CMakeFiles
)
foreach(file ${cmake_generated})
if (EXISTS ${file})
file(REMOVE_RECURSE ${file})
endif()
endforeach(file)
私は通常、前の例に「make clean」の呼び出しを追加する「make clean-all」コマンドを作成します。
add_custom_target(clean-all
COMMAND ${CMAKE_BUILD_TOOL} clean
COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)
「クリーン」ターゲットを依存関係として追加しないでください。
add_custom_target(clean-all
COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
DEPENDS clean
)
「クリーン」はCMakeの実際のターゲットではなく、これは機能しないためです。
さらに、この "clean-cmake-files"を依存関係として使用しないでください。
add_custom_target(clean-all
COMMAND ${CMAKE_BUILD_TOOL} clean
DEPENDS clean-cmake-files
)
これを行うと、すべてクリーンアップが完了する前にすべてのCMakeファイルが消去され、makeは "CMakeFiles / clean-all.dir / build.make"を検索するとエラーをスローします。結果として、どのコンテキストでも「何でも」の前にclean-allコマンドを使用することはできません。
add_custom_target(clean-all
COMMAND ${CMAKE_BUILD_TOOL} clean
COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)
それも機能しません。
単にrm CMakeCache.txt
私のためにも作品を発行しています。
cmake /build-path
もう一度実行する必要があります。
ソース外のビルドが最良の答えであることには同意します。しかし、あなたがインソースビルドをしなければならないときのために、私はここで利用可能なPythonスクリプトを書きました:
make
ないときに沈黙するMakefile
(つまり、このスクリプトをべき等にする)行をスクリプトに追加したいと思います。行を(適切な間隔で)追加します:if os.path.isfile(os.path.join(directory,'Makefile')):
24 args = [
行目の直前:もちろん、追加した行の後に関数本体の残りをインデントします。これは、クリーンアップされている現在のディレクトリにmake ... clean
a Makefile
が存在する場合にのみ実行されます。それ以外の場合、スクリプトは完璧です。
私が最近見つけた解決策は、アウトオブソースのビルドの概念をMakefileラッパーと組み合わせることです。
私の最上位のCMakeLists.txtファイルには、ソース内ビルドを防ぐために以下を含めています。
if ( ${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} )
message( FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt." )
endif()
次に、トップレベルのMakefileを作成し、以下を含めます。
# -----------------------------------------------------------------------------
# CMake project wrapper Makefile ----------------------------------------------
# -----------------------------------------------------------------------------
SHELL := /bin/bash
RM := rm -rf
MKDIR := mkdir -p
all: ./build/Makefile
@ $(MAKE) -C build
./build/Makefile:
@ ($(MKDIR) build > /dev/null)
@ (cd build > /dev/null 2>&1 && cmake ..)
distclean:
@ ($(MKDIR) build > /dev/null)
@ (cd build > /dev/null 2>&1 && cmake .. > /dev/null 2>&1)
@- $(MAKE) --silent -C build clean || true
@- $(RM) ./build/Makefile
@- $(RM) ./build/src
@- $(RM) ./build/test
@- $(RM) ./build/CMake*
@- $(RM) ./build/cmake.*
@- $(RM) ./build/*.cmake
@- $(RM) ./build/*.txt
ifeq ($(findstring distclean,$(MAKECMDGOALS)),)
$(MAKECMDGOALS): ./build/Makefile
@ $(MAKE) -C build $(MAKECMDGOALS)
endif
デフォルトのターゲットall
はと入力make
して呼び出され、ターゲットを呼び出します./build/Makefile
。
ターゲット./build/Makefile
が最初に行うことは、の変数であるbuild
を使用してディレクトリを作成すること$(MKDIR)
ですmkdir -p
。ディレクトリbuild
は、アウトオブソースビルドを実行する場所です。すでに存在している可能性のあるディレクトリを作成しようとして-p
も、それmkdir
が悲鳴を上げないようにするための引数を提供します。
ターゲット./build/Makefile
が行う2番目のことは、build
ディレクトリをディレクトリに変更してを呼び出すことcmake
です。
all
ターゲットに戻り、を呼び出します$(MAKE) -C build
。$(MAKE)
は、に対して自動的に生成されるMakefile変数ですmake
。make -C
何かする前にディレクトリを変更します。したがって、使用すること$(MAKE) -C build
は実行することと同じcd build; make
です。
要約すると、このMakefileラッパーをmake all
またはで呼び出すことは、次のことmake
を実行することと同等です。
mkdir build
cd build
cmake ..
make
ターゲットdistclean
はを呼び出しcmake ..
、次にを呼び出し、make -C build clean
最後に、build
ディレクトリからすべてのコンテンツを削除します。これはまさにあなたがあなたの質問で要求したものだと思います。
Makefileの最後の部分は、ユーザーが指定したターゲットがであるかどうかを評価しますdistclean
。そうでない場合は、build
起動する前にディレクトリをに変更します。たとえば、ユーザーはと入力できるため、これは非常に強力ですmake clean
。Makefileはこれをと同等のものに変換しcd build; make clean
ます。
結論として、このMakefileラッパーは、必須のソース外ビルドCMake構成と組み合わせて、ユーザーがコマンドを操作する必要がないようにしますcmake
。このソリューションは、build
ディレクトリからすべてのCMake出力ファイルを削除するための洗練された方法も提供します。
PS Makefileでは@
、シェルコマンドからの出力を抑制するためにプレフィックスを使用@-
し、シェルコマンドからのエラーを無視するためにプレフィックスを使用します。ターゲットのrm
一部として使用distclean
する場合、ファイルが存在しないとコマンドはエラーを返します(ファイルは、でコマンドラインを使用してすでに削除されているrm -rf build
か、最初から生成されていない可能性があります)。この戻りエラーにより、Makefileが強制的に終了します。これを@-
防ぐためにプレフィックスを使用します。ファイルがすでに削除されていても問題ありません。Makefileが残り、残りを削除することを望みます。
注意すべきもう1つのこと:このMakefileは、プロジェクトのビルドに可変数のCMake変数を使用すると機能しない場合がありますcmake .. -DSOMEBUILDSUSETHIS:STRING="foo" -DSOMEOTHERBUILDSUSETHISTOO:STRING="bar"
。このMakefileは、入力するcmake ..
かcmake
、一貫した数の引数(Makefileに含めることができる)を指定することにより、一貫した方法でCMakeを呼び出すことを前提としています。
最後に、クレジットが支払われるべきクレジット。このMakefileラッパーは、C ++アプリケーションプロジェクトテンプレートによって提供されるMakefileから適応されました。
もちろん、アウトオブソースビルドはUnix Makefileの主な方法ですが、Eclipse CDTなどの別のジェネレーターを使用している場合は、インソースでビルドすることをお勧めします。その場合は、CMakeファイルを手動で削除する必要があります。これを試して:
find . -name 'CMakeCache.txt' -o -name '*.cmake' -o -name 'Makefile' -o -name 'CMakeFiles' -exec rm -rf {} +
または、でglobstarを有効にしている場合はshopt -s globstar
、代わりに次の嫌な方法を試してください。
rm -rf **/CMakeCache.txt **/*.cmake **/Makefile **/CMakeFiles
build
。サブフォルダーからビルドするためにCMakeLists.txtを更新しました。これらのコマンドより少し時間がかかりましたが、私は1回だけ実行する必要がありました:)
「ソース外」ビルド(つまり、build
ディレクトリでビルド)を使用する場合のクリーニングを簡単にするために、次のスクリプトを使用します。
$ cat ~/bin/cmake-clean-build
#!/bin/bash
if [ -d ../build ]; then
cd ..
rm -rf build
mkdir build
cd build
else
echo "build directory DOES NOT exist"
fi
クリーンアップする必要があるたびに、次のbuild
ディレクトリからこのスクリプトを入手する必要があります。
. cmake-clean-build
cd .. ; rm ; mkdir ; cd
シーケンスをに置き換えることをお勧めしcd .. ; rm -rf build/*
ます。
走れば
cmake .
CMakeファイルを再生成します。たとえば、*。ccで選択されたソースフォルダーに新しいファイルを追加する場合に必要です。
これ自体は「クリーン」ではありませんが、キャッシュを再生成することでCMakeファイルを「クリーンアップ」します。
この質問が非常に多くの注意と複雑な解決策を得るのを見るのはおかしいですが、実際には、cmakeを使用したクリーンなメソッドがないことには苦痛が伴います。
まあ、あなたは間違いなくcd build
あなたが仕事をすること、そしてrm -rf *
あなたが掃除する必要があるときにそれをすることができます。ただし、rm -rf *
多くの人は自分がどこにいるのかわからないことが多いため、危険なコマンドです。
もしあなたがcd ..
、rm -rf build
そしてそれmkdir build
から、それがcd build
タイプしすぎるということです。
したがって、良い解決策は、ビルドフォルダーの外にとどまり、cmakeにパスを伝える
ことです:
構成する:cmake -B build
ビルドする:cmake --build build
クリーンする:rm -rf build
ビルドフォルダーを再作成する:必要もありません。mkdir build
構成するだけでcmake -B build
、cmakeが作成します
cmake
主に料理Makefile
をrm
しますが、クリーンなPHONYに追加できます。
例えば、
[root@localhost hello]# ls
CMakeCache.txt CMakeFiles cmake_install.cmake CMakeLists.txt hello Makefile test
[root@localhost hello]# vi Makefile
clean:
$(MAKE) -f CMakeFiles/Makefile2 clean
rm -rf *.o *~ .depend .*.cmd *.mod *.ko *.mod.c .tmp_versions *.symvers *.d *.markers *.order CMakeFiles cmake_install.cmake CMakeCache.txt Makefile
私はzsxwingの答えをうまく使って次の問題を解決しました:
複数のホスト(Raspberry Pi Linuxボード、VMware Linux仮想マシンなど)でビルドしたソースがあります。
次のように、マシンのホスト名に基づいて一時ディレクトリを作成するBashスクリプトがあります。
# Get hostname to use as part of directory names
HOST_NAME=`uname -n`
# Create a temporary directory for cmake files so they don't
# end up all mixed up with the source.
TMP_DIR="cmake.tmp.$HOSTNAME"
if [ ! -e $TMP_DIR ] ; then
echo "Creating directory for cmake tmp files : $TMP_DIR"
mkdir $TMP_DIR
else
echo "Reusing cmake tmp dir : $TMP_DIR"
fi
# Create makefiles with CMake
#
# Note: switch to the temporary dir and build parent
# which is a way of making cmake tmp files stay
# out of the way.
#
# Note 2: to clean up cmake files, it is OK to
# "rm -rf" the temporary directories
echo
echo Creating Makefiles with cmake ...
cd $TMP_DIR
cmake ..
# Run makefile (in temporary directory)
echo
echo Starting build ...
make
たとえば、一時ビルドディレクトリを作成しますbuild_cmake
。したがって、すべてのビルドファイルはこのフォルダー内にあります。
次に、メインのCMakeファイルに以下のコマンドを追加します。
add_custom_target(clean-all
rm -rf *
)
したがって、コンパイル中に
cmake ..
そしてきれいにするために:
make clean-all