답변:
없습니다 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 ..
하거나 cmake
Makefile에 포함 할 수있는 일관된 수의 인수 를 제공 하여 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