답변:
없습니다 cmake clean.
나는 보통 "build"와 같은 단일 폴더에 프로젝트를 빌드합니다. 내가 원한다면 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 실행의 일부로 생성 된 파일을 정확하게 추적 할 방법이 없습니다. 불분명 한 대상을 제공하면 사용자가 예상대로 작동한다는 잘못된 인상을 줄 수 있습니다. CMake는 "make clean"대상을 생성하여 컴파일러와 링커에서 생성 된 파일을 제거합니다.
"make distclean"대상은 사용자가 소스 내 빌드를 수행하는 경우에만 필요합니다. CMake는 소스 내부 빌드를 지원하지만 사용자가 소스 외부 빌드 개념을 채택하도록 적극 권장합니다. 소스 트리와 별 개인 빌드 트리를 사용하면 CMake가 소스 트리에서 파일을 생성하지 못하게됩니다. CMake는 소스 트리를 변경하지 않으므로 명확한 대상이 필요하지 않습니다. 빌드 트리를 삭제하거나 별도의 빌드 트리를 생성하여 새로운 빌드를 시작할 수 있습니다.
오늘날 Git의 어느 곳에서나 CMake 및 use를 잊어 버릴 수 있으며 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-all"명령을 만들어 이전 예제에 "make clean"을 호출합니다.
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 파일이 지워지고 "CMakeFiles / clean-all.dir / build.make"를 검색하면 오류가 발생합니다. 결과적으로 어떤 컨텍스트에서든 "anything"전에 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(즉,이 스크립트를 dem 등원으로 만듭니다). if os.path.isfile(os.path.join(directory,'Makefile')):24 행 바로 앞에 라인을 추가하십시오 (물론 적절하게 간격을 두십시오) : args = [물론 라인이 추가 된 후 나머지 함수 본문을 들여 쓰기하십시오. 이것은 현재 정리중인 디렉토리에가 있는 make ... clean경우 에만 수행됩니다 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는 디렉토리를 디렉토리로 변경 build하고 호출하는 것입니다.cmake 입니다.
all대상으로 돌아가서를 호출합니다 $(MAKE) -C build. 여기서 $(MAKE)Makefile 변수가 자동으로 생성됩니다 make. make -C작업을 수행하기 전에 디렉토리를 변경합니다. 따라서 사용하는 $(MAKE) -C build것은cd build; make .
와이 메이크 래퍼를 호출 요약하자면, 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이 계속 진행되고 나머지는 제거하기를 원합니다.
주의해야 할 또 다른 사항 :이 Makefile은 가변 개수의 CMake 변수를 사용하여 프로젝트를 빌드하는 경우 작동하지 않을 수 있습니다 (예 :) cmake .. -DSOMEBUILDSUSETHIS:STRING="foo" -DSOMEOTHERBUILDSUSETHISTOO:STRING="bar". 이 Makefile에서는 사용자가 입력 cmake ..하거나 cmakeMakefile에 포함 할 수있는 일관된 수의 인수 를 제공 하여 CMake를 일관된 방식으로 호출한다고 가정합니다 .
마지막으로 신용이 필요한 신용입니다. 이 Makefile 랩퍼는 C ++ 애플리케이션 프로젝트 템플리트가 제공 한 Makefile에서 수정되었습니다 .
물론, Out-of-source 빌드는 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를 업데이트하십시오 . 명령보다 시간이 조금 더 걸렸지 만 한 번만 수행해야했습니다. :)
"소스 외부"빌드 (즉, 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에게 경로 :
to configure : cmake -B build
to build : cmake --build build
to clean :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