Assim como make clean
exclui todos os arquivos que um makefile produziu, eu gostaria de fazer o mesmo com o CMake. Com demasiada frequência, eu me pego examinando manualmente diretórios, removendo arquivos como cmake_install.cmake
e CMakeCache.txt
, e as CMakeFiles
pastas.
Existe um comando como cmake clean
remover todos esses arquivos automaticamente? Idealmente, isso deve seguir a estrutura recursiva definida no CMakeLists.txt
arquivo do diretório atual .
cd <location-of-cmakelists>/build && cmake ..
O FAQ oficial do CMake declara:
fonte
Nestes dias do Git em todos os lugares, você pode esquecer o CMake e o uso
git clean -d -f -x
, que removerá todos os arquivos que não estão sob controle de origem.fonte
-x
opção embora. Esse é um excelente truque dogit
comércio. Embora eu pessoalmente ainda faça um teste a seco primeirogit clean -d -f -x -n
. De vez em quando, mantenho um arquivo de conveniência que uso para um projeto com a pasta do projeto sobgit
controle, mas não é algo que eu queira compartilhar com outras pessoas, por isso não o façogit add
no projeto. Isso explodiria esse tipo de arquivo, se eu não tivesse o cuidado de adicionar uma-e <pattern>
opção. Nessa nota, seria bom segit
tivesse um.gitcleanignore
arquivo. :)chattr +i $filename
(precisa de permissões de root, não permite modificar o arquivo depois disso). Dessa forma, o git não será capaz de remover esse arquivo, mesmo que tente fazê-lo dessa maneirarm -f
.git add
?Pesquisei no Google por meia hora e a única coisa útil que surgiu foi invocar o
find
utilitário:Além disso, não se esqueça de invocar
make clean
(ou qualquer outro gerador de CMake que você esteja usando) antes disso.:)
fonte
rm -rf CMakeFiles ; rm -rf */CMakeFiles ; rm -rf */*/CMakeFiles ; rm -rf */*/*/CMakeFiles
e ainda não foi feito ...Você pode usar algo como:
Normalmente, crio um comando "make clean-all" adicionando uma chamada para "make clean" no exemplo anterior:
Não tente adicionar o destino "limpo" como uma dependência:
Porque "limpo" não é um alvo real no CMake e isso não funciona.
Além disso, você não deve usar esses "arquivos de limpeza limpa" como dependência de qualquer coisa:
Porque, se você fizer isso, todos os arquivos do CMake serão apagados antes da limpeza completa, e o make exibirá um erro ao pesquisar "CMakeFiles / clean-all.dir / build.make". Consequentemente, você não pode usar o comando limpar tudo antes de "qualquer coisa" em qualquer contexto:
Isso também não funciona.
fonte
Simplesmente emitir
rm CMakeCache.txt
obras para mim também.fonte
cmake /build-path
novamente.Talvez esteja um pouco desatualizado, mas como esse é o primeiro hit quando você pesquisa no Google
cmake clean
, adicionarei isso:Como você pode iniciar uma construção no diretório de construção com um destino especificado com
cmake --build . --target xyz
você pode, é claro, correr
cmake --build . --target clean
para executar o
clean
destino nos arquivos de construção gerados.fonte
Concordo que a compilação fora da fonte é a melhor resposta. Mas para os momentos em que você apenas precisa fazer uma compilação na fonte, escrevi um script Python disponível aqui , que:
fonte
make
quando não há umMakefile
presente devido a uma limpeza anterior (ou seja, torna esse script idempotente). Basta adicionar a linha (espaçada corretamente):if os.path.isfile(os.path.join(directory,'Makefile')):
logo antes da linha 24:args = [
e, é claro, recuar o restante do corpo da função após a linha ter sido adicionada. Isso somente executará amake ... clean
se aMakefile
estiver presente no diretório atual que está sendo limpo. Caso contrário, o script é perfeito!Uma solução que encontrei recentemente é combinar o conceito de compilação fora da fonte com um wrapper Makefile.
No meu arquivo CMakeLists.txt de nível superior, incluo o seguinte para evitar compilações na fonte:
Em seguida, crio um Makefile de nível superior e incluo o seguinte:
O destino padrão
all
é chamado digitandomake
e chama o destino./build/Makefile
.A primeira coisa que o destino
./build/Makefile
faz é criar obuild
diretório usando$(MKDIR)
, que é uma variávelmkdir -p
. O diretóriobuild
é onde executaremos nossa compilação fora da fonte. Nós fornecemos o argumento-p
para garantir quemkdir
não nos grite por tentar criar um diretório que já possa existir.A segunda coisa que o destino
./build/Makefile
faz é alterar os diretórios para obuild
diretório e invocarcmake
.De volta ao
all
destino, chamamos$(MAKE) -C build
, onde$(MAKE)
é uma variável Makefile gerada automaticamentemake
.make -C
altera o diretório antes de fazer qualquer coisa. Portanto, usar$(MAKE) -C build
é equivalente a fazercd build; make
.Para resumir, chamar esse wrapper Makefile com
make all
oumake
é equivalente a:O destino
distclean
chamacmake ..
emake -C build clean
, por fim, remove todo o conteúdo dobuild
diretório. Acredito que isso é exatamente o que você solicitou na sua pergunta.A última parte do Makefile avalia se o destino fornecido pelo usuário é ou não
distclean
. Caso contrário, ele mudará os diretórios parabuild
antes de invocá-lo. Isso é muito poderoso, porque o usuário pode digitar, por exemplomake clean
, eo Makefile transformará isso em um equivalente acd build; make clean
.Concluindo, esse wrapper Makefile, em combinação com uma configuração obrigatória de CMake de compilação de origem, faz com que o usuário nunca precise interagir com o comando
cmake
. Essa solução também fornece um método elegante para remover todos os arquivos de saída do CMake dobuild
diretório.PS No Makefile, usamos o prefixo
@
para suprimir a saída de um comando shell, e o prefixo@-
para ignorar erros de um comando shell. Ao usarrm
como parte dodistclean
destino, o comando retornará um erro se os arquivos não existirem (eles podem já ter sido excluídos usando a linha de comandorm -rf build
ou nunca foram gerados). Este erro de retorno forçará nosso Makefile a sair. Usamos o prefixo@-
para impedir isso. É aceitável se um arquivo já tiver sido removido; queremos que o nosso Makefile continue e remova o resto.Outro ponto a ser observado: esse Makefile pode não funcionar se você usar um número variável de variáveis do CMake para criar seu projeto, por exemplo,
cmake .. -DSOMEBUILDSUSETHIS:STRING="foo" -DSOMEOTHERBUILDSUSETHISTOO:STRING="bar"
. Esse Makefile pressupõe que você invoque o CMake de maneira consistente, digitandocmake ..
ou fornecendocmake
um número consistente de argumentos (que você pode incluir no Makefile).Finalmente, credite onde o crédito é devido. Esse wrapper Makefile foi adaptado do Makefile fornecido pelo C ++ Application Project Template .
fonte
Obviamente, as compilações fora da fonte são o método obrigatório para Makefiles do Unix, mas se você estiver usando outro gerador como o Eclipse CDT, ele prefere que você construa na fonte. Nesse caso, você precisará limpar os arquivos do CMake manualmente. Tente o seguinte:
Ou, se você ativou a globstar
shopt -s globstar
, tente esta abordagem menos repugnante:fonte
build
. Demorou um tempo pouco mais do que os comandos, mas eu tinha que fazer isso apenas uma vez :)tente usar: cmake --clean-first path-of-CMakeLists.txt-file -B output-dir
--clean-first: constrói o destino limpo primeiro e depois constrói.
(Para limpar apenas, use --target clean.)
fonte
No caso em que você passa
-D
parâmetros para o CMake ao gerar os arquivos de compilação e não deseja excluir o diretório / compilação inteiro:Simplesmente exclua o diretório CMakeFiles / dentro do diretório de compilação.
Isso faz com que o CMake seja executado novamente e os arquivos do sistema de compilação são regenerados. Sua compilação também começará do zero.
fonte
Para simplificar a limpeza ao usar a compilação "fora da fonte" (ou seja, você compila no
build
diretório), eu uso o seguinte script:Toda vez que você precisar limpar, você deve obter este script no
build
diretório:fonte
cd .. ; rm ; mkdir ; cd
sequência porcd .. ; rm -rf build/*
.Se você possui definições personalizadas e deseja salvá-las antes da limpeza, execute o seguinte no diretório de construção:
Em seguida, crie um novo diretório de construção (ou remova o diretório de construção antigo e recriá-lo) e, finalmente, execute
cmake
os argumentos que você obterá com o script acima.fonte
Se você correr
ele irá regenerar os arquivos do CMake. Isso é necessário se você adicionar um novo arquivo a uma pasta de origem selecionada por * .cc, por exemplo.
Embora isso não seja "limpo", ele "limpa" os arquivos do CMake, regenerando os caches.
fonte
Eu uso o seguinte script de shell para tais propósitos:
Se você estiver usando o Windows, use o Cygwin para este script.
fonte
É engraçado ver que essa pergunta recebe muitas atenções e soluções complicadas, o que realmente mostra uma dor por não ter um método limpo com o cmake.
Bem, você pode definitivamente
cd build
fazer o seu trabalho e depois fazerrm -rf *
a limpeza. No entanto,rm -rf *
é um comando perigoso, pois muitas pessoas geralmente não sabem em que diretório estão.Se você
cd ..
, derm -rf build
vez emmkdir build
quandocd build
, é muita digitação.Portanto, uma boa solução é ficar de fora da pasta de compilação e dizer ao cmake o caminho:
para configurar:
cmake -B build
para compilar:
cmake --build build
para limpar:
rm -rf build
para recriar a pasta de compilação: você nem precisa
mkdir build
, basta configurá-lo com ocmake -B build
cmakefonte
cmake
cozinha principalmente aMakefile
, pode-se adicionarrm
ao PHONY limpo .Por exemplo,
fonte
Eu tenho isso no meu arquivo shell rc (
.bashrc
,.zshrc
):Você deve usá-lo apenas para compilações fora da fonte. Digamos que você tenha um diretório nomeado
build/
para esse fim. Então você só precisa corrert-cmake-clean
de dentro dele.fonte
Eu usei a resposta de zsxwing com sucesso para resolver o seguinte problema:
Tenho uma fonte que construo em vários hosts (em uma placa Raspberry Pi Linux, em uma máquina virtual VMware Linux etc.)
Eu tenho um script Bash que cria diretórios temporários com base no nome do host da máquina como este:
fonte
Crie um diretório de construção temporário, por exemplo,
build_cmake
,. Portanto, todos os seus arquivos de compilação estarão dentro desta pasta.Em seguida, no seu arquivo principal do CMake, adicione o comando abaixo.
Portanto, durante a compilação, faça
E para limpar faça:
fonte