Estou pensando em mudar um projeto de plataforma cruzada de sistemas separados de gerenciamento de compilação no Visual C ++, XCode e makefiles para o CMake.
Um recurso essencial que preciso é adicionar automaticamente todos os arquivos em um diretório a um destino. Embora isso seja fácil de fazer com make, não é possível com o Visual C ++ e o XCode (corrija-me se estiver errado). É possível fazer isso diretamente no CMake? Quão?
c++
cross-platform
cmake
martjno
fonte
fonte
Respostas:
É possível. Por exemplo, com
file(GLOB
:Observe que isso requer nova execução manual de
cmake
se um arquivo de origem for adicionado ou removido, pois o sistema de compilação gerado não sabe quando pedir ao CMake para se regenerar, e fazê-lo a cada compilação aumentaria o tempo de compilação.fonte
GLOB
:file(GLOB_RECURSE variable [RELATIVE path] [FOLLOW_SYMLINKS] [globbing expressions]...)
.A resposta de Kleist certamente funciona, mas há uma ressalva importante:
Quando você escreve um
Makefile
manualmente, você pode gerar umaSRCS
variável usando uma função para selecionar todos.cpp
e.h
arquivos. Se um arquivo de origem for adicionado posteriormente, a reexecuçãomake
o incluirá.No entanto, o CMake (com um comando como
file(GLOB ...)
) irá gerar explicitamente uma lista de arquivos e colocá-la na geração automáticaMakefile
. Se você tiver um novo arquivo de origem, precisará gerarMakefile
novamente, reexecutandocmake
.editar: Não há necessidade de remover o Makefile.
fonte
Extensão para a resposta @Kleist :
Desde o CMake 3.12, a opção adicional CONFIGURE_DEPENDS é suportada pelos comandos
file(GLOB)
efile(GLOB_RECURSE)
. Com esta opção não existe nenhuma necessidade para manualmente CMake re-executar após a adição / exclusão de um arquivo de origem no diretório - CMake serão automaticamente na próxima construção do projeto re-run.No entanto, a opção CONFIGURE_DEPENDS implica que o diretório correspondente seja verificado novamente toda vez que a construção for solicitada, portanto, o processo de construção consumiria mais tempo do que sem CONFIGURE_DEPENDS .
Mesmo com a opção CONFIGURE_DEPENDS disponível, a documentação do CMake ainda não recomenda o uso
file(GLOB)
oufile(GLOB_RECURSE)
a coleta de fontes.fonte
file(GLOB)
oufile(GLOB_RECURSE)
a coleta de fontes" O que eles recomendam então? Usando outra coisa para coletar as fontes ou listar manualmente todos os arquivos de origem?Então, por que não usar o powershell para criar a lista de arquivos de origem para você. Dê uma olhada neste script
Suponha que você tenha uma pasta com essa estrutura
Agora salve este arquivo como "generateSourceList.ps1", por exemplo, e execute o script como
O arquivo out.txt conterá
fonte