CMake 출력을 지우는 'cmake clean'명령 찾기
것처럼 make clean
삭제 메이크가 생산하고있는 모든 파일, 내가 CMake와 같은 일을하고 싶습니다. 모든 너무 자주 나 자신이 수동으로 같은 파일을 제거 디렉토리를 통과 발견 cmake_install.cmake
하고 CMakeCache.txt
, 그리고 CMakeFiles
폴더.
cmake clean
이러한 모든 파일을 자동으로 제거하는 것과 같은 명령 이 있습니까? 이상적으로는 현재 디렉토리 CMakeLists.txt
파일에 정의 된 재귀 구조를 따라야 합니다.
없습니다 cmake clean
.
나는 보통 "build"와 같은 단일 폴더에 프로젝트를 빌드합니다. 내가 원한다면 make clean
그냥 할 수 있습니다 rm -rf build
.
루트 "CMakeLists.txt"와 동일한 디렉토리에있는 "build"폴더가 일반적으로 적합합니다. 프로젝트를 빌드하려면 cmake에 CMakeLists.txt의 위치를 인수로 지정하면됩니다. 예를 들면 다음과 같습니다 cd <location-of-cmakelists>/build && cmake ..
.. (@ComicSansMS에서)
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
소스 제어하에 있지 않은 모든 파일을 제거합니다.
나는 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 생성기) .
:)
다음과 같은 것을 사용할 수 있습니다.
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
하는 것도 저에게 효과적입니다.
소스 외부 빌드가 최선의 답변이라는 데 동의합니다. 그러나 소스 빌드를해야 할 때 여기 에 사용할 수있는 Python 스크립트를 작성했습니다 .
- "깨끗하게"실행
- CMakeCache.txt와 같은 최상위 디렉토리에서 특정 CMake 생성 파일을 제거합니다.
- CMakeFiles 디렉토리를 포함하는 각 서브 디렉토리에 대해 CMakeFiles, Makefile, cmake_install.cmake를 제거합니다.
- 빈 하위 디렉토리를 모두 제거합니다.
내가 최근에 찾은 해결책은 소스 외부 빌드 개념을 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
작업을 수행하기 전에 디렉토리를 변경합니다. 따라서 using $(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에서 수정되었습니다 .
어쩌면 조금 구식 일지 모르지만 이것이 google 때 첫 번째 히트이므로 다음 cmake clean
을 추가 할 것입니다.
다음과 같이 지정된 대상으로 빌드 디렉토리에서 빌드를 시작할 수 있기 때문에
cmake --build . --target xyz
당신은 물론 실행할 수 있습니다
cmake --build . --target clean
clean
생성 된 빌드 파일에서 대상 을 실행 합니다.
-D
빌드 파일을 생성 할 때 CMake에 매개 변수를 전달 하고 전체 빌드 / 디렉토리를 삭제하지 않으려는 경우 :
빌드 디렉토리에서 CMakeFiles / 디렉토리를 삭제하십시오.
rm -rf CMakeFiles/
cmake --build .
이로 인해 CMake가 다시 실행되고 빌드 시스템 파일이 재생성됩니다. 빌드도 처음부터 시작됩니다.
물론, Out-of-source 빌드는 Unix Makefiles를위한 방법이지만 Eclipse CDT와 같은 다른 생성기를 사용하는 경우 in-source 빌드를 선호합니다. 이 경우 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
디렉토리 에서 빌드 )를 사용할 때 정리를 단순화하기 위해 다음 스크립트를 사용합니다.
$ 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
사용자 정의를 정의하고 정리하기 전에이를 저장하려면 빌드 디렉토리에서 다음을 실행하십시오.
sed -ne '/variable specified on the command line/{n;s/.*/-D \0 \\/;p}' CMakeCache.txt
그런 다음 새 빌드 디렉토리를 작성하거나 이전 빌드 디렉토리를 제거한 후 다시 작성하여 마지막으로 cmake
위의 스크립트에서 얻을 수있는 인수로 실행 하십시오.
당신이 실행하는 경우
cmake .
CMake 파일을 재생성합니다. 예를 들어 * .cc로 선택한 소스 폴더에 새 파일을 추가하는 경우 필요합니다.
이것은 "깨끗한"자체는 아니지만 캐시를 재생성하여 CMake 파일을 "정리"합니다.
그런 목적으로 다음 쉘 스크립트를 사용합니다.
#!/bin/bash
for fld in $(find -name "CMakeLists.txt" -printf '%h ')
do
for cmakefile in CMakeCache.txt cmake_install.cmake CTestTestfile.cmake CMakeFiles Makefile
do
rm -rfv $fld/$cmakefile
done
done
Windows를 사용하는 경우이 스크립트에 Cygwin을 사용하십시오.
cmake --clean-first-CMakeLists.txt-file -B output-dir 경로를 사용하십시오.
--clean-first : 먼저 대상 클린을 빌드 한 다음 빌드하십시오.
청소 만하려면 --target clean을 사용하십시오.
내 쉘 rc 파일 ( .bashrc
, .zshrc
)에 이것을 가지고 있습니다 :
t-cmake-clean() {
local BUILD=$(basename $(pwd))
cd ..
rm -rf $BUILD
mkdir $BUILD && cd $BUILD
}
소스 외부 빌드 에만 사용해야 합니다. build/
이 목적으로 이름 이 지정된 디렉토리가 있다고 가정 해 봅시다 . 그런 다음 그 t-cmake-clean
안에서 도망 가야합니다.
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
'Programing' 카테고리의 다른 글
루트가 아닌 프로세스가 Linux의 "권한있는"포트에 바인딩 할 수있는 방법이 있습니까? (0) | 2020.02.29 |
---|---|
줄 끝에 줄 번호와 적중 횟수를 표시하도록 grep 출력을 어떻게 형식화 할 수 있습니까? (0) | 2020.02.29 |
예외를 일으킨 예외 설명 및 스택 추적을 모두 문자열로 가져옵니다. (0) | 2020.02.29 |
내용으로 div의 높이를 확장하십시오. (0) | 2020.02.29 |
'모듈 가져 오기'또는 '모듈 가져 오기에서'를 사용 하시겠습니까? (0) | 2020.02.29 |